Синхронизировать представления в QGIS print composer?

10

Я нашел вопрос, очень похожий на мою проблему: как связать кадры данных в ArcGIS или QGIS? , Но решение для QGIS сейчас не работает (плагин Dual View больше не доступен).

Я хочу синхронизировать три представления:

введите описание изображения здесь

Идея состоит в том, чтобы одновременно перемещать три вида карты с помощью мастер-карты в QGIS print composer.

Есть ли способ или плагин для этого?

aldo_tapia
источник

Ответы:

2

Другое элегантное решение «без кода» для синхронизации карт композитора использует встроенный механизм «Обзор» QGIS:

введите описание изображения здесь

Для этого мы добавляем обзор «Основной кадр карты» в каждое окно карты, которое должно быть синхронизировано с основной картой. Затем мы устанавливаем стиль рамки «Без кисти / Без пера» и включаем «Центр по обзору».

Чтобы зафиксировать масштаб дочерней карты, мы вводим значение выражения: введите описание изображения здесь

Это все.

Очень просто и очень динамично!

Christoph
источник
Большой! Так просто ... отличная работа вокруг
aldo_tapia
4

Единственный способ, который я нашел на данный момент, это создать небольшой скрипт на python, возможно, это могло бы переместиться в плагин, но у меня нет опыта в этом.

Это действительно базовый код, выбирающий правильного композитора и карты:

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)

И полученный тест:

введите описание изображения здесь

aldo_tapia
источник
Не забудьте принять свой ответ, щелкнув по зеленоватой
Джозеф,
1
@ Джозеф, спасибо, но это наполовину решено. Я приму свой собственный ответ после преобразования его в плагин, чтобы обеспечить полное решение. Все еще вызов для меня
aldo_tapia
2

Просто небольшой совет, чтобы сделать это без кода. Он менее эффективен, чем ответ Альдо, но, в конце концов, сработает, если он сделает окончательную карту. Вам также не нужно иметь главный вид, это экстент холста карты, который имеет значение:

  1. Переместите карту A по своему желанию (это будет главная карта)
  2. Нажмите «Просмотреть экстент на холсте карты»
  3. Переключиться на карту B
  4. Нажмите «Установить экстент холста карты»
  5. Перейти к карте C
  6. Нажмите «Установить экстент холста на карте»

и т.п.

карта холст вид / экстент

Если вам нужна другая карта, чтобы стать мастером, просто нажмите на другую карту, затем «просмотрите экстент на холсте карты», прежде чем устанавливать другие.

Если вы хотите сохранить определенный вид на будущее, я рекомендую использовать панель пространственных закладок. Установите холст карты на выбранный экстент, затем нажмите «Установить» для отображения холста карты в каждом ведомом устройстве, которое вам нужно :)

gisnside
источник
Да, я делал так. Отличный вариант, но масштабы на
картах
хороший твой ответ, мне нужно попробовать ^^
gisnside
2

У меня была та же проблема, и я смог получить желаемый результат, используя выражения на зависимых картах. Это предполагает, что все карты имеют одинаковые размеры в макете.

  1. Присвойте своей главной карте идентификатор элемента, например, «map1» (в нижней части свойств элемента)

  2. На каждой зависимой карте добавьте выражение к каждому из значений экстента:

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

Код получит переменные для элемента composer 'map1', получит из него экстент в виде геометрии и, наконец, получит значение x_min из геометрии. Измените x_min на y_min, x_max и y_max соответственно.

Единственным недостатком является то, что вам нужно обновлять зависимые карты каждый раз, когда вы перемещаете основную карту. При экспорте он должен обновляться автоматически.

leak_my_brain
источник
Какую версию QGIS вы используете? Я пытался в 3.0.2 без успеха
aldo_tapia
@aldo_tapia QGIS 3.0.3 в Ubuntu 16.04
leak_my_brain
Странно, я не могу заставить его бежать ... Но проголосовал!
aldo_tapia