Encontre polígonos que se sobrepõem na mesma camada com SQL
Eu tenho uma camada com polígonos de 40k e gostaria de criar uma nova camada apenas com os polígonos que se sobrepõem.
Tentei usar o SQL no gerenciador de banco de dados para criar alguma separação, mas parece que não consigo executar a consulta em uma camada.
foi assim que tentei fazer isso:
SELECT "45k_less".*,
ST_Overlaps("45k_less"."geometry","45k_less"."geometry") "overlaps"
FROM "45k_less"
Eu também tentei o mesmo com contém, mas parece que sinto falta de algo aqui - talvez porque seja a mesma camada?
Vi que existe uma maneira de fazer isso com o verificador de topologia, mas existe alguma maneira de fazer essa consulta dentro do gerenciador de banco de dados?
Respostas
Isso é semelhante à maneira como você encontra duplicatas em um atributo; você precisa unir a camada a ela mesma e, em seguida, excluir as sobreposições próprias. Portanto, uma consulta como:
select a.name, b.name
from us_counties.states a, us_counties.states b
where a.fid <> b.fid and ST_Touches(a.geom_4269, b.geom_4269)
Ou
select a.name, b.name from us_counties.states a
JOIN us_counties.states b
ON a.fid <> b.fid and ST_Touches(a.geom_4269, b.geom_4269)
order by a.name, b.name
Observe que estou usando ST_Touches, pois não tenho sobreposições em meus dados, isso dá
"name","name-2"
"Kansas","Oklahoma"
"Kansas","Missouri"
"Kansas","Nebraska"
"Kansas","Colorado"
"Oregon","Idaho"
"Oregon","Nevada"
"Oregon","California"
"Oregon","Washington"
"Texas","Oklahoma"
"Texas","Louisiana"
"Texas","New Mexico"
"Texas","Arkansas"
"Idaho","Nevada"
...
Esta consulta irá verificar a auto intersecção de cada característica
SELECT *
FROM "45k_less"
WHERE St_IsValid(geometry) = 0