ฉันกำลังดิ้นรนกับปัญหาสองสามวันและตระหนักว่าหลายคนก็ติดเมื่อหัวข้อเป็นจุดตัดใน PostGIS (v2.5) นั่นเป็นเหตุผลที่ฉันตัดสินใจถามคำถามทั่วไปที่มีรายละเอียดและทั่วไปมากขึ้น
ฉันมีตารางต่อไปนี้:
DROP TABLE IF EXISTS tbl_foo;
CREATE TABLE tbl_foo (
id bigint NOT NULL,
geom public.geometry(MultiPolygon, 4326),
att_category character varying(15),
att_value integer
);
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(1, ST_SetSRID('MULTIPOLYGON (((0 6, 0 12, 8 9, 0 6)))'::geometry,4326) , 'cat1', 2 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(2, ST_SetSRID('MULTIPOLYGON (((5 0, 5 12, 9 12, 9 0, 5 0)))'::geometry,4326), 'cat1', 1 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(3, ST_SetSRID('MULTIPOLYGON (((4 4, 3 8, 4 12, 7 14,10 12, 11 8, 10 4, 4 4)))'::geometry,4326) , 'cat2', 5 );
ดูเหมือนว่านี้:
ฉันต้องการให้รูปหลายเหลี่ยมเด็กทั้งหมดขึ้นอยู่กับจุดตัดของรูปหลายเหลี่ยมแม่ สำหรับผลลัพธ์มันคาดหวัง:
- รูปหลายเหลี่ยมของเด็กโดยไม่ทับซ้อนกัน
- คอลัมน์ที่มีผลรวมของค่าของรูปหลายเหลี่ยมแม่ของพวกเขา
- คอลัมน์ที่มีการนับจำนวนรูปหลายเหลี่ยมหลักของหมวดหมู่เดียว
- คอลัมน์ที่มีการนับหมวดหมู่อื่น
- คอลัมน์ที่มีหมวดหมู่ของรูปหลายเหลี่ยมลูกขึ้นอยู่กับกฎต่อไปนี้: - หากรูปหลายเหลี่ยมแม่ทั้งหมดมาจากชั้นหนึ่งรูปหลายเหลี่ยมเด็กยังมีชั้นนี้ อื่นประเภทของรูปหลายเหลี่ยมเด็กเป็นประเภทที่สาม
ดังนั้นมันดูเหมือนว่า:
ดังนั้นในท้ายที่สุดตารางผลลัพธ์ที่เกิดขึ้น (เช่นนี้) จะมี 7 แถว (ทั้งหมด 7 ไม่ทับซ้อนกันหลายเหลี่ยมเด็ก) ที่มีคอลัมน์ของcategory
, sum_value
, ct_overlap_cat1
,ct_overlap_cat2
รหัสต่อไปนี้ที่ฉันเริ่มให้การแยกแต่ละรายการแก่ฉันเปรียบเทียบผู้ปกครองคนหนึ่งกับอีกคนหนึ่ง
SELECT
(ST_Dump(
ST_SymDifference(a.geom, b.geom)
)).geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom)
UNION ALL
SELECT
ST_Intersection(a.geom, b.geom) as geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom);
ฉันจะวนซ้ำผลลัพธ์ของรหัสที่กล่าวถึงนี้ได้อย่างไรซึ่งเป็นอิสระจากจำนวนของรูปหลายเหลี่ยมที่ทับซ้อนกันฉันจะได้รับ 'รูปหลายเหลี่ยมที่เล็กที่สุด' (เด็ก) รูปหลายเหลี่ยม (รูปที่ 2) เสมอ