[Gfoss] Riparare geometria???

Andrea Peri aperi2007 a gmail.com
Ven 1 Mar 2013 21:54:11 CET


Anche con spatialite la ST_IsValid ha confermato che è invalida.

Ecco la prassi che ho seguito con spatialite 4.0 per testarla e poi
anche per correggerla.

Penso che in generale possa essere utile conoscerlo.

lancio la console di spatialite con il seguent ecomando (creero' un db
file chiamato temp.sqlite che poi butto via)
spatialite temp.sqlite

dalla console eseguo questi comandi:

.loadshp buco_tangente_contorno buco_tangente_contorno CP1252 25832
geometry pippo MULTIPOLYGON 2d 0 1

select count(*) from buco_tangente_contorno where ST_IsValid(geometry)=0;

(mi ritorna come risultato 1, il che vuol dire che ha trovato una
geometria non-valida)

select ST_IsValid(geometry) from buco_tangente_contorno where
ST_IsValid(geometry)=0;

(mi ritorna il seguente messaggio: GEOS warning: Self-intersection at
or near point 476957.4350220412 5031734.8072026027 0

La funzione ST_IsValid() quando incontra una invalidita' come extra
aiuto (prodotto dalla geos sottostante)
segnala la coordinata (o un punto vicino ad essa) dove è localizzata
l'invalidita'.

Per risolverla si ricorre alla ST_MakeValid.
nel seguente modo:

aggiungo una ulteriore colonna geometrica alla tabella (Su spatialite
e postgis questo è possibile e aiuta tantissimo).
In questa colonna aggiunta collochero' la geometria corretta.

In generale andrebbe messa questa una collection con questo comando,

select AddGeometryColumn(
'buco_tangente_contorno','geom_corretta',25832,'GEOMETRYCOLLECTION','XY',0);

in questo caso particolare si sa' gia' che arriverà una multipolygon,
per cui va bene anche questa:

select AddGeometryColumn(
'buco_tangente_contorno','geom_corretta',25832,'MULTIPOLYGON','XY',0);

poi si aggiorna correggendo la geometria con un update:

update buco_tangente_contorno set geom_corretta = ST_MakeValid(geometry);

La funzione makevalid correggera la geometria e la collochera' nella
colonna indicata.

A questo punto se vado a conteggiare nuovamente le geometrie invalide
su questa colonna geometrica:

select count(*) from buco_tangente_contorno where ST_IsValid(geom_corretta)=0;

ottengo come risultato "0" perche' ora le geometrie sono corrette.

Se voglio la posso esportare con questo comando stando attento a
prendere la geometria dalla colonna giusta:

.dumpshp buco_tangente_contorno geom_corretta
nuovo_buco_tangente_contorno CP1252 POLYGON


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


Maggiori informazioni sulla lista Gfoss