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?

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


Itu memecahkan masalah dengan sangat rapi. Terima kasih terima kasih! DISTINCT ONbaru bagi saya - sangat berguna dalam konteks ini.
Hugh Stimson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.