QGIS Print Composerでビューを同期していますか?


10

私の問題と非常によく似た質問が見つかりました:ArcGISまたはQGISでデータフレームをリンクする方法は?。しかし、QGISのソリューションは現在機能していません(Dual Viewプラグインは使用できなくなりました)。

3つのビューを同期したい:

ここに画像の説明を入力してください

アイデアは、QGIS Print Composerのマスターマップで3つのマップビューを同時に移動することです。

これを行う方法またはプラグインはありますか?

回答:


2

composerマップの同期のためのもう1つのエレガントな「コードなし」ソリューションは、QGISの組み込みの「概要」メカニズムを使用します。

ここに画像の説明を入力してください

そのため、マスターマップと同期する必要があるすべてのマップウィンドウに「マスターマップフレーム」の概要を追加します。次に、フレームスタイルを[ブラシなし/ペンなし]に設定し、[概要の中心]を有効にします。

子マップの縮尺を修正するには、式の値を入力します。 ここに画像の説明を入力してください

それで全部です。

とても簡単でダイナミックです!


すごい!とてもシンプル...優れた回避

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
@ジョセフありがとう、半分解決されました。これをプラグインで変換して完全なソリューションを提供した後、私は自分の答えを受け入れます。それでも私にとっては挑戦
aldo_tapia 2017年

2

コードなしで実行するためのちょっとしたヒント。それはアルドの答えよりも効率的ではありませんが、最終的なマップを行うためのものであれば、結局はトリックを行います。マスタービューも必要ありません。重要なのはマップキャンバスの範囲です。

  1. マップAを必要に応じて移動します(マスターマップになります)。
  2. 「地図のキャンバスに範囲を表示」をクリックします
  3. マップBに切り替え
  4. 「キャンバスの範囲をマップするように設定」をクリックします
  5. マップCに切り替え
  6. 「キャンバスの範囲をマップするように設定」をクリックします

マップキャンバスビュー/範囲

別のマップをマスターにする必要がある場合は、他のマップをクリックしてから、「マップキャンバスに範囲を表示」してから、他のマップを設定してください。

特定のビューを後で使用する場合は、空間ブックマークパネルを使用することをお勧めします。選択した範囲にマップキャンバスを設定し、[設定]をクリックして、必要な各スレーブでキャンバスをマップします:)


はい、以前はこの方法で行っていました。偉大なオプションですが、マップBとCでのスケールは常に変化するので、2つのステップがあります
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.