ลบเส้นภายในรูปหลายเหลี่ยม

Aug 27 2020

ฉันมีสองชั้นชั้นหนึ่งมีเส้นชั้นหนึ่งมีรูปหลายเหลี่ยม ฉันต้องการลบเส้นที่ตกลงมา (มี) ภายในรูปหลายเหลี่ยม ดูเหมือนง่ายมาก แต่ฉันคิดไม่ออกใน 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 ไม่ใช่ตัวเลือกที่ใช้ได้เช่นกันเนื่องจากควรลบเฉพาะบรรทัดเต็มไม่ใช่บางส่วน

คำตอบ

6 BERA Aug 27 2020 at 17:11

คุณสามารถใช้เลือกตามตำแหน่งจากนั้นลบแถวที่เลือกใน 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)
)

ทุกบรรทัดภายในรูปหลายเหลี่ยมจะถูกลบ:

4 geozelot Aug 27 2020 at 18:15

ใช้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)

3 IanTurton Aug 27 2020 at 17:55

เนื่องจากข้อความแสดงข้อผิดพลาดระบุว่าคุณควรส่งคืนคอลัมน์เดียวเท่านั้นดังนั้นลอง:

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ตารางข้อมูลของคุณ

3 CyrilMikhalchenko Aug 27 2020 at 18:30

นี่เป็นอีกสูตรหนึ่งลองดูสิ

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;