隣接ポリゴンのIDを抽出するには?

69 views
Skip to first unread message

田中邦宏

unread,
Nov 18, 2021, 1:43:20 AM11/18/21
to QGIS初心者質問グループ
お世話になります。

1.あるポリゴンに隣接するポリゴンのIDを知るにはどのようにしたら良いでしょ
 うか。
2.レイヤの領域の外周に接するポリゴンのIDを知るにはどうしたら良いでしょうか
  (添付図のグレーで示したポリゴンです)。

各ポリゴンには フィールド計算機で、関数 @row_number により固有のIDを与えてあります。また、すべてのポリゴンは同一レイヤにあります。

QGISのバージョンは3.18、Windows 10 Pro 64bit です。
よろしくお願いします。

Voronoi_example.png

ありた

unread,
Nov 19, 2021, 8:02:45 AM11/19/21
to QGIS初心者質問グループ
こんにちは

「抽出」としてどんな結果を求めているのかによりますが、もっとも解析結果を
そのままシンプルに得る方法として、プロセシングツールの「属性の空間結合」を使い、
ベースレイヤと結合レイヤをともに対象とする同一レイヤを指定します。
今回の目的の場合、空間関係は touches を選択。
結合のタイプとして「マッチした地物ごとに地物を作成(1対多結合)」を選びます。
処理の結果、マッチした分だけ地物(行)ができるので、地物としては当然
同じ形状のポリゴンが多数作成されます。


このほか、プロセシングツールの GDAL ツリー内の「 SQL の実行」を選択し、
SQL 文として下記のような文を入力します。
SELECT A.geom, A.id, GROUP_CONCAT(B.id) AS "B_ids"
FROM INPUT AS A, INPUT AS B
WHERE st_touches(A.geom, B.geom)
GROUP BY A.id;
SQL の方言は SQLite を選択して実行すると、隣接する地物の ID をカンマ区切りで
得ることができます。ただ、結果を視覚で確認するには適していますが、その後
更に分析を行う場合には(カンマ区切りの文字列状態なので)面倒です。
※ no such table: INPUT というエラーログが出た場合は、 INPUT ではなく
 対象レイヤのファイルとしてのレイヤ名(ファイル名)を指定してください。
 一時レイヤの場合は、 INPUT という名前で一時ファイルを作成したのちに
 処理するため、エラーなく通ります。
※ SQL を実行するツールはほかにもありますが、個人的な経験ではどうも
 うまく処理するための使い方がわかっていません。
 また SQL や R 、 Python などで GIS 処理可能でしたら、 QGIS 内のツールから
 ではなく、直接実行すると安定して処理できるためおすすめです。

ありた

unread,
Nov 19, 2021, 8:24:06 AM11/19/21
to QGIS初心者質問グループ
外周に対する検知ですが、まず外周枠を得る必要があります。

・外周枠をもともと別の方法で指定しており既知である場合はそれを利用

・外周枠が長方形状とわかっている場合は、プロセシングツールの「 BBox の出力」を
 レイヤに対して実行し、 boundary box を得ます。

・外周枠の情報が不明な場合、プロセシングツールの「融合 (dissolve)」をレイヤに
 対して実行し、全体の大きなポリゴンを作成します。



その後、外周枠のレイヤに対し「ポリゴンを線に変換」を行います。
そして「場所による抽出」で抽出する地物をもともとのポリゴンレイヤ。比較対象の
レイヤを先程作成した線レイヤとし、空間関係は intersects を選べばよいと思います。

Reply all
Reply to author
Forward
0 new messages