เข้าร่วมตามการทับซ้อนสูงสุดใน PostGIS / PostGresQL


11

ฉันมีรูปหลายเหลี่ยมสองชุดในสองตาราง ชุดทับซ้อนกัน สำหรับรูปหลายเหลี่ยมแต่ละอันในชุด A ฉันต้องการรับ ID ของรูปหลายเหลี่ยมในชุด B ที่ซ้อนทับกันมากที่สุด ฉันใช้ PostgreSQL กับส่วนขยาย PostGIS

ฉันรู้เพียงพอเกี่ยวกับ SQL ที่จะรู้ว่าคุณสามารถเข้าร่วมได้ตามเงื่อนไขจริง / เท็จเท่านั้น ดังนั้นสิ่งนี้จะไม่ทำงาน:

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()คือการทดสอบจริง / เท็จดังนั้นฉันสามารถเข้าร่วมในนั้น แต่รูปหลายเหลี่ยมในชุดมักจะทับซ้อนที่มีมากกว่าหนึ่งรูปหลายเหลี่ยมที่อยู่ในชุด 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) คำนวณ ST_Area (ST_Intersection (a.geom, b.geom)) สำหรับทุก ๆ คู่ (a, b) ของบันทึก

2) สั่งซื้อสินค้าโดย a.id และ intersect_area เมื่อ a.id เท่ากัน

3) ในทุกกลุ่มที่เท่ากัน a.id มันจะเลือกเร็กคอร์ด firs (เร็กคอร์ดแรกมี intersect_area สูงสุดเนื่องจากการสั่งซื้อในขั้นตอนที่ 2)


ที่แก้ปัญหาอย่างเรียบร้อย ขอบคุณ! DISTINCT ONยังใหม่สำหรับฉัน - มีประโยชน์มากในบริบทนี้
Hugh Stimson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.