Supprimer des lignes dans le polygone

Aug 27 2020

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

6 BERA Aug 27 2020 at 17:11

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:

4 geozelot Aug 27 2020 at 18:15

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

3 IanTurton Aug 27 2020 at 17:55

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.

3 CyrilMikhalchenko Aug 27 2020 at 18:30

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;