Synchronisation des vues dans QGIS print composer?


10

J'ai trouvé une question très similaire à mon problème: comment lier des trames de données dans ArcGIS ou QGIS? . Mais la solution pour QGIS ne fonctionne pas maintenant (le plug-in Dual View n'est plus disponible).

Je souhaite synchroniser trois vues:

entrez la description de l'image ici

L'idée est de déplacer les trois vues de carte en même temps avec une carte principale dans QGIS print composer.

Existe-t-il un moyen ou un plug-in pour le faire?

Réponses:


2

Une autre solution élégante "sans code" pour la synchronisation des cartes de compositeur utilise le mécanisme "Aperçu" intégré de QGIS:

entrez la description de l'image ici

Pour cela, nous ajoutons une vue d'ensemble "Master Map Frame" à chaque fenêtre de carte, qui doit être synchronisée avec la carte principale. Ensuite, nous définissons le style de cadre sur Pas de pinceau / Pas de stylo et activons "Centrer sur l'aperçu".

Pour fixer l'échelle de la carte enfant, nous saisissons une valeur d'expression: entrez la description de l'image ici

C'est tout.

Très simple et très dynamique!


Génial! Si simple ... excellent travail
aldo_tapia

4

Le seul moyen que j'ai trouvé à ce moment pour créer un petit script en python, peut-être que cela pourrait migrer dans un plugin mais je n'ai aucune expérience à ce sujet.

Est un code vraiment basique, sélectionnant le bon compositeur et les bonnes cartes:

from qgis.core import *
from qgis.utils import *

composerList = iface.activeComposers()

comp = composerList[4]

maps = comp.composition().composerMapItems()

masterMap = maps[0]
slave1 = maps[1]
slave2 = maps[4]

slave1.setNewExtent(masterMap.extent())
slave2.setNewExtent(masterMap.extent())

Une autre option serait de maintenir l'échelle initiale dans les cartes esclaves à définir après la nouvelle étendue si les cartes ont des formes différentes, mais dans mon cas personnel avec ce code était suffisant:

entrez la description de l'image ici

Je suis ouvert à l'amélioration de cette solution (je n'ai presque aucune expérience avec PyQGIS).


Faire face à différentes étendues et échelles

Le code ci-dessus fonctionne très bien avec la même étendue (et par conséquent, la forme) et l'échelle. Maintenant, j'ai un code amélioré testé avec différentes étendues, formes et échelles:

from qgis.core import *
from qgis.utils import *

composerList = iface.activeComposers()

comp = composerList[0]

maps = comp.composition().composerMapItems()

masterMap = maps[2]
slave1 = maps[1]
slave2 = maps[0]

centroid = masterMap.extent().center()

diffx1 = slave1.extent().xMaximum() - slave1.extent().xMinimum()
diffy1 = slave1.extent().yMaximum() - slave1.extent().yMinimum()

diffx2 = slave2.extent().xMaximum() - slave2.extent().xMinimum()
diffy2 = slave2.extent().yMaximum() - slave2.extent().yMinimum()

newExtent1 = QgsRectangle(centroid[0]-(diffx1/2),centroid[1]-(diffy1/2),centroid[0]+(diffx1/2),centroid[1]+(diffy1/2))
newExtent2 = QgsRectangle(centroid[0]-(diffx2/2),centroid[1]-(diffy2/2),centroid[0]+(diffx2/2),centroid[1]+(diffy2/2))

slave1.setNewExtent(newExtent1)
slave2.setNewExtent(newExtent2)

Et le test résultant:

entrez la description de l'image ici


N'oubliez pas d'accepter votre réponse en cliquant sur la coche fanée verte sur le côté gauche pour montrer que votre problème a été résolu :)
Joseph

1
@Joseph merci, mais est à moitié résolu. J'accepterai ma propre réponse après l'avoir convertie en plug-in pour fournir une solution complète. Encore un défi pour moi
aldo_tapia

2

Juste un petit conseil pour le faire sans code. C'est moins efficace que la réponse d'Aldo, mais cela fait finalement l'affaire si c'est pour faire une carte finale. Vous n'avez pas non plus besoin d'avoir une vue principale, c'est l'étendue du canevas de carte qui compte:

  1. Déplacez la carte A comme vous le souhaitez (ce sera la carte principale)
  2. Cliquez sur "Afficher l'étendue dans le canevas de carte"
  3. Passer à la carte B
  4. Cliquez sur "Définir pour cartographier l'étendue du canevas"
  5. Passer à la carte C
  6. Cliquez sur "Définir pour cartographier l'étendue du canevas"

etc.

vue / étendue de la carte

Lorsque vous avez besoin d'une autre carte pour être un maître, cliquez simplement sur l'autre carte, puis "afficher l'étendue dans le canevas de carte" avant de définir les autres.

Si vous souhaitez conserver une vue spécifique pour plus tard, je vous recommande d'utiliser le panneau de signets spatiaux. Définissez le canevas de carte dans une mesure choisie, puis cliquez sur Définir pour mapper le canevas dans chaque esclave dont vous avez besoin :)


Oui, je le faisais de cette façon. Est une excellente option, mais les échelles dans les cartes B et C changent toujours, il y a donc deux autres étapes
aldo_tapia

belle réponse, j'ai besoin de l'essayer ^^
gisnside

2

J'ai juste eu le même problème et j'ai pu obtenir le résultat souhaité en utilisant des expressions sur les cartes dépendantes. Cela suppose que toutes les cartes ont les mêmes dimensions dans la mise en page.

  1. Donnez à votre carte principale un ID d'élément, par exemple «map1» (en bas des propriétés de l'élément)

  2. Sur chaque carte dépendante, ajoutez une expression à chacune des valeurs d'étendue:

    x_min(map_get(item_variables('map1'), 'map_extent'))
    

Le code obtiendra les variables de l'élément de compositeur 'map1', obtiendra l'étendue en tant que géométrie et obtiendra finalement sa valeur x_min de la géométrie. Modifiez x_min en y_min, x_max et y_max en conséquence.

Le seul inconvénient est que vous devez actualiser les cartes dépendantes chaque fois que vous déplacez la carte principale. Lors de l'exportation, il devrait cependant se mettre à jour automatiquement.


Quelle version de QGIS utilisez-vous? J'ai essayé en 3.0.2 sans succès
aldo_tapia

@aldo_tapia QGIS 3.0.3 sur Ubuntu 16.04
leak_my_brain

Bizarre, je ne peux pas le faire fonctionner ... Mais voté positivement!
aldo_tapia
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.