Encontre polígonos que se sobrepõem na mesma camada com SQL

Aug 21 2020

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

2 IanTurton Aug 21 2020 at 10:06

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"
...
Taras Aug 21 2020 at 10:04

Esta consulta irá verificar a auto intersecção de cada característica

SELECT *
FROM "45k_less"
WHERE St_IsValid(geometry) = 0