Excluir linhas dentro do polígono
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
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:
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).
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.
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;