我发现了一个非常类似于我的问题的问题:如何在ArcGIS或QGIS中链接数据框?。但是QGIS解决方案现在不起作用(Dual View插件不再可用)。
我想同步三个视图:
这个想法是在QGIS打印编辑器中使用主地图同时移动三个地图视图。
有没有办法做到这一点?
我发现了一个非常类似于我的问题的问题:如何在ArcGIS或QGIS中链接数据框?。但是QGIS解决方案现在不起作用(Dual View插件不再可用)。
我想同步三个视图:
这个想法是在QGIS打印编辑器中使用主地图同时移动三个地图视图。
有没有办法做到这一点?
Answers:
我目前发现它的唯一方法是在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的答案要低,但如果要制作最终地图,最终就可以解决问题。您也不需要拥有主视图,这是地图画布范围的关键:
等等
当您需要另一个地图作为母版时,只需在设置其他地图之前单击其他地图,然后单击“地图画布中的视图范围”即可。
如果您想保留特定的视图以备后用,建议您使用“空间”书签面板。将地图画布设置为选定的范围,然后在需要的每个从属中单击“设置为地图画布:”
我只是遇到了同样的问题,并且能够使用从属映射上的表达式来获得所需的结果。假定所有地图在布局中具有相同的尺寸。
给您的主地图一个商品ID,例如'map1'(在商品属性的底部)
在每个从属图上,向每个范围值添加一个表达式:
x_min(map_get(item_variables('map1'), 'map_extent'))
该代码将获取作曲者项“ map1”的变量,从中获取范围作为几何,最后从几何中获取其x_min值。相应地将x_min更改为y_min,x_max和y_max。
唯一的缺点是,每次移动主地图时都需要刷新从属地图。在导出时,它应该会自动更新。