Hapus garis dalam poligon
Saya memiliki dua lapisan, satu dengan garis, satu dengan poligon. Saya ingin menghapus garis yang sepenuhnya (berisi) di dalam poligon. Tampaknya sangat sederhana, tetapi saya tidak dapat menemukan yang ini baik di PostgreSQL / PostGIS atau QGIS.
Untuk SQL saya mencoba:
delete from lines_test2
where ( select a.geom, b.geom
from lines_test2 a, straten b
where st_intersects(a.geom, b.geom));
Tapi itu memberi saya kesalahan: 'subquery harus mengembalikan hanya satu kolom'. Clipping di QGIS juga bukan pilihan yang layak, karena itu hanya menghapus baris penuh, bukan sebagian dari mereka.
Jawaban
Anda dapat menggunakan Select By location lalu hapus baris yang dipilih di QGIS atau bergabung dengan:
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)
)
Semua baris di dalam poligon dihapus:
Gunakan EXISTSekspresi:
DELETE
FROM <lines> AS ln
WHERE EXISTS (
SELECT 1
FROM <poly> AS pl
WHERE ST_Within(ln.geom, pl.geom)
);
Jika ST_Withinpemeriksaan mencapai yang pertama TRUE(memilih kebenaran 1), sub-kueri berakhir untuk baris saat ini (tidak peduli jika ada lebih dari satu klik).
Ini adalah salah satu cara paling efisien ketika tabel harus dilintasi oleh baris (seperti dalam sebuah UPDATE/DELETE), atau dibandingkan dengan pemilihan awal (misalnya ids).
Karena pesan kesalahan mengatakan Anda seharusnya hanya mengembalikan satu kolom, jadi coba:
delete from lines_test2
where id = ( select a.id
from lines_test2 a, straten b
where st_intersects(a.geom, b.geom));
Ini mengasumsikan Anda memiliki kolom ID unik di lines_test2tabel data Anda .
Ini resep lain, coba mungkin suka 🙂
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;