ฉันกำลังพยายามใช้ ST_Difference เพื่อสร้างชุดรูปหลายเหลี่ยม (การประมวลผล trimmedparcelsnew) ที่ไม่มีพื้นที่ใด ๆ ที่ครอบคลุมโดยรูปหลายเหลี่ยมชุดอื่น (test.single_geometry_1) โดยใช้ PostGis 2.1 (และ Postgres SQL 9.3) นี่คือคำถามของฉัน:
CREATE TABLE processing.trimmedparcelsnew AS
SELECT
orig.id, ST_Difference(orig.geom, cont.geom) AS difference
FROM
test.single_geometry_1 cont,
test.multi_geometry_1 orig;
แต่รูปหลายเหลี่ยมที่เกิดขึ้นยังไม่ได้ถูกตัดแต่ง แต่ดูเหมือนว่าจะถูกแยกออกจากกันโดยที่พวกมันตัดกับเลเยอร์อื่น ฉันลองใช้ตัวเลือกโดยไม่ใส่ผลลัพธ์ลงในตารางและทุกอย่างอื่นที่ฉันสามารถนึกได้ แต่ดูเหมือนว่าฉันจะไม่สามารถใช้ฟังก์ชันนี้ได้
ฉันแนบรูปภาพผลลัพธ์แล้ว
หลังจากความคิดเห็นฉันได้ลองเพิ่มส่วนคำสั่ง WHERE แล้ว ฉันต้องการพัสดุที่ไม่มีทางแยกและบริเวณที่ตัดกันของพัสดุอื่นถูกลบ (layer test.single_geometry แสดงถึงการปนเปื้อนที่ฉันต้องการลบออกจากพัสดุของฉัน) ฉันลองทางแยก แต่แน่นอนว่าฉันต้องการทางแยกที่ไม่ใช่จริงดังนั้นตอนนี้ฉันจึงลองแยกกัน ฉันได้ลองเพิ่มต้นกำเนิดลงในตารางของฉันแล้ว แต่เอกสารสำหรับ ST_Difference ( http://postgis.net/docs/ST_Difference.html ) นั้นบอกว่ามันคืนค่าเรขาคณิตที่แน่นอนที่ฉันต้องการ (เรขาคณิตที่แสดงถึงส่วนหนึ่งของเรขาคณิต A ที่ ไม่ตัดกับเรขาคณิต B) ดังนั้นฉันจึงสับสนว่าทำไมฉันจึงต้องการรูปหลายเหลี่ยมต้นฉบับในตารางของฉันแทน อย่างไรก็ตามนี่คือรหัสการแก้ไขของฉัน:
CREATE TABLE processing.trimmedparcelsnew AS
SELECT
orig.id, ST_Difference(orig.geom, cont.geom) AS difference, orig.geom AS geom
FROM
test.single_geometry_1 cont,
test.multi_geometry_1 orig
WHERE ST_Disjoint(orig.geom, cont.geom);
ต่อไปนี้จากคำตอบของ dbaston ฉันได้ลองแล้ว:
CREATE TABLE processing.parcels_trimmed AS
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.single_geometry_1 b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.multi_geometry_1 a;
ผลลัพธ์ของสิ่งนี้เป็นเพียงสำเนาของ test.multi_geometry_1 แม้ว่าตอนนี้การแยกจะไม่เกิดขึ้นอีกต่อไป
ฉันลองรุ่นก่อนหน้านี้ แต่ได้รับสำเนาของ test.multi_geometry_1 อีกครั้ง:
CREATE TABLE processing.parcels_trimmed_no_coalesce AS
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.single_geometry_1 b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.multi_geometry_1 a;
ฉันเริ่มสงสัยว่ามีสิ่งอื่นที่ฉันทำผิดหรือเปล่า? คำสั่งการดำเนินการคือ:
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
และฉันกำลังเรียกใช้แบบสอบถามจากหน้าต่างแบบสอบถาม PostgreSQL SQL และ Openjump
คำสั่งที่ฉันใช้เพื่อดูตารางคือ:
SELECT * FROM processing.parcels_trimmed_no_coalesce;
เพื่อประโยชน์ในการทำให้เข้าใจง่ายฉันได้ลดแบบสอบถามนี้ลงเหลือเพียงแค่:
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.geometriestocutagainst b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.geometriestocut a;
สิ่งนี้ยังคงให้ผลลัพธ์เป็นรูปหลายเหลี่ยมดั้งเดิมเท่านั้น (test.geometriestocut) เมื่อผลลัพธ์ที่ต้องการนั้นถูกตัดแต่งแบบดั้งเดิมเทียบกับ test.geometriestocutagainst
WHERE
ประโยคดังนั้นคุณอาจมีการขยายพหุนามในตารางผลลัพธ์ วิธีการหลายแถวอยู่ในtrimmedparcelsnew
?