Aiuto con la geometria poligonale PostGIS - anelli non chiusi


10

Ho preso una copia del libro malvagio 'Python Geospatial Development' di Erik Westra ( link Amazon ), e ci sto lavorando. Attualmente, mi sta insegnando a caricare i dati della costa GSHHS da un file di forma in un database PostGIS, in preparazione della creazione di un'app Web geospaziale.

Il mio problema è questo: quando provo a importare i dati GSHHS in PostGIS, questi vengono rifiutati a causa del fatto che i poligoni della costa non vengono considerati "validi". Nello specifico, mi viene fornito un messaggio di errore che descrive alcuni (ma non tutti) i poligoni della linea costiera come "anelli non chiusi".

Capisco che questo errore sta cercando di dirmi che il primo e l'ultimo punto del poligono non sono gli stessi. Tuttavia, questo non è semplicemente vero. Ho esaminato la rappresentazione WKT di molti poligoni e sono corretti. Hanno sicuramente iniziano e terminano con lo stesso co-ordinata.

I poligoni vengono estratti dai file di forma utilizzando la libreria OGR ed esportando ogni funzione poligonale in WKT. Ho provato a ricostituire il poligono tramite Shapely e ho sperimentato WKB, ma senza risultati. Sono già stati in grado di caricare gli stessi dati in PostGIS come tabella MULTIPOLYGON, utilizzando il caricatore shp2pgsql.

Mi chiedevo se qualcuno là fuori avesse:
(a) forse usato lo stesso libro, bloccato sullo stesso problema e ha la risposta per me?
(b) ha riscontrato un problema simile e trovato una soluzione?
(c) in caso contrario, dispone di alcuni consigli sulle "migliori pratiche" per garantire una geometria valida prima di caricarla in PostGIS?

AGGIORNAMENTO: un collega ha suggerito che il problema degli "anelli non chiusi" potrebbe essere solo un sintomo di un altro problema. È possibile che la mia configurazione PostGIS / PostgreSQL abbia limiti di dimensione (su transazioni di inserimento, pacchetti ricevuti, stringhe di testo, ecc.).

Poiché sto usando poligoni WKT molto lunghi come input, PostGIS potrebbe tagliarli troppo presto per consentire il completamento di ciascun poligono. Lo proverò domani, ma sembra probabile. La mia inserzione di confini nazionali accettava solo alcuni documenti e non altri. A memoria, le geometrie accettate erano per piccole nazioni insulari come Antigua (e quindi probabilmente avevano rappresentazioni WKT brevi).

Quindi questo potrebbe finire per essere più un thread di amministrazione del database PostGIS, piuttosto che un thread di geometria non valido.


puoi fornire un file shp di esempio?
Mario Miler,

nessun problema. I dati sul litorale GSHHS che sto usando sono un download da 96 MB da qui . I dati sui confini del mondo che sto usando sono i set di dati sui confini del mondo da thematicmapping.org
timmy,

Risposte:


6

Ho esaminato i tuoi dati e l'esempio del libro, il problema è che ci sono tre poligoni non validi nei dati che vengono elaborati nel libro:

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

Poiché questo è un esempio, sarebbe più semplice eliminare quei poligoni dal set di dati o semplicemente aggiungerne uno se nel codice

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

Grazie Mario, sembra che stavo andando molto più avanti di me stesso, invece di validare correttamente TUTTI i miei poligoni di input. La tua risposta è stata corretta: questi poligoni sono risultati non validi quando testati con OGR. È interessante notare che sembrava perfetto in QGis, ma ArcMap li ha mostrati come privi di un anello completo. Questi tre poligoni cadevano tutti sulla linea di dati e immagino che la geometria del file di forma non contasse il bordo del poligono lungo la linea di dati. La tua soluzione è un modo semplice e piacevole per rilevare poligoni non validi. Contrassegnerò il post come risposta.
timmy,

Se ti senti caritatevole, hai qualche buona soluzione per il prossimo passo del processo, che sta correggendo i poligoni non validi? Ho provato a usare la funzione .CloseRing () di OGR, ma senza risultati. Penso semplicemente che abbia ignorato la chiamata di funzione.
timmy,

Ho provato a usare il "buffer trick" ( workshop.opengeo.org/postgis-intro/validity.html ) con ben fatto e ogr ma senza successo. Shapely non leggerà poligoni non validi e ogr non eseguirà il buffer, al momento non so perché. Se inciampo nella risposta, ti farò sapere. Forse qualcun altro ha più successo con questo problema. Scusate.
Mario Miler,

Penso di aver funzionato la mia convalida poligonale. Penso che stavo usando la funzione .CloseRings () di OGR nel modo sbagliato. Mi è stato chiamato come metodo del poligono (cioè poly.CloseRings ()). Invece, ho dovuto estrarre l'Anello Lineare dal poligono e quindi eseguirlo su quello (cioè lr = poly.GetGeometryRef (0); lr.CloseRings ()). I risultati vengono inseriti con successo in PostGIS e posso usare i 3 poligoni problematici in QGis senza preoccupazioni. C'è solo un piccolo costo computazionale nel verificare la validità di OGNI poligono.
Timmy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.