Xóa các dòng trong đa giác
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
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:
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).
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 .
Đâ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;