ลบเส้นภายในรูปหลายเหลี่ยม
ฉันมีสองชั้นชั้นหนึ่งมีเส้นชั้นหนึ่งมีรูปหลายเหลี่ยม ฉันต้องการลบเส้นที่ตกลงมา (มี) ภายในรูปหลายเหลี่ยม ดูเหมือนง่ายมาก แต่ฉันคิดไม่ออกใน PostgreSQL / PostGIS หรือ QGIS
สำหรับ SQL ฉันกำลังพยายาม:
delete from lines_test2
where ( select a.geom, b.geom
from lines_test2 a, straten b
where st_intersects(a.geom, b.geom));
แต่มันทำให้ฉันมีข้อผิดพลาด: 'subquery must return only one column' การตัดใน QGIS ไม่ใช่ตัวเลือกที่ใช้ได้เช่นกันเนื่องจากควรลบเฉพาะบรรทัดเต็มไม่ใช่บางส่วน
คำตอบ
คุณสามารถใช้เลือกตามตำแหน่งจากนั้นลบแถวที่เลือกใน QGIS หรือเข้าร่วมโดยภายใน:
delete from ok_jl_riks_copy where id in (
select sub1.id from
(select *
from ok_jl_riks_copy jl) sub1
inner join
(select wkb_geometry from ok_ak_riks ak) sub2
on st_within(sub1.wkb_geometry, sub2.wkb_geometry)
)
ทุกบรรทัดภายในรูปหลายเหลี่ยมจะถูกลบ:
ใช้EXISTSนิพจน์:
DELETE
FROM <lines> AS ln
WHERE EXISTS (
SELECT 1
FROM <poly> AS pl
WHERE ST_Within(ln.geom, pl.geom)
);
หากการST_Withinตรวจสอบพบครั้งแรกTRUE(การเลือกความจริง1) การสืบค้นย่อยจะสิ้นสุดลงสำหรับแถวปัจจุบัน (ไม่ว่าจะมี Hit มากกว่าหนึ่งครั้งก็ตาม)
นี่เป็นวิธีที่มีประสิทธิภาพมากที่สุดสำหรับเมื่อตารางต้องข้ามไปตามแถว (เช่นเดียวกับในUPDATE/DELETE) หรือเปรียบเทียบกับการเลือกล่วงหน้า (เช่นids)
เนื่องจากข้อความแสดงข้อผิดพลาดระบุว่าคุณควรส่งคืนคอลัมน์เดียวเท่านั้นดังนั้นลอง:
delete from lines_test2
where id = ( select a.id
from lines_test2 a, straten b
where st_intersects(a.geom, b.geom));
ถือว่าคุณมีคอลัมน์ ID ที่ไม่ซ้ำกันในlines_test2ตารางข้อมูลของคุณ
นี่เป็นอีกสูตรหนึ่งลองดูสิ
SELECT ST_Difference(a.geom, b.geom) AS geom FROM line AS a CROSS JOIN LATERAL (SELECT ST_Collect(geom) AS geom FROM polygon WHERE ST_Intersects(a.geom, geom)) AS b;