[Gfoss] Postgres e ... geometry contains non-closed rings

azzz....non mi permette nemmeno di fare il backup della singola tabella ...
e ora....provo ad esportare come shape da qgis

Mi permetto di darti qualche suggerimento,
ma prima alcuni avvertimenti:

Non conosco il tuo DB, ma fai attenzione che esportando su shapefile potresti avere delle differenze intollerabili.

lo shapefile non consente campi piu' lunghi di 255 caratteri e tutto cio' in piu' viene troncato.
La somma dei contenuti di un record su un dbf non deve superare i 2Kbyte.

I nomi dei campi vengono troncati a 10 caratteri.

Inoltre, ci sono delle differenze nelle strutturazione delle geometrie ammissibili.

In merito a come fare il recupero delle geometrie io opererei cosi':

io piuttosto che qgis, per esportare da postgis vista la situazione di emergenza,
scaricherei l'ultimissima versione stabile di gdal (1.8) e userei quella direttamente.

con la sintassi:

ogr2ogr.exe -f "ESRI Shapefile" tabella.shp -progress PG:"dbname='nome_database' active_schema=schema_db schemas=schema_db,public host='localhost' port='5432' user='username' password='password' " -sql "select * from tabella where ST_IsValid(geom)=true"

In particolare fai attenzione alla stringa sql:

prima ti scarichi tutto cio' che e' valido usando come stringa sql:

"select * from tabella where ST_IsValid(geom)=true"

poi in altra cartella ti scarichi tutto quello che non e' valido, con questa altra sintassi

"select * from tabella where ST_IsValid(geom)=false"

cosi' , ammesso che te le scarichi su shapefile, hai le invalidita' da una parte e puoi lavorarle meglio...

auguri...

Andrea.

Ciao Andrea, e grazie dei preziosi consigli…

La cosa strana è che al momento ho ripassato a mano tutte le tabelle e non vi sono più errori!!!

ma il back up si pianta lo stesso…possibile???

Puoi risolvere i problemi sulle tabelle con geometrie corrotte con questa query.

update schema.tabella set the_geom = ST_Multi(ST_force_4d(ST_Buffer(the_geom,0)))

In questo caso applicata a poligoni 4d MULTIPOLYGON.

Occhio che le geometrie potrebbero cambiare. Fai prima una select e guarda come cambierebbe la geometria.

La cosa funziona solo per i poligoni. Per le linee o vai in editing da un Desktop GIS e modifichi a mano la geometria oppure devi eliminarla

···
Dott. Pietro d’Orio
R3 GIS Srl - GmbH
Via Johann Kravogl-Str. 2
I-39012 Meran/Merano (BZ)
web: www.r3-gis.com
Email: pietro.dorio@r3-gis.com
Tel. : +39 0473 494949
Fax : +39 0473 069902

ATTENZIONE! Le informazioni contenute nella presente e-mail e nei documenti eventualmente allegati sono confidenziali. La loro diffusione, distribuzione e/o riproduzione da parte di terzi, senza autorizzazione del mittente è vietata e può violare il D. Lgs. 196/2003. In caso di ricezione per errore, Vogliate immediatamente informare il mittente del messaggio e distruggere la e-mail.

ACHTUNG! Die in dieser Nachricht oder in den beigelegten Dokumenten beinhalteten Informationen sind streng vertraulich. Ihre Verbreitung und/oder ihre Wiedergabe durch Dritte ist ohne Erlaubnis des Absenders verboten und verstößt gegen das Legislativdekret 196/2003. Sollten Sie diese Mitteilung irrtümlicherweise erhalten haben, bitten wir Sie uns umgehend zu informieren und anschließend die Mitteilung zu vernichten.

WARNING! This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclousure or distribution of the material in this e-mail is strictly forbidden and could be against the law (D. Lgs. 196/2003)





Ciao Andrea, e grazie dei preziosi consigli…

La cosa strana è che al momento ho ripassato a mano tutte le tabelle e non vi sono più errori!!!

ma il back up si pianta lo stesso…possibile???


_______________________________________________
Iscriviti all'associazione GFOSS.it: [http://www.gfoss.it/drupal/iscrizione](http://www.gfoss.it/drupal/iscrizione)
[Gfoss@lists.gfoss.it](mailto:Gfoss@lists.gfoss.it)
[http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss](http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss)
Questa e' una lista di discussione pubblica aperta a tutti.
Non inviate messaggi commerciali.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.
502 iscritti all'11.2.2011

Il 05/05/2011 12:53, Luca Mandolesi ha scritto:

Ciao Andrea, e grazie dei preziosi consigli....

La cosa strana è che al momento ho ripassato a mano tutte le tabelle e non vi sono più errori!!!

ma il back up si pianta lo stesso....possibile???

evidentemente lo e' ...

conoscerlo in dettaglio rappresenterebbe un utilissimo
"caso d'uso".

Sospetto che in qualche maniera e involontariamente hai fatto entrare nel DB una geometria che e' incompatibile con le strutture della tua versione di DB.
Ma anche cosi' i dubbi sono svariati ...

Le tabelle di cui tenti il dump sono in public o in altro schema ?

Per il futuro ti consiglio di non metterei mai le tue tabelle in "public", ma piuttosto creati un altro schema e metti tutto li' dentro, lasciando public solo alle tabelle che installa direttamente postgis.

Al riguardo questo blog di Ramsey e' veramente illuminante.
http://blog.cleverelephant.ca/2010/09/postgis-back-up-restore.html

In merito alla tua richiesta:

Come faccio a capire in quale tabella? C'è modo di fare un loop
dell'istruzione select * from miatabella where ST_IsValid(the_geom)=false su
tutte le tabelle del DB oppure devo rifarla su tutte una per una?

Io ne ho gia' una che fa' questo genere di cose..

Se ti fa comodo posso girartela.

Andrea.

Se me la giri mi fai un favorone…effettivamente ho tutte le geometrie in public…mannaggg…e tanta paura!!

2011/5/5 aperi2007 <aperi2007@gmail.com>

Il 05/05/2011 12:53, Luca Mandolesi ha scritto:

Ciao Andrea, e grazie dei preziosi consigli…

La cosa strana è che al momento ho ripassato a mano tutte le tabelle e non vi sono più errori!!!

ma il back up si pianta lo stesso…possibile???

evidentemente lo e’ …

conoscerlo in dettaglio rappresenterebbe un utilissimo
“caso d’uso”.

Sospetto che in qualche maniera e involontariamente hai fatto entrare nel DB una geometria che e’ incompatibile con le strutture della tua versione di DB.
Ma anche cosi’ i dubbi sono svariati …

Le tabelle di cui tenti il dump sono in public o in altro schema ?

Per il futuro ti consiglio di non metterei mai le tue tabelle in “public”, ma piuttosto creati un altro schema e metti tutto li’ dentro, lasciando public solo alle tabelle che installa direttamente postgis.

Al riguardo questo blog di Ramsey e’ veramente illuminante.
http://blog.cleverelephant.ca/2010/09/postgis-back-up-restore.html

In merito alla tua richiesta:

Come faccio a capire in quale tabella? C’è modo di fare un loop
dell’istruzione select * from miatabella where ST_IsValid(the_geom)=false su
tutte le tabelle del DB oppure devo rifarla su tutte una per una?

Io ne ho gia’ una che fa’ questo genere di cose…

Se ti fa comodo posso girartela.

Andrea.

Devi forzare la geometria in modo che rispetti i constraint di dimensioni (2-3-4D) e tipo di geometria (POLYGON o MULTIPOLYGON). Solo in questo modo puoi correggere in maniera ottimale le geometrie e farle diventare valide all’interno della tabella… Ti riporto di nuovo la query che ti avevo scritto poco fa…

update schema.tabella set the_geom = ST_Multi(ST_force_4d(ST_Buffer(the_geom,0)))

La mia tabella è 4D di tipo MULTIPOLYGON. La query forza la geometria perchè rimanga Multipolygon e 4D, applica un buffer di 0 sulle geometrie. quelle corrotte vengono corrette.

Occhio che le geometrie potrebbero cambiare. Fai prima una select e guarda come cambierebbe la geometria.

La cosa funziona solo per i poligoni. Per le linee o vai in editing da un Desktop GIS e modifichi a mano la geometria oppure devi eliminarla

Pietro d’Orio

Ciao Pietro,

ho fatto una prova sulla mia tabella pyunitastratigrafiche

è di tipo POLYGON…

select * from pyunitastratigrafiche where the_geom = ST_Multi(ST_force_4d(ST_Buffer(the_geom,0)))

e in pratica mi ritorna tutte le geometrie che vi sono all’interno.

Poi ho fatto un:

select * from pyunitastratigrafiche where ST_IsValid(the_geom)=false

e ho 0 records come risultato

Poi ho aperto il layer in Qgis e ho salvato come shapefile e ricevo:

1 degli stati del cursore perso.

SQL: CLOSE qgisf0

Result: 7 (ERROR: current transaction is aborted, commands ignored until end of transaction block

).

A questo punto ricarico lo shape che ne deriva e all’interno ho la metà dei record…vedo che la lista dei miei gid si interrompre alla 4145…

nel layer postgis cerco la 4146 per vedere se c’è errore ma non ha problemi…

2011/5/5 Pietro d’Orio <pietro.dorio@r3-gis.com>

Puoi risolvere i problemi sulle tabelle con geometrie corrotte con questa query.

update schema.tabella set the_geom = ST_Multi(ST_force_4d(ST_Buffer(the_geom,0)))

In questo caso applicata a poligoni 4d MULTIPOLYGON.

Occhio che le geometrie potrebbero cambiare. Fai prima una select e guarda come cambierebbe la geometria.

La cosa funziona solo per i poligoni. Per le linee o vai in editing da un Desktop GIS e modifichi a mano la geometria oppure devi eliminarla

Dott. Pietro d’Orio
R3 GIS Srl - GmbH
Via Johann Kravogl-Str. 2
I-39012 Meran/Merano (BZ)
web: www.r3-gis.com
Email: pietro.dorio@r3-gis.com
Tel. : +39 0473 494949
Fax : +39 0473 069902

ATTENZIONE! Le informazioni contenute nella presente e-mail e nei documenti eventualmente allegati sono confidenziali. La loro diffusione, distribuzione e/o riproduzione da parte di terzi, senza autorizzazione del mittente è vietata e può violare il D. Lgs. 196/2003. In caso di ricezione per errore, Vogliate immediatamente informare il mittente del messaggio e distruggere la e-mail.

ACHTUNG! Die in dieser Nachricht oder in den beigelegten Dokumenten beinhalteten Informationen sind streng vertraulich. Ihre Verbreitung und/oder ihre Wiedergabe durch Dritte ist ohne Erlaubnis des Absenders verboten und verstößt gegen das Legislativdekret 196/2003. Sollten Sie diese Mitteilung irrtümlicherweise erhalten haben, bitten wir Sie uns umgehend zu informieren und anschließend die Mitteilung zu vernichten.

WARNING! This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclousure or distribution of the material in this e-mail is strictly forbidden and could be against the law (D. Lgs. 196/2003)





Il 05/05/2011 12:53, Luca Mandolesi ha scritto:

Ciao Andrea, e grazie dei preziosi consigli…

La cosa strana è che al momento ho ripassato a mano tutte le tabelle e non vi sono più errori!!!

ma il back up si pianta lo stesso…possibile???


_______________________________________________
Iscriviti all'associazione GFOSS.it: [http://www.gfoss.it/drupal/iscrizione](http://www.gfoss.it/drupal/iscrizione)
[Gfoss@lists.gfoss.it](mailto:Gfoss@lists.gfoss.it)
[http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss](http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss)
Questa e' una lista di discussione pubblica aperta a tutti.
Non inviate messaggi commerciali.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.
502 iscritti all'11.2.2011

Quindi se la mia geometria è POLYGON 2D …non credo siano 3D lo ho create con Qgis e caricate dentro a PG con SPIT… cosa devo mettere al posto di

ST_Multi e ST_force_4d?

On Thu, May 05, 2011 at 01:03:12PM +0200, Pietro d'Orio wrote:

Puoi risolvere i problemi sulle tabelle con geometrie corrotte con
questa query.

update schema.tabella set the_geom =
ST_Multi(ST_force_4d(ST_Buffer(the_geom,0)))

Dubito che risolva il suo caso (non-closed ring)

--strk;

  () Free GIS & Flash consultant/developer
  /\ http://strk.keybit.net/services.html

In questo caso non devi mettere nulla.

Per i self-intersection funziona benissimo, per non-closed rings significa che possono esistere delle linee costruite da un solo punto.

Probabilmente il tuo dato è una derivazione di un DWG o DXF? In quel caso è necessario modificare a mano le geometrie o eliminarle.

Il 05/05/2011 13:32, Luca Mandolesi ha scritto:

Quindi se la mia geometria è POLYGON 2D …non credo siano 3D lo ho create con Qgis e caricate dentro a PG con SPIT… cosa devo mettere al posto di

ST_Multi e ST_force_4d?

Il 05/05/2011 13:28, Luca Mandolesi ha scritto:

A questo punto ricarico lo shape che ne deriva e all'interno ho la metà dei record...vedo che la lista dei miei gid si interrompre alla 4145....

nel layer postgis cerco la 4146 per vedere se c'è errore ma non ha problemi....

prova con gdal.

qgis qui ci mette del suo ...

lui vuole un campo numerico con indice unique.
Se non rispetti questa condizione lui si arrabbia.

gdal invece e' meno scimmione e accetta di buon grado quello che gli arriva....

ergo hai piu' speranze di recuperare con gdal che con qgis...
inoltre passandogli la stringa sql che esclude a priori tutti i non validi, ti riprendi tutto quanto il recuperabile.

Invece qgis si ferma al primo problema e non va piu' avanti...

Andrea.

Il 05/05/2011 13:41, Sandro Santilli ha scritto:

On Thu, May 05, 2011 at 01:03:12PM +0200, Pietro d'Orio wrote:

Puoi risolvere i problemi sulle tabelle con geometrie corrotte con
questa query.

update schema.tabella set the_geom =
ST_Multi(ST_force_4d(ST_Buffer(the_geom,0)))

Dubito che risolva il suo caso (non-closed ring)

--strk;

   () Free GIS& Flash consultant/developer
   /\ http://strk.keybit.net/services.html

La ST_MakeValid() di postgis 200 dovrebbe riuscire a risolverlo ..

Immagino che chiuderebbe i poligoni tracciando una linea tra i due vertici mancanti .

Ma il problema e' come esportare le geometrie dal postgis che le tiene imprigionate...
L'unica strada per me e' gdal.

Andrea.

On Thu, May 05, 2011 at 03:42:19PM +0200, aperi2007 wrote:

Ma il problema e' come esportare le geometrie dal postgis che le tiene
imprigionate...

Abbiamo rilasciatola 1.4.2 e la 1.5.1 esattamente per consentire questo.

--strk;

  () Free GIS & Flash consultant/developer
  /\ http://strk.keybit.net/services.html

Il 05/05/2011 13:16, Luca Mandolesi ha scritto:

Se me la giri mi fai un favorone....effettivamente ho tutte le geometrie in public.....mannaggg.....e tanta paura!!

Una funzioncina di tale genere poteva essere in effetti abbastanza utile e comoda...
Ho provveduto quindi a inserire nel wiki di postgis come esempio una procedura che effettua una tale operazione.

http://trac.osgeo.org/postgis/wiki/UsersWikiCheckInvalidGeometriesFromGeometryColumns

Eseguendola ti crei una funzione che controlla ogni tabella elencata in geometrycolumns se possiede delle geometrie non valide.

Per eseguirla la invochi cosi':

select massive_check_geometry_validity('aaa');

alla fine ti crea una tabella nominata 'aaa' in cui ci mette il risultato.
Se e' vuota vuol dire che non hai geometrie invalide in nessuna tabella.
Altrimenti ti mette il numero di geometrie non valide per ciascuna tabella.

Saluti,

Andrea.