PostGIS / PostGresQLの最大オーバーラップに基づいて参加しますか?


11

2つのテーブルに2セットのポリゴンがあります。セットは互いにオーバーラップします。セットAの各ポリゴンについて、最も重なるセットBのポリゴンのIDを取得します。PostGIS拡張機能を備えたPostgreSQLを使用しています。

SQLについては、true / false条件に基づいてしか参加できないことを知っています。したがって、これは機能しません:

SELECT
  a.id as a_id,
  b.id as b_id,
FROM
  a
JOIN
  b
ON
  max(ST_Area(ST_Intersection(a.geom, b.geom)))

max()をON句に含めることはできないためです。

ST_Intersects()は真/偽のテストであるため、それに参加できますが、セットAのポリゴンはセットBの複数のポリゴンと重複することが多く、どれが最も重複するかを知る必要があります。ST_Intersectsは、重複の範囲に関係なく、最初に遭遇した重複IDを単に返すだけです。

これは実行可能であるように思えますが、それは私を超えています。何かご意見は?

回答:


13

次のようなものを使用できます。

SELECT DISTINCT ON (a.id)
  a.id as a_id,
  b.id as b_id,
  ST_Area(ST_Intersection(a.geom, b.geom)) as intersect_area
FROM a, b
ORDER BY a.id, ST_Area(ST_Intersection(a.geom, b.geom)) DESC

それ:

1)レコードの(a、b)ペアごとにST_Area(ST_Intersection(a.geom、b.geom))を計算します。

2)a.idが等しい場合は、a.idで、intersect_areaで並べ替えます。

3)a.idが等しいすべてのグループで、最初のレコードを選択します(ステップ2での順序付けのため、最初のレコードの最も高いintersection_areaがあります)。


それは問題を非常にきれいに解決します。ありがとうありがとう!DISTINCT ONこれは私にとって初めてのことです。この文脈では非常に便利です。
ヒュースティムソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.