Poligon içindeki çizgileri sil

Aug 27 2020

Biri çizgili, biri çokgenli iki katmanım var. Çokgenlerin içine tamamen düşen (içeren) çizgileri silmek istiyorum. Gerçekten basit görünüyor, ancak bunu PostgreSQL / PostGIS veya QGIS'de çözemiyorum.

Denediğim SQL için:

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

Ama bana şu hatayı veriyor: 'alt sorgu yalnızca bir sütun döndürmelidir'. QGIS'te kırpma da geçerli bir seçenek değildir, çünkü yalnızca tam satırları silmeli, bunların parçalarını değil.

Yanıtlar

6 BERA Aug 27 2020 at 17:11

Konuma Göre Seç'i kullanabilir ve ardından QGIS'te seçili satırları silebilir veya aşağıdakilerle birleştirebilirsiniz:

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

Poligonların içindeki tüm çizgiler silinir:

4 geozelot Aug 27 2020 at 18:15

Bir EXISTSifade kullanın :

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

Eğer ST_Withinonay birinci vurur TRUE(a truthy seçerek 1), (olursa olsun birden fazla isabet olsaydı) geçerli satır için alt sorgu sonlandırır.

Bu, bir tablonun satır bazında (bir'de olduğu gibi) geçilmesi UPDATE/DELETEveya başka bir şekilde bir ön-seçimle (örneğin ids) karşılaştırılması gerektiğinde en etkili yollardan biridir .

3 IanTurton Aug 27 2020 at 17:55

Hata mesajının dediği gibi, yalnızca tek bir sütun döndürmeniz gerektiği için şunu deneyin:

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

Bu, lines_test2veri tablonuzda benzersiz bir kimlik sütununuz olduğunu varsayar .

3 CyrilMikhalchenko Aug 27 2020 at 18:30

İşte başka bir tarif, beğenmeyi dene 🙂

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;