QGIS 인쇄 작곡가에서 뷰를 동기화합니까?


10

내 문제와 매우 비슷한 질문을 찾았 습니다. ArcGIS 또는 QGIS에서 데이터 프레임을 연결하는 방법은 무엇입니까? . 그러나 QGIS 용 솔루션은 현재 작동하지 않습니다 (Dual View 플러그인은 더 이상 사용할 수 없음).

세 가지보기를 동기화하고 싶습니다.

여기에 이미지 설명을 입력하십시오

아이디어는 QGIS 인쇄 작곡가의 마스터 맵과 동시에 세 개의 맵 뷰를 이동하는 것입니다.

이를위한 방법이나 플러그인이 있습니까?

답변:


2

작곡가 맵 동기화를위한 또 다른 고급 "코드 없음"솔루션은 QGIS의 내장 된 "개요"메커니즘을 사용합니다.

여기에 이미지 설명을 입력하십시오

이를 위해 모든 맵 창에 "마스터 맵 프레임"개요를 추가합니다.이 맵은 마스터 맵과 동기화되어야합니다. 그런 다음 프레임 스타일을 브러시 없음 / 펜 없음으로 설정하고 "개요 중심"을 활성화합니다.

자식 맵의 스케일을 고정하기 위해 Expression 값을 입력합니다 : 여기에 이미지 설명을 입력하십시오

그게 다야.

매우 쉽고 매우 역동적입니다!


큰! 매우 간단합니다 ... 훌륭한 작업
aldo_tapia

4

내가 지금 파이썬에서 작은 스크립트를 생성하는 유일한 방법은 아마도 플러그인으로 마이그레이션 할 수는 있지만 그 경험은 없습니다.

올바른 작곡가와지도를 선택하는 정말 기본적인 코드입니다.

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

다른 옵션은 맵의 모양이 다른 경우 새 범위 이후에 설정하기 위해 슬레이브 맵의 초기 스케일을 유지하는 것이지만 내 개인적인 경우에는이 코드로 충분합니다.

여기에 이미지 설명을 입력하십시오

이 솔루션을 개선하기 위해 열려 있습니다 (거의 경험이 거의 없습니다 PyQGIS).


다른 범위와 규모로 다루기

위의 코드는 동일한 범위 (및 결과적으로 모양)와 스케일로 훌륭하게 작동합니다. 이제 다양한 범위, 모양 및 스케일로 테스트 된 코드가 향상되었습니다.

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)

그리고 결과 테스트 :

여기에 이미지 설명을 입력하십시오


왼쪽의 초록색 체크 표시를 클릭하여 문제가 해결되었음을 표시하여 답변을 수락하는 것을 잊지 마십시오. :)
Joseph

1
@Joseph 감사하지만 반은 해결되었습니다. 완전한 솔루션을 제공하기 위해 이것을 플러그인으로 변환 한 후에 나 자신의 대답을 받아 들일 것입니다. 여전히 나에게 도전
aldo_tapia

2

코드없이 할 수있는 작은 팁. aldo의 답변보다 덜 효율적이지만 최종지도를 수행하는 경우 결국 트릭을 수행합니다. 마스터 뷰도 필요하지 않습니다. 맵 캔버스 범위는 다음과 같습니다.

  1. 원하는대로 맵 A를 이동하십시오 (마스터 맵이됩니다).
  2. "맵 캔버스에서 범위보기"를 클릭하십시오
  3. 지도 B로 전환
  4. "캔버스 범위를 매핑하도록 설정"을 클릭하십시오
  5. 지도 C로 전환
  6. "캔버스 범위를 매핑하도록 설정"을 클릭하십시오.

기타

캔버스 뷰 / 익스텐트 맵

다른 맵을 마스터로 사용해야하는 경우 다른 맵을 클릭 한 다음 다른 맵을 설정하기 전에 "맵 캔버스에서 범위보기"를 클릭하십시오.

나중에 특정보기를 유지하려면 공간 책갈피 패널을 사용하는 것이 좋습니다. 맵 캔버스를 선택한 범위로 설정 한 다음 필요한 각 슬레이브에서 캔버스를 맵핑하려면 설정을 클릭하십시오. :)


예, 이런 식으로 했어요. 훌륭한 옵션이지만 맵 B와 C의 스케일은 항상 변경되므로 두 단계가 더 있습니다
aldo_tapia

당신의 좋은 대답, 나는 그것을 시도해야합니다 ^^
gisnside

2

방금 동일한 문제가 있었고 종속 맵의 표현식을 사용하여 원하는 결과를 얻을 수있었습니다. 레이아웃에서 모든지도의 크기가 동일하다고 가정합니다.

  1. 마스터 맵에 항목 ID를 지정하십시오 (예 : 'map1'(항목 속성의 맨 아래))

  2. 각 종속 맵에서 각 범위 값에 표현식을 추가하십시오.

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

이 코드는 작곡가 항목 'map1'에 대한 변수를 가져오고 범위를 지오메트리로 가져오고 마지막으로 지오메트리에서 x_min 값을 가져옵니다. x_min을 y_min, x_max 및 y_max로 적절히 변경하십시오.

단점은 마스터 맵을 이동할 때마다 종속 맵을 새로 고쳐야한다는 것입니다. 내보낼 때 자동으로 업데이트됩니다.


어떤 QGIS 버전을 사용하고 있습니까? 내가 성공하지 3.0.2에 시도
aldo_tapia

우분투 16.04에 @aldo_tapia QGIS 3.0.3은
leak_my_brain

이상하게도, 나는 그것을 실행할 수 없습니다 ...하지만 공감!
aldo_tapia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.