Trova poligoni che si sovrappongono nello stesso livello con SQL
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
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"
...
Questa query controllerà l'autointersezione di ogni caratteristica
SELECT *
FROM "45k_less"
WHERE St_IsValid(geometry) = 0