Trova poligoni che si sovrappongono nello stesso livello con SQL

Aug 21 2020

Ho un livello con 40k poligoni e vorrei creare un nuovo livello solo con i poligoni che si sovrappongono.
Ho provato a utilizzare l'SQL nel gestore db per creare una separazione, ma sembra che non sia possibile eseguire la query su un livello.

ecco come ho provato a farlo:

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

Ho anche provato lo stesso con contiene, ma sembra che mi manchi qualcosa qui, forse perché è lo stesso livello?

Ho visto che c'è un modo per farlo con il controllo della topologia, ma c'è un modo per fare questa query all'interno del db manager?

Risposte

2 IanTurton Aug 21 2020 at 10:06

Questo è simile al modo in cui si trovano i duplicati in un attributo, è necessario unire il livello a se stesso e quindi escludere le sovrapposizioni personali. Quindi una query come:

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

Nota che sto usando ST_Touches perché non ho sovrapposizioni nei miei dati, questo 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

Questa query controllerà l'autointersezione di ogni caratteristica

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