เนื่องจากคุณบอกว่าคุณได้รับกลุ่มของรูปหลายเหลี่ยมที่ตัดกันสำหรับรูปหลายเหลี่ยมแต่ละรูปที่คุณสนใจคุณอาจต้องการสร้างสิ่งที่เรียกว่า "รูปหลายเหลี่ยมซ้อนทับ"
นี่ไม่ใช่สิ่งที่อดัมกำลังทำอยู่ หากต้องการดูความแตกต่างลองดูภาพของจุดตัด ABC นี้:
ฉันเชื่อว่าคำตอบของอดัมจะสร้างรูปหลายเหลี่ยม "AB" ที่ครอบคลุมทั้งพื้นที่ของ "AB! C" และ "ABC" รวมถึงรูปหลายเหลี่ยม "AC" ที่ครอบคลุม "AC! B" และ "ABC" และ " BC "รูปหลายเหลี่ยมนั่นคือ" BC! A "และ" ABC " ดังนั้นรูปหลายเหลี่ยม "AB", "AC" และ "BC" จะซ้อนทับพื้นที่ "ABC" ทั้งหมด
การซ้อนทับรูปหลายเหลี่ยมสร้างรูปหลายเหลี่ยมที่ไม่ทับซ้อนกันดังนั้น AB! C จะเป็นรูปหลายเหลี่ยมหนึ่งและ ABC จะเป็นรูปหลายเหลี่ยมหนึ่งรูป
การสร้างภาพซ้อนทับรูปหลายเหลี่ยมใน PostGIS นั้นค่อนข้างตรงไปตรงมา
โดยทั่วไปมีสามขั้นตอน
ขั้นตอนที่ 1 คือแยก linework [โปรดทราบว่าฉันใช้วงแหวนด้านนอกของรูปหลายเหลี่ยมมันจะซับซ้อนกว่านี้เล็กน้อยถ้าคุณต้องการจัดการรูอย่างถูกต้อง]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
ขั้นตอนที่ 2 คือ "node" the linework (สร้างโหนดที่จุดตัดทุกจุด) บางไลบรารีเช่นJTSมีคลาส "Noder" คุณสามารถใช้ทำสิ่งนี้ได้ แต่ใน PostGIS ฟังก์ชันST_Unionทำเพื่อคุณ:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
ขั้นตอนที่ 3 คือการสร้างรูปหลายเหลี่ยมที่ไม่ทับซ้อนกันซึ่งอาจมาจากทุกบรรทัดที่ทำโดยฟังก์ชันST_Polygonize :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
คุณสามารถบันทึกผลลัพธ์ของแต่ละขั้นตอนเหล่านั้นลงในตาราง temp หรือคุณสามารถรวมพวกมันทั้งหมดไว้ในคำสั่งเดียว:
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
ฉันกำลังใช้ST_Dumpเพราะผลลัพธ์ของ ST_Polygonize เป็นคอลเล็กชันเรขาคณิตและ (ปกติ) สะดวกกว่าที่จะมีตารางที่แต่ละแถวเป็นหนึ่งในรูปหลายเหลี่ยมที่ประกอบกันเป็นรูปหลายเหลี่ยมซ้อนกัน