Synchronizujesz widoki w kompozytorze wydruku QGIS?


10

Znalazłem pytanie bardzo podobne do mojego problemu: Jak połączyć ramki danych w ArcGIS lub QGIS? . Ale rozwiązanie dla QGIS nie działa teraz (wtyczka Dual View nie jest już dostępna).

Chcę zsynchronizować trzy widoki:

wprowadź opis zdjęcia tutaj

Chodzi o to, aby przenieść trzy widoki mapy w tym samym czasie za pomocą mapy głównej w kompozytorze wydruku QGIS.

Czy jest na to sposób lub wtyczka?

Odpowiedzi:


2

Inne eleganckie rozwiązanie „bez kodu” do synchronizacji map kompozytora wykorzystuje wbudowany mechanizm „Przegląd” QGIS:

wprowadź opis zdjęcia tutaj

Dlatego dodajemy przegląd „Ramki mapy głównej” do każdego okna mapy, która powinna być zsynchronizowana z mapą główną. Następnie ustawiamy styl ramki na Bez pędzla / Bez pióra i włączamy „Wyśrodkuj przegląd”.

Aby naprawić skalę mapy potomnej, wprowadzamy wartość wyrażenia: wprowadź opis zdjęcia tutaj

To wszystko.

Bardzo łatwe i bardzo dynamiczne!


Świetny! Tak proste ... doskonałe obejście
aldo_tapia

4

Jedynym sposobem, jaki znalazłem w tym momencie, jest stworzenie małego skryptu w pythonie, być może może on migrować do wtyczki, ale nie mam w tym doświadczenia.

To naprawdę podstawowy kod, wybierając odpowiedniego kompozytora i mapy:

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

Inną opcją byłoby utrzymanie początkowej skali w mapach podrzędnych, aby ustawić nowy zasięg, jeśli mapy mają różne kształty, ale w moim osobistym przypadku ten kod wystarczył:

wprowadź opis zdjęcia tutaj

Jestem otwarty na ulepszenie tego rozwiązania (prawie nie mam doświadczenia PyQGIS).


Radzenie sobie z różnymi zakresami i skalami

Powyższy kod działa świetnie z tym samym zakresem (a tym samym kształtem) i skalą. Teraz mam ulepszony kod przetestowany z różnymi zakresami, kształtami i skalami:

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)

I wynikowy test:

wprowadź opis zdjęcia tutaj


Nie zapomnij zaakceptować swojej odpowiedzi, klikając wyblakłe zielone pole wyboru po lewej stronie, aby pokazać, że problem został rozwiązany :)
Joseph

1
@Joseph dzięki, ale jest w połowie rozwiązany. Zaakceptuję własną odpowiedź po przekształceniu jej we wtyczkę, aby zapewnić kompletne rozwiązanie. Nadal dla mnie wyzwanie
aldo_tapia 10.10.17

2

Mała wskazówka, aby to zrobić bez kodu. Jest to mniej wydajne niż odpowiedź aldo, ale robi to w końcu, jeśli chodzi o zrobienie ostatecznej mapy. Nie musisz też mieć widoku głównego, liczy się obszar płótna mapy:

  1. Przesuń mapę A tak, jak chcesz (będzie to mapa główna)
  2. Kliknij „Wyświetl zasięg na kanwie mapy”
  3. Przejdź do mapy B
  4. Kliknij „Ustaw mapowanie zasięgu obszaru roboczego”
  5. Przejdź do mapy C.
  6. Kliknij „Ustaw mapowanie zasięgu obszaru roboczego”

itp.

widok / zasięg płótna mapy

Jeśli potrzebujesz innej mapy, aby zostać mistrzem, po prostu kliknij drugą mapę, a następnie „wyświetl zasięg w obszarze roboczym mapy” przed ustawieniem pozostałych.

Jeśli chcesz zachować określony widok na później, zalecamy skorzystanie z panelu zakładek przestrzennych. Ustaw płótno mapy w wybranym zakresie, a następnie kliknij Ustaw płótno mapy w każdym potrzebnym niewolniku :)


Tak, kiedyś tak robiłem. To świetna opcja, ale skale na mapie B i C zawsze się zmieniają, więc są jeszcze dwa kroki
aldo_tapia

twoja miła odpowiedź, muszę spróbować ^^
gisnside

2

Właśnie miałem ten sam problem i byłem w stanie uzyskać pożądany wynik za pomocą wyrażeń na mapach zależnych. Zakłada się, że wszystkie mapy mają takie same wymiary w układzie.

  1. Podaj swojej mapie głównej identyfikator przedmiotu, np. „Map1” (na dole właściwości przedmiotu)

  2. Na każdej mapie zależnej dodaj wyrażenie do każdej wartości zasięgu:

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

Kod pobierze zmienne dla elementu kompozytora „map1”, pobierze z niego zasięg jako geometrię i na końcu uzyska wartość x_min z geometrii. Zmień odpowiednio x_min na y_min, x_max i y_max.

Jedynym minusem jest to, że musisz odświeżać mapy zależne za każdym razem, gdy przenosisz mapę główną. Podczas eksportu powinien jednak aktualizować się automatycznie.


Z jakiej wersji QGIS korzystasz? Próbowałem w 3.0.2 bez powodzenia
aldo_tapia

@aldo_tapia QGIS 3.0.3 na Ubuntu 16.04
wyciek_my_brain

Dziwne, nie mogę sprawić, żeby działało ... Ale głosowałem pozytywnie!
aldo_tapia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.