Bergabung berdasarkan maksimum tumpang tindih di PostGIS / PostGresQL?

11

Saya memiliki dua set poligon dalam dua tabel. Set saling tumpang tindih. Untuk setiap poligon di set A, saya ingin mendapatkan ID poligon di set B yang paling banyak tumpang tindih. Saya menggunakan PostgreSQL dengan ekstensi PostGIS.

Saya tahu cukup banyak tentang SQL untuk mengetahui bahwa Anda hanya dapat bergabung berdasarkan kondisi benar / salah. Jadi ini tidak akan berhasil:

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)))

karena maks () tidak boleh ada dalam klausa ON.

ST_Intersects()adalah tes benar / salah, jadi saya bisa bergabung dengan itu, tetapi poligon di set A sering akan tumpang tindih dengan lebih dari satu poligon di set B, dan saya perlu tahu mana yang paling tumpang tindih . ST_Intersects mungkin hanya mengembalikan ID yang tumpang tindih pertama yang ditemuinya, terlepas dari tingkat tumpang tindih.

Sepertinya ini bisa dilakukan, tapi itu di luar kemampuanku. Adakah pikiran?

Hugh Stimson
sumber

Jawaban:

13

Anda dapat menggunakan sesuatu seperti:

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

Itu:

1) Menghitung ST_Area (ST_Intersection (a.geom, b.geom)) untuk setiap (a, b) pasangan rekaman.

2) Memesannya oleh a.id dan intersect_area ketika a.id sama.

3) Dalam setiap grup a.id yang sama ia mengambil catatan pertama (catatan pertama memiliki intersect_area tertinggi karena memesan pada langkah 2).

Igor Romanchenko
sumber
Itu memecahkan masalah dengan sangat rapi. Terima kasih terima kasih! DISTINCT ONbaru bagi saya - sangat berguna dalam konteks ini.
Hugh Stimson