Supprimer des lignes dans le polygone
J'ai deux couches, une avec des lignes, une avec des polygones. Je veux supprimer les lignes qui tombent (contiennent) entièrement dans les polygones. Cela semble vraiment simple, mais je ne peux pas comprendre celui-ci dans PostgreSQL / PostGIS ou QGIS.
Pour le SQL que j'essaye:
delete from lines_test2
where ( select a.geom, b.geom
from lines_test2 a, straten b
where st_intersects(a.geom, b.geom));
Mais cela me donne l'erreur: «la sous-requête ne doit renvoyer qu'une seule colonne». Le découpage dans QGIS n'est pas non plus une option viable, car il ne devrait supprimer que des lignes complètes et non des parties d'entre elles.
Réponses
Vous pouvez utiliser Sélectionner par emplacement, puis supprimer les lignes sélectionnées dans QGIS ou rejoindre par dans:
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)
)
Toutes les lignes dans les polygones sont supprimées:
Utilisez une EXISTSexpression:
DELETE
FROM <lines> AS ln
WHERE EXISTS (
SELECT 1
FROM <poly> AS pl
WHERE ST_Within(ln.geom, pl.geom)
);
Si le ST_Withincontrôle atteint le premier TRUE(sélection d'une vérité 1), la sous-requête se termine pour la ligne actuelle (peu importe s'il y a eu plus d'un hit).
C'est l'un des moyens les plus efficaces pour le cas où une table doit être parcourue par ligne (comme dans un UPDATE/DELETE), ou comparée autrement à une présélection (de par exemple ids).
Comme le message d'erreur l'indique, vous ne devez renvoyer qu'une seule colonne, alors essayez:
delete from lines_test2
where id = ( select a.id
from lines_test2 a, straten b
where st_intersects(a.geom, b.geom));
Cela suppose que vous ayez une colonne ID unique dans votre lines_test2table de données.
Voici une autre recette, essayez peut-être comme ça 🙂
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;