Xóa các dòng trong đa giác

Aug 27 2020

Tôi có hai lớp, một với các đường, một với các đa giác. Tôi muốn xóa các dòng nằm hoàn toàn (chứa) trong các đa giác. Nó có vẻ thực sự đơn giản, nhưng tôi không thể tìm ra điều này trong PostgreSQL / PostGIS hoặc QGIS.

Đối với SQL tôi đang thử:

delete from lines_test2
 where ( select a.geom, b.geom
 from lines_test2 a, straten b
 where st_intersects(a.geom, b.geom));

Nhưng nó mang lại cho tôi lỗi: 'truy vấn con chỉ được trả về một cột'. Cắt trong QGIS cũng không phải là một lựa chọn khả thi, vì nó chỉ nên xóa toàn bộ các dòng chứ không phải các phần của chúng.

Trả lời

6 BERA Aug 27 2020 at 17:11

Bạn có thể sử dụng Chọn theo vị trí, sau đó xóa các hàng đã chọn trong QGIS hoặc tham gia bằng bên trong:

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)
)

Tất cả các dòng trong đa giác đều bị xóa:

4 geozelot Aug 27 2020 at 18:15

Sử dụng một EXISTSbiểu thức:

DELETE
FROM   <lines> AS ln
WHERE  EXISTS (
  SELECT 1
  FROM   <poly> AS pl
  WHERE  ST_Within(ln.geom, pl.geom)
);

Nếu ST_Withinkiểm tra đạt đến đầu tiên TRUE(chọn một sự thật 1), truy vấn phụ sẽ kết thúc đối với hàng hiện tại (bất kể có nhiều hơn một lần truy cập hay không).

Đây là một trong những cách hiệu quả nhất khi một bảng phải được duyệt theo hàng (như trong một UPDATE/DELETE), hoặc so sánh với một lựa chọn trước (ví dụ ids).

3 IanTurton Aug 27 2020 at 17:55

Vì thông báo lỗi cho biết bạn chỉ nên trả về một cột duy nhất, vì vậy hãy thử:

delete from lines_test2
 where id = ( select a.id
 from lines_test2 a, straten b
 where st_intersects(a.geom, b.geom));

Điều này giả sử bạn có một cột ID duy nhất trong lines_test2bảng dữ liệu của mình .

3 CyrilMikhalchenko Aug 27 2020 at 18:30

Đây là một công thức khác, hãy thử có thể thích nó 🙂

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;