Poligon içindeki çizgileri sil
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
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:
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 .
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 .
İş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;