[Gfoss] Riparare geometria???

Andrea Peri aperi2007 a gmail.com
Ven 1 Mar 2013 19:20:43 CET


>Un momento, signori: "validazione" e' una cosa, "riparazione" e' un'altra.
>
>Se Postgis e/o Spatialite, come fa Qgis, si limitano a dire "Ehi, ho trovato
>1000 errori, qui e la', mettili a posto, e rifatti vivo", allora non credo
>sia una soluzione accettabile per Emanuela.
>
>Qualora invece siano in grado di "aggiustare" in automatico una shape
>devastata come fa l'impressionante MAPCLEAN suddetto, beh, tanto di
>cappello.


La funzione ST_MakeValid è stata inserita nella libreria LibWGeom resa
nel compempo "indipendente da postgis", nel senso che si puo' usare
senza avere installato un intero postgres/postgis.
Successivamente tale libreria libwgeom è stata inserita nel rilascio
di spatialite 4.0 e roba di questi giorni viene inserita anche nel
plugin sextante di qgis.

Per cui si puo' usare fin da suibito postgis 2.0 oppure spatialite 4.0
per validare (nel senso di riparare e riportarsi a una geometria
valida) una geometria altrimenti non valida.

Una delle constraint forti nella funzione ST_MakeValid è
"non perdere alcun vertice".
Questo perche' ogni vertice "costa" e una funzione di rende una
geometria valida rimuovendo vertici non sempre va bene.

Questo ha comportato che spesso la correzione di una geometria porta a
una geometria di altro tipo:

esempio:
ci puo' essere il classico poligono col fiocchetto, la sua correzione
comporta la suddivisione di tale geometrie in due parti.
La ST_MakeValid() in questo caso per correggere una geometria di tipo
POLYGON genera una MultiPolygon.

Questo perche' non si vuole generare due records distinti.

La ragione di questa scelta è che due records distinti potrebbero
avere una collisione sulla chiave primaria o su un qualche campo
univoco.
Per cui si preferisce generare una MultiPolygon.

In altre situazioni la correzione di una polygon puo' portare alla
nasciat di una "collection", ad esmepio perche' ci si trova di fronte
a un
poligono con una linea interna (il classico caso dell' hole che per
cause "esterne" è stato collassato in una linea o addirittura in un
punto.

Per cui a seguito della ST_MAkeValid() si deve sempre pensare di
appoggiare il risultato su una tabella terza avente la polygon e poi
fare un nuovo passaggio elbirativo che estragga i contenuti nel senso
che si desidera.

Se si lavora con postgis si puo' anche fare tutto in una sola passata,
su spatialite serve una tabella temporanea su cui appoggiare i
risultati della ST_MakeValid .
Poi si da' una occhiata ai risultati con una "select distinct
st_geometrytype" e si decide come spacchettarli.

Alla fine si ottiene tutte  le geoetrie ripulite e pronte a essere
sostituite con un update nella tabella originale (o in altra se si
vuole conservare quelle originali).

Un caso a parte è il caso del famoso caso del "buco che tocca il contorno".
Infatti esiste un differente interpretazione tra ESRI e
rest-of-the-world su come si traccia un poligono avente un bco in
touch sul contorno.
Questa differente interpretzione fa si che per un qualsiasi sistema
OGC compliant (copreso autocad-map credo) questo caso è una
invalidita', mentre per esri no.

Questo porta a una situazione assurda, per cui uno shapefile in cui ci
sono poligoni di questo tipo se veogno "editati con prodotti esri
vengono ricondotti a questa situazione esri-compliant, e diventano
invalidi per ogni altro software.

Essendo invalidi finiscono per non essere usabili in altri contesti.

Uno dei grandi meriti di ST_MAkeValid è che riporta questa situazione
a essere OGC-compliant.

Per cui se ci sono poligoni con tale situazione la st_makevalid li
rende compliant con OGC.

Poiche nel corso della vita di uno shapefile la possibilita' che venga
rieditato da prodotti esri è elevata, essendo il software piu' usato e
piu' diffuso, il poter sempre riportare un oligono a essere OGC
complinat è una cosa assolutamente fondamentale.

Per cui , la ST_MakeValid è certamente di aiuto.
E come dicevo presto sara' accessibile anche su sextante.

Saluti,

-- 
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------


Maggiori informazioni sulla lista Gfoss