私の問題と非常によく似た質問が見つかりました:ArcGISまたはQGISでデータフレームをリンクする方法は?。しかし、QGISのソリューションは現在機能していません(Dual Viewプラグインは使用できなくなりました)。
3つのビューを同期したい:
アイデアは、QGIS Print Composerのマスターマップで3つのマップビューを同時に移動することです。
これを行う方法またはプラグインはありますか?
私の問題と非常によく似た質問が見つかりました:ArcGISまたはQGISでデータフレームをリンクする方法は?。しかし、QGISのソリューションは現在機能していません(Dual Viewプラグインは使用できなくなりました)。
3つのビューを同期したい:
アイデアは、QGIS Print Composerのマスターマップで3つのマップビューを同時に移動することです。
これを行う方法またはプラグインはありますか?
回答:
現時点で私が見つけた唯一の方法は、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)
そして結果のテスト:
コードなしで実行するためのちょっとしたヒント。それはアルドの答えよりも効率的ではありませんが、最終的なマップを行うためのものであれば、結局はトリックを行います。マスタービューも必要ありません。重要なのはマップキャンバスの範囲です。
等
別のマップをマスターにする必要がある場合は、他のマップをクリックしてから、「マップキャンバスに範囲を表示」してから、他のマップを設定してください。
特定のビューを後で使用する場合は、空間ブックマークパネルを使用することをお勧めします。選択した範囲にマップキャンバスを設定し、[設定]をクリックして、必要な各スレーブでキャンバスをマップします:)
私は同じ問題を抱えていて、依存マップの式を使用して目的の結果を得ることができました。これは、レイアウト内のすべてのマップの寸法が同じであることを前提としています。
マスターマップにアイテムIDを指定します(例: 'map1'(アイテムプロパティの下部))
各従属マップで、エクステント値のそれぞれに式を追加します。
x_min(map_get(item_variables('map1'), 'map_extent'))
コードは、コンポーザーアイテム 'map1'の変数を取得し、それからジオメトリとして範囲を取得し、最後にジオメトリからx_min値を取得します。x_minをy_min、x_max、y_maxに応じて変更します。
唯一の欠点は、マスターマップを移動するたびに依存マップを更新する必要があることです。エクスポート時には自動的に更新されます。