Encuentra polígonos que se superponen en la misma capa con SQL

Aug 21 2020

Tengo una capa con 40k polígonos y me gustaría crear una nueva capa solo con los polígonos que se superponen entre sí.
Intenté usar SQL en el administrador de base de datos para crear una separación, pero parece que no puedo ejecutar la consulta en una capa.

así es como traté de hacer eso:

SELECT "45k_less".*,
ST_Overlaps("45k_less"."geometry","45k_less"."geometry") "overlaps" 
FROM "45k_less"

También he intentado lo mismo con contiene, pero parece que me pierdo algo aquí, ¿tal vez porque es la misma capa?

Vi que hay una manera de hacerlo con el verificador de topología, pero ¿hay alguna forma de hacer esta consulta dentro del administrador de db?

Respuestas

2 IanTurton Aug 21 2020 at 10:06

Esto es similar a la forma en que encontraría duplicados en un atributo, debe unir la capa a sí misma y luego excluir las superposiciones propias. Entonces una 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)

O

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

Tenga en cuenta que estoy usando ST_Touches ya que no tengo superposiciones en mis datos, esto da

"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 comprobará la intersección propia de cada característica.

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