Excluir linhas dentro do polígono

Aug 27 2020

Tenho duas camadas, uma com linhas e outra com polígonos. Desejo excluir as linhas que caem totalmente (contenham) dentro dos polígonos. Parece muito simples, mas não consigo descobrir isso em PostgreSQL / PostGIS ou QGIS.

Para o SQL que estou tentando:

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

Mas me dá o erro: 'subconsulta deve retornar apenas uma coluna'. Recortar no QGIS também não é uma opção viável, porque deve apenas deletar linhas inteiras e não partes delas.

Respostas

6 BERA Aug 27 2020 at 17:11

Você pode usar Selecionar por localização e, em seguida, excluir as linhas selecionadas no QGIS ou ingressar por dentro de:

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

Todas as linhas dentro dos polígonos são excluídas:

4 geozelot Aug 27 2020 at 18:15

Use uma EXISTSexpressão:

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

Se a ST_Withinverificação acertar o primeiro TRUE(selecionando um verdadeiro 1), a subconsulta termina para a linha atual (não importa se houve mais de uma ocorrência).

Esta é uma das maneiras mais eficientes de quando uma tabela precisa ser percorrida por linha (como em uma UPDATE/DELETE) ou comparada com uma pré-seleção (por exemplo ids).

3 IanTurton Aug 27 2020 at 17:55

Como a mensagem de erro diz, você só deve retornar uma única coluna, então tente:

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

Isso pressupõe que você tenha uma coluna de ID exclusiva em sua lines_test2tabela de dados.

3 CyrilMikhalchenko Aug 27 2020 at 18:30

Aqui está outra receita, tente talvez goste 🙂

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;