Ansichten in QGIS Print Composer synchronisieren?


10

Ich habe eine Frage gefunden, die meinem Problem sehr ähnlich ist: Wie verknüpfe ich Datenrahmen in ArcGIS oder QGIS? . Die Lösung für QGIS funktioniert jetzt jedoch nicht (das Dual View-Plug-In ist nicht mehr verfügbar).

Ich möchte drei Ansichten synchronisieren:

Geben Sie hier die Bildbeschreibung ein

Die Idee ist, die drei Kartenansichten gleichzeitig mit einer Masterkarte in QGIS Print Composer zu verschieben.

Gibt es eine Möglichkeit oder ein Plug-In, um dies zu tun?

Antworten:


2

Eine andere elegante "No-Code" -Lösung für die Synchronisation von Composer-Maps verwendet den integrierten "Übersicht" -Mechanismus von QGIS:

Geben Sie hier die Bildbeschreibung ein

Daher fügen wir jedem Kartenfenster eine Übersicht "Master Map Frame" hinzu, die mit der Master Map synchronisiert werden soll. Dann setzen wir den Rahmenstil auf Kein Pinsel / Kein Stift und aktivieren "Übersicht zentrieren".

Um den Maßstab der untergeordneten Zuordnung festzulegen, geben wir einen Ausdruckswert ein: Geben Sie hier die Bildbeschreibung ein

Das ist alles.

Sehr einfach und sehr dynamisch!


Groß! So einfach ... ausgezeichnete Arbeit um
aldo_tapia

4

Die einzige Möglichkeit, die ich in diesem Moment gefunden habe, um ein kleines Skript in Python zu erstellen, könnte möglicherweise in ein Plugin migriert werden, aber ich habe keine Erfahrung damit.

Ist ein wirklich einfacher Code, der den richtigen Komponisten und die richtigen Karten auswählt:

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())

Eine andere Möglichkeit wäre, den anfänglichen Maßstab in Slave-Karten beizubehalten, um ihn nach dem neuen Umfang festzulegen, wenn Karten unterschiedliche Formen haben, aber in meinem persönlichen Fall war dieser Code ausreichend:

Geben Sie hier die Bildbeschreibung ein

Ich bin offen für Verbesserungen dieser Lösung (ich habe fast keine Erfahrung mit PyQGIS).


Umgang mit unterschiedlichen Ausmaßen und Maßstäben

Der obige Code funktioniert hervorragend mit dem gleichen Ausmaß (und folglich der gleichen Form) und dem gleichen Maßstab. Jetzt habe ich einen Code verbessert, der mit verschiedenen Ausmaßen, Formen und Maßstäben getestet wurde:

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)

Und der daraus resultierende Test:

Geben Sie hier die Bildbeschreibung ein


Vergessen Sie nicht, Ihre Antwort zu akzeptieren, indem Sie auf das grün verblasste Häkchen auf der linken Seite klicken, um anzuzeigen, dass Ihr Problem gelöst wurde :)
Joseph

1
@ Joseph danke, ist aber halb gelöst. Ich akzeptiere meine eigene Antwort, nachdem ich diese in ein Plug-In konvertiert habe, um eine vollständige Lösung bereitzustellen. Immer noch eine Herausforderung für mich
aldo_tapia

2

Nur ein kleiner Tipp, um es ohne Code zu machen. Es ist weniger effizient als Aldos Antwort, aber es macht am Ende den Trick, wenn es darum geht, eine endgültige Karte zu erstellen. Sie müssen auch keine Master-Ansicht haben, es kommt auf die Ausdehnung des Kartenbereichs an:

  1. Verschiebe Karte A wie du willst (es wird die Masterkarte sein)
  2. Klicken Sie auf "Ausdehnung im Kartenbereich anzeigen".
  3. Wechseln Sie zu Karte B.
  4. Klicken Sie auf "Auf Leinwandumfang festlegen".
  5. Wechseln Sie zu Karte C.
  6. Klicken Sie auf "Festlegen der Leinwandausdehnung festlegen".

usw.

Map Canvas Ansicht / Umfang

Wenn Sie eine andere Karte als Master benötigen, klicken Sie einfach auf die andere Karte und dann auf "Ausdehnung im Kartenbereich anzeigen", bevor Sie die anderen festlegen.

Wenn Sie eine bestimmte Ansicht für später behalten möchten, empfehle ich Ihnen, das räumliche Lesezeichenfeld zu verwenden. Stellen Sie die Kartenleinwand in einem ausgewählten Ausmaß ein und klicken Sie dann in jedem Slave, den Sie benötigen, auf Festlegen der Kartenleinwand :)


Ja, das habe ich früher so gemacht. Ist eine großartige Option, aber die Maßstäbe in Karte B und C ändern sich immer, sodass es zwei weitere Schritte gibt
aldo_tapia

nette Antwort von dir, ich muss es versuchen ^^
gisnside

2

Ich hatte gerade das gleiche Problem und konnte das gewünschte Ergebnis mit Ausdrücken auf den abhängigen Karten erzielen. Dies setzt voraus, dass alle Karten im Layout die gleichen Abmessungen haben.

  1. Geben Sie Ihrer Hauptkarte eine Artikel-ID, z. B. 'map1' (am Ende der Artikeleigenschaften).

  2. Fügen Sie auf jeder abhängigen Karte jedem Ausdehnungswert einen Ausdruck hinzu:

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

Der Code erhält die Variablen für das Composer-Element 'map1', die Ausdehnung als Geometrie und schließlich den x_min-Wert aus der Geometrie. Ändern Sie x_min entsprechend in y_min, x_max und y_max.

Der einzige Nachteil ist, dass Sie die abhängigen Karten jedes Mal aktualisieren müssen, wenn Sie die Masterkarte verschieben. Beim Export sollte es jedoch automatisch aktualisiert werden.


Welche Version von QGIS verwenden Sie? Ich habe es in 3.0.2 ohne Erfolg versucht
aldo_tapia

@aldo_tapia QGIS 3.0.3 unter Ubuntu 16.04
leak_my_brain

Seltsam, ich kann es nicht zum Laufen bringen ... Aber positiv bewertet!
Aldo_Tapia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.