Hapus garis dalam poligon

Aug 27 2020

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

6 BERA Aug 27 2020 at 17:11

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:

4 geozelot Aug 27 2020 at 18:15

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

3 IanTurton Aug 27 2020 at 17:55

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 .

3 CyrilMikhalchenko Aug 27 2020 at 18:30

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;