在QGIS打印编辑器中同步视图?


10

我发现了一个非常类似于我的问题的问题:如何在ArcGIS或QGIS中链接数据框?。但是QGIS解决方案现在不起作用(Dual View插件不再可用)。

我想同步三个视图:

在此处输入图片说明

这个想法是在QGIS打印编辑器中使用主地图同时移动三个地图视图。

有没有办法做到这一点?

Answers:


2

用于作曲者地图同步的另一种优雅的“无代码”解决方案使用QGIS的内置“概述”机制:

在此处输入图片说明

因此,我们向每个地图窗口添加了一个“主地图框架”概述,该概述应与主地图同步。然后,我们将框架样式设置为“无笔刷/无笔”,并启用“居中居中”。

为了确定子图的比例,我们输入一个Expression值: 在此处输入图片说明

就这样。

非常简单,非常动态!


大!如此简单...出色的工作
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)

和结果测试:

在此处输入图片说明


不要忘记单击左侧的绿色刻度线以表明您的问题已得到解决,以接受您的回答:)
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

@ Ubuntu 16.04上的@aldo_tapia QGIS 3.0.3
Leak_my_brain

很奇怪,我不能让它运行。。。
aldo_tapia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.