L’ISTAT mette a disposizione i confini amministrativi ai fini statistici per le unità comuni, province e regioni d’Italia, in due versioni: generalizzate e non, cioè poco dettagliate e dettagliate entrambe in formato ESRI shapefile con EPSG 32632 – UTF-8.
Questi strati sono un riferimento ufficiale in quanto li elabora e li distribuisce l’Istituto nazionale di statistica, ente di ricerca pubblico, è il principale produttore di statistica ufficiale a supporto dei cittadini e dei decisori pubblici;
NON ci crederete ma tutti gli strati messi a disposizione hanno delle geometrie non valide secondo i requisiti richiesti dagli standard OGC.
Per scoprire quali geometrie non rispettano i criteri dell’OGC utilizzeremo un famoso DBMS (SQLite) con estensione spaziale Spatialite che è conforme alle specifiche dell’Open GIS Consortium (OGC).
Scarico ed importo gli shapefile presenti nella cartella versione non generalizzata in un database creato con spatialite_gui (che è la versione con interfaccia grafica di spatialite):

verifica sul vettore Comuni:

risultano 10 comuni con geometria non valida;
lo statement SQL usato è il seguente:
SELECT *
FROM Com01012018_WGS84
WHERE ST_IsValid(geom) <> 1;
per gli altri vettori basterà ripetere lo stesso codice avendo cura di sostituire il nome della tabella in FROM.
Vediamo che tipo di invalidità è presente mediante i messaggi GEOS:

lo statement SQL usato è il seguente:
SELECT pro_com, comune, GEOS_GetLastWarningMsg(),
ST_AsText(GEOS_GetCriticalPointFromMsg())
FROM Com01012018_WGS84
WHERE ST_IsValid(geom) <> 1;
siamo finalmente in grado di rivelare la causa dell’invalidità: c’è un autointersecarsi, inoltre siamo in grado di identificare esattamente dove si trova l’autointersezione, con la seguente view evidenziamo i punti invalidi:
CREATE VIEW point_invalid AS
SELECT pro_com, comune, GEOS_GetLastWarningMsg(),GEOS_GetCriticalPointFromMsg() as geom
FROM Com01012018_WGS84_test
WHERE ST_IsValid(geom) <> 1;
registriamo la geometria della view:
INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only)
VALUES (‘point_invalid’, ‘geom’, ‘pro_com’, ‘com01012018_wgs84’, ‘geom’,1)
ecco l’anteprima dei punti:

ecco elenco dei Comuni e le coordinate dei punti:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PRO_COM | COMUNE | GEOS_GetLastWarningMsg() | coord_punti | |
---|---|---|---|---|
75072 | Santa Cesarea Terme | Ring Self-intersection at or near point 1308926.0356999999 4476059.9891999997 | POINT(1308926.0357 4476059.9892) | |
75031 | Gallipoli | Ring Self-intersection at or near point 1265551.0340999998 4472508.2443000004 | POINT(1265551.0341 4472508.2443) | |
74001 | Brindisi | Ring Self-intersection at or near point 1258539.7858999996 4539825.2137000002 | POINT(1258539.7859 4539825.2137) | |
72001 | Acquaviva delle Fonti | Ring Self-intersection at or near point 1158442.6376999998 4556057.8583000004 | POINT(1158442.6377 4556057.8583) | |
72040 | Sannicandro di Bari | Ring Self-intersection at or near point 1154968.4280000003 4561653.8165000007 | POINT(1154968.428 4561653.8165) | |
72037 | Rutigliano | Ring Self-intersection at or near point 1177064.5067999996 4571209.1926000006 | POINT(1177064.5068 4571209.1926) | |
81019 | Santa Ninfa | Ring Self-intersection at or near point 841730.11459999997 4190972.9645000007 | POINT(841730.1146 4190972.9645) | |
87009 | Bronte | Ring Self-intersection at or near point 1028304.0537999999 4195170.1147000007 | POINT(1028304.0538 4195170.1147) | |
111008 | Calasetta | Ring Self-intersection at or near point 444979.67760000005 4320623.5316000003 | POINT(444979.6776 4320623.5316) | |
90035 | La Maddalena | Ring Self-intersection at or near point 528108.51559999958 4571486.8072999995 | POINT(528108.5156 4571486.8073) |
Queste geometrie non valide non permettono di fare delle semplici elaborazioni come, per esempio, l’estrazione dei centroidi:
per correggere le geometrie (dei Comuni) basta eseguire una query di aggiornamento come questa:
UPDATE Com01012018_WGS84
SET geom = MakeValid(geom)
WHERE ST_IsValid(geom) <> 1;
per gli altri vettori basterà ripetere lo stesso codice avendo cura di sostituire il nome della tabella dopo UPDATE;
oppure, per correggerle in una unica soluzione copiare ed incollare il seguente codice:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
— per i comuni | |
UPDATE Com01012018_WGS84 | |
SET geom = MakeValid(geom) | |
WHERE ST_IsValid(geom) <> 1; | |
— per le province: | |
UPDATE ProvCM01012018_WGS84 | |
SET geom = MakeValid(geom) | |
WHERE ST_IsValid(geom) <> 1; | |
— per le regioni: | |
UPDATE Reg01012018_WGS84 | |
SET geom = MakeValid(geom) | |
WHERE ST_IsValid(geom) <> 1; | |
— ed infine: | |
UPDATE RipGeo01012018_WGS84 | |
SET geom = MakeValid(geom) | |
WHERE ST_IsValid(geom) <> 1; |
NOTE Finali: Utilizzo gli shapefile dell’ISTAT da anni (dal 2011) e tutti hanno sempre avuto gli stessi errori, negli stessi punti. Ho scritto una mail a : Informazioni territoriali e sistema informativo geografico email micro.zone@istat.it
stay tuned
Infinite grazie a Alessandro Furieri, papà di spatialite e instancabile divulgatore.
Grazie ad Andrea Borruso per l’idea e l’incoraggiamento a scrivere questo post.
fonte:
https://www.gaia-gis.it/fossil/libspatialite/wiki?name=invalid-geometries
- spiegazione dell’invalidità by Alessandro Furieri:
Buon lavoro!!!
…a questo punto, nessuno è infallibile!!! grazie, lavoro ben fatto e divulgazione sempre impeccabile…
"Mi piace"Piace a 1 persona
Grazie a te per il messaggio.
"Mi piace""Mi piace"
Grazie grazie grazie!
"Mi piace"Piace a 1 persona
Prego, prego prego!
"Mi piace""Mi piace"
Ottimo lavoro da parte di tutti. Dalle mie elaborazioni comunque posso inoltre confermare che i confini amministrativi, contenuti negli strati informativi pubblicati da ISTAT, non sono coerenti con le realta’ locali, quindi necessita prestare attenzione in sede di geo-processamento e analisi.
"Mi piace"Piace a 1 persona
Ho ricevuto altre segnalazioni sulla non coerenza con i dati reali, per esempio sui nomi dei comuni.
"Mi piace""Mi piace"
Quando avevo segnalato il problema un anno e mezzo fa mi avevano risposto così:
“i confini amministrativi a fini statistici sono validati ad una scala variabile, generalmente 1:10.000 e si è stabilita una “tolerance” di 1 metro per la loro produzione; i punti al di sotto di questa tolleranza, pertanto, non sono stati da noi trattati in maniera specifica. Aggiungo, peraltro, che si tratta di confini validi a scopi statistici.”
"Mi piace""Mi piace"
Ciao,
scrissi la prima e-mail il 23-marzo -2018, dopo una settimana di silenzio scrissi un’altra mail il 28-marzo: mi risposero subito ma non posso pubblicare il contenuto perché sarebbe troppo umiliante, nella stessa risposta mi chiesero di contattarli telefonicamente per spiegare meglio cosa intendessi per geometrie non valide. Nonostante tutto, anche dopo la telefonata, gli shapefile sono sempre gli stessi e con gli stessi errori.
ecco il mio tweet:
"Mi piace""Mi piace"
Pagina interessante anche se in realtà ci sono capitato sopra perché sto cercando di risolvere un diverso problema con gli shapefile ISTAT. Ovvero: vorrei sovrapporre i confini dei comuni (dei cui shapefile si parla in questa pagina) con i confini dei Sistemi Locali del Lavoro (insiemi di comuni). Il problema è che il sistema di coordinate degli shapefile SLL (latitudine e longitudine dei centroidi sono come li vedi in GoogleMaps) sono diversi da quelli dei confini amministrativi dei comuni.
"Mi piace""Mi piace"