Löschen Sie Linien innerhalb des Polygons

Aug 27 2020

Ich habe zwei Ebenen, eine mit Linien, eine mit Polygonen. Ich möchte Linien löschen, die vollständig in die Polygone fallen (diese enthalten). Es scheint wirklich einfach zu sein, aber ich kann dies weder in PostgreSQL / PostGIS noch in QGIS herausfinden.

Für die SQL versuche ich:

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

Aber es gibt mir den Fehler: 'Unterabfrage darf nur eine Spalte zurückgeben'. Das Ausschneiden in QGIS ist ebenfalls keine praktikable Option, da nur vollständige Zeilen und keine Teile davon gelöscht werden sollten.

Antworten

6 BERA Aug 27 2020 at 17:11

Sie können die Option Nach Speicherort auswählen verwenden und dann ausgewählte Zeilen in QGIS löschen oder sich innerhalb von verbinden:

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

Alle Zeilen innerhalb der Polygone werden gelöscht:

4 geozelot Aug 27 2020 at 18:15

Verwenden Sie einen EXISTSAusdruck:

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

Wenn die ST_WithinPrüfung die erste trifft TRUE(Auswahl einer Wahrheit 1), wird die Unterabfrage für die aktuelle Zeile beendet (unabhängig davon, ob mehr als ein Treffer vorhanden war).

Dies ist eine der effizientesten Methoden, wenn eine Tabelle zeilenweise durchlaufen werden muss (wie in einer UPDATE/DELETE) oder auf andere Weise mit einer Vorauswahl (z ids. B. ) verglichen werden muss .

3 IanTurton Aug 27 2020 at 17:55

Da die Fehlermeldung besagt, dass Sie nur eine einzelne Spalte zurückgeben sollten, versuchen Sie Folgendes:

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

Dies setzt voraus, dass Ihre lines_test2Datentabelle eine eindeutige ID-Spalte enthält .

3 CyrilMikhalchenko Aug 27 2020 at 18:30

Hier ist ein anderes Rezept, versuchen Sie es vielleicht 🙂

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;