Синхронізація поглядів у композиторі друку QGIS?


10

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

Я хочу синхронізувати три види:

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

Ідея полягає в тому, щоб перемістити три види карти одночасно з головною картою у композиторі друку QGIS.

Чи існує спосіб або плагін для цього?

Відповіді:


2

Ще одне елегантне рішення "без коду" для синхронізації карт композиторів використовує вбудований механізм "Огляд" QGIS:

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

Для цього ми додаємо огляд "Master Map Frame" до кожного вікна карти, яке має бути синхронізовано з основною картою. Потім ми встановлюємо стиль кадру на No Brush / No Pen і включаємо "Центр огляду".

Щоб виправити масштаб дочірньої карти, вводимо значення вираження: введіть тут опис зображення

Це все.

Дуже легко і дуже динамічно!


Чудово! Така проста ... чудова робота навколо
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)

І отриманий тест:

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


Не забудьте прийняти свою відповідь, натиснувши на зів’ялу галочку ліворуч, щоб показати, що ваша проблема вирішена :)
Йосип

1
@Joseph спасибі, але вирішено наполовину. Після конвертації у плагін я прийму власну відповідь, щоб забезпечити повне рішення. Все ж виклик для мене
aldo_tapia

2

Лише невелика порада зробити це без коду. Це менш ефективно, ніж відповідь Альдо, але він робить трюк в кінці кінців, якщо це робити остаточну карту. Вам також не потрібно мати головного перегляду, так вважається розмір полотна на карті:

  1. Перемістіть карту А за своїм бажанням (це буде головна карта)
  2. Клацніть на "Переглянути масштаб на полотні карти"
  3. Переключіться на карту B
  4. Натисніть "Встановити для відображення розміру полотна"
  5. Переключіться на карту C
  6. Натисніть "Встановити для відображення розміру полотна"

тощо.

карта / розмір полотна карти

Якщо вам потрібна інша карта, щоб бути майстром, просто натисніть на іншу карту, а потім "перегляньте масштаби на полотні карти", перш ніж встановлювати інші.

Якщо ви хочете зберегти певний вигляд для подальшого, я рекомендую вам використовувати панель просторових закладок. Встановіть карту карти на обраний розмір, а потім натисніть кнопку Встановити, щоб відобразити канву у кожному потрібному вам підлеглому :)


Так, я раніше так робив. Це чудовий варіант, але масштаби на картах B і C завжди змінюються, тому є ще два кроки
aldo_tapia

приємна ваша відповідь, мені потрібно спробувати ^^
gisnside

2

Я просто мав ту саму проблему і зміг отримати бажаний результат, використовуючи вирази на залежних картах. Це передбачає, що всі карти мають однакові розміри в макеті.

  1. Надайте основній карті ідентифікатор елемента, наприклад, "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

@aldo_tapia QGIS 3.0.3 в Ubuntu 16.04
leak_my_brain

Дивно, я не можу змусити його бігати ... Але нагороджений!
aldo_tapia
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.