L'importazione di uno shapefile in Postgis con ogr2ogr dà: Impossibile aprire l'origine dati


12

Voglio usare ogr2ogr per importare un file di forma in un database Postgis. Ho installato con successo ogr2ogr e corro da pgsql il seguente comando:

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

Quello che ottengo è un messaggio di errore:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

Ho anche provato a definire il percorso completo dello shapefile ma ho ricevuto lo stesso messaggio.

Inoltre ho provato a eseguire il:

ogrinfo world_boundaries.shp

Stessa cosa.


Dopo aver risolto i problemi con le autorizzazioni del file ottengo il seguente errore:

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

Ho anche provato a importarlo tramite la GUI shp2pgsql e ottengo il seguente errore:

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

Il problema questa volta era che questo utente del database non aveva autorizzazioni sufficienti. Questo risolto:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

Il prossimo messaggio di errore è:

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

Quindi sembra che debba usare il parametro: -nlt MULTIPOLYGON Ma quando lo faccio ottengo un altro errore, il che non ha alcun senso per me:

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

Ma viene caricato usando la GUI di shp2pgsql.


Il commento di @elrobis ha permesso che finalmente funzionasse. Dati caricati correttamente in db!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

Sembra che il tuo file di forma non sia valido. Funziona con altri software?
Evil Genius,

1
Sì. È caricato correttamente in QGIS.
user1919

1
Inoltre, supponendo che il tuo DB esista già e che sia stato digitato correttamente nell'istruzione ogr2ogr e che l'utente postgres nel comando disponga del completo complemento dei privilegi necessari (SELEZIONA, INSERISCI, AGGIORNA, CREA .. ecc.), Prova ad aggiungere l' -nln layernameargomento, forse insieme -overwritea vedere se prende vita. Inoltre, se fossi in te, eseguirò ogr2ogr come sudocon il mio superutente postgres solo per essere super super certo di escludere permessi e privilegi. Una volta che la tua sceneggiatura è solida, puoi prenderti cura delle fastidiose autorizzazioni e privilegi. :)
elrobis,

3
Grazie. L'aggiunta di -nlt GEOMETRY invece di -nlt POLYGON ha fatto il trucco.
user1919

1
Sono contento che abbia funzionato. Vado avanti e darò una risposta adeguata in una risposta che descrive anche perché penso che abbia funzionato.
elrobis,

Risposte:


17

Come hai scoperto per tentativi ed errori, c'erano pochi problemi fastidiosi che dovevi risolvere, l'ultimo dei quali è stato risolto usando l' argomento -nlt GEOMETRY* di ogr2ogr .

* Nota la raccomandazione nel commento di @ LeeHachadoorian che -nlt PROMOTE_TO_MULTIverrà utilizzata come soluzione predefinita, piuttosto che nlt GEOMETRY, poiché la prima promuove le migliori pratiche oltre ai benefici accessori.

Autorizzazioni utente e messaggi di errore

Innanzitutto, ogr2ogr non è stato in grado di aprire il tuo file di forma e ti sei reso conto che i problemi con le autorizzazioni stavano effettivamente interessando l'utente del sistema operativo che accedeva al tuo file di forma. Ma c'è una lezione importante qui per gli altri, in particolare, il messaggio di errore di ogr2ogr su questo punto era fuorviante! In effetti, uno dei primi commentatori ha ritenuto che il tuo file di forma non fosse valido e, devo ammettere, la mia prima ipotesi era che probabilmente c'era un errore / errore di battitura nel percorso / nome file o che potrebbe esserci stato un carattere non convenzionale nel percorso del file, come un spazio: stava rompendo la capacità di ogr2ogr di indicare lo shapefile. Come hai scoperto, in realtà era solo un problema con le autorizzazioni utente. Poiché il messaggio di errore crea un'aringa rossa, questa è una possibilità che gli altri devono tenere nella parte posteriore delle loro menti. :)

Privilegi utente SQL e errori misteriosi

Sarei rimasto sconcertato dal tuo secondo errore per un po ', ma testando il tuo utente SQL con una diversa utility di importazione (shp2pgsql), che era intelligente, hai ricevuto un messaggio di errore più preciso e hai dato al tuo utente SQL i privilegi necessari sul spatial_ref_systavolo. Pertanto, qualcuno che ha difficoltà a far funzionare correttamente le proprie istruzioni di importazione ogr2ogr dovrebbe assicurarsi che il proprio utente SQL disponga di privilegi sufficienti sia sul database stesso che sulla tabella 'spatial_ref_sys'.

Tipi di geometria mista e migliori pratiche

L'ultimo ostacolo che hai incontrato sembra correlato al fatto che gli shapefile consentono a geometrie sia singole che multipart di coesistere nello stesso set di dati / file. È considerato una cattiva pratica mescolare i tipi di geometria nella stessa tabella, anche per singoli / multipart dello stesso tipo di funzione e, per impostazione predefinita, i lettori open source nella toolchain cercheranno di proteggerti dal mescolare i tipi di geometria. Fortunatamente, però, ti offrono alcune opzioni. Inizialmente ho raccomandato di impostare l' argomento -nlt GEOMETRY* sull'istruzione ogr2ogr, che ti ha permesso di importare il tuo set di dati poligonali nonostante la convenzione più libera di ESRI. Tuttavia, ciò significa che probabilmente hai geometrie sia a parte singola che a più parti nella tua tabella, e ciò potrebbe creare altri mal di testa per il tuo futuro!

Vale la pena ricordare che ogr2ogr ha un'altra -nltopzione da considerare, vale a dire PROMOTE_TO_MULTI. Per citare la documentazione ..

A partire da GDAL 1.10, PROMOTE_TO_MULTI può essere utilizzato per promuovere automaticamente livelli che mescolano poligono o multipoligoni in multipoligoni e livelli che mescolano linestring o multilinestring in multilinestring. Può essere utile durante la conversione di shapefile in PostGIS e altri driver di destinazione che implementano controlli rigorosi per i tipi di geometria.

In altre parole, se si utilizza il PROMOTE_TO_MULTIflag, TUTTE le funzioni verranno convertite in funzioni in più parti, anche quando sono costituite da una singola parte. Come notato da @LeeHachadoorian nei commenti - e sono sicuro che la maggior parte sarebbe d'accordo - ti consigliamo di preferire PROMOTE_TO_MULTIla GEOMETRYbandiera più sciolta , poiché è conforme alle migliori pratiche, unificando le geometrie delle caratteristiche nella tua tabella. Fondamentalmente, qualsiasi codice che scrivi dovrebbe aspettarsi solo geometrie multipart. Certo, questo può essere più pulito e semplificare parte dello sviluppo.

Consigli generici per qualcuno che ha problemi con l'importazione da SHP a POST

  1. Assicurati che i tuoi percorsi non contengano caratteri funky e che non ci siano errori di battitura o errori di ortografia nel percorso o nel nome file
  2. Come scoperto da @utente1919, assicurati che l'utente del tuo sistema operativo disponga di privilegi sufficienti per accedere allo shapefile! Come hanno dimostrato, può essere utile provare ad aprire lo shapefile in un altro software, come QGIS, se funziona in un software, non è corrotto e dovrebbe funzionare in altri software.

Innanzitutto, considera di eseguire il comando ogr2ogr sudoper escludere i problemi di autorizzazione fino a quando non sai per certo che lo script funziona come previsto.

  1. Inoltre, come realizzato da @ user1919, assicurati che l'utente SQL disponga di privilegi sufficienti sia sul database targetizzato dallo script, sia sulla spatial_ref_systabella.

Ancora una volta, inizialmente, considera l'utilizzo del superutente PostGRESql qui per escludere problemi di privilegi SQL fino a quando lo script non funziona. Se lo script funziona con il superutente quindi non riesce con un utente di automazione preferito, sai che il problema è legato all'utente SQL e non ai tuoi dati o al tuo ambiente (installazione gdal / ogr, ecc.)

  1. Prova a impostare la -nltbandiera su PROMOTE_TO_MULTIo GEOMETRY. Poiché gli shapefile consentono una convenzione di tipo di funzionalità più flessibile, a volte è necessario indicare alle utility open source di essere più accomodanti :)

  2. Se stai importando a PostgreSQL o MySQL, provare a impostare -lco PRECISION=no..fair avvertimento, non esattamente a capire che cosa questa tesi fa, ma ecco quello che ho vissuto .. Come sapete, gli shapefile includono spesso le SHAPE_LENGTHe SHAPE_AREAcampi, ed io ho notato a volte quando si verificano errori misteriosi, se elimino quei campi posso ottenere l'importazione corretta dei dati. Tuttavia, se uso -lco PRECISION=no, posso ottenere i dati da importare senza dover eliminare quei campi. La mia raccomandazione è di utilizzare questo parametro come passaggio per la risoluzione dei problemi, ma per capire quale problema sta veramente risolvendo prima di accettare l'importazione in una soluzione di produzione.

  3. Infine, se si utilizza MySQL, tenere presente che alcune geometrie di funzionalità molto grandi potrebbero offendere il max_allowed_packetparametro di MySQL . Puoi leggere ulteriori informazioni al riguardo nella documentazione per il driver MySQL. Ma la soluzione è quella di modificare la configurazione di MySQL per consentire un valore superiore a quello predefinito.

Esempio di comando di importazione da SHP a PostGIS per ogr2ogr

Per il bene di tutti i neofiti che possono vagare qui, questo è l'aspetto della maggior parte delle mie importazioni da SHP a Post usando ogr2ogr. Nota che racchiudo i percorsi / nomi dei file tra virgolette, questo protegge da spazi, caratteri strani e interruzioni di riga attraverso il terminale. Inoltre ho incluso la maggior parte degli argomenti discussi sopra, oltre alle sostituzioni per il campo del nome della geometria, il Campo FID e il nome del livello:

ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite


3
Per quanto riguarda -nlt PROMOTE_TO_MULTI, questa è davvero una buona pratica per le geometrie poligonali. Suggerirei di cambiare la tua risposta per consigliarla come una scelta di default forte, solo per essere violata dopo un'attenta considerazione. Vorrei anche sconsigliare vivamente di utilizzare il geometrytipo generico per gestire poligoni / multipoligoni misti, a meno che l'utente / sviluppatore non sappia davvero cosa stanno facendo e debbano mescolare tipi di poligoni, linee e punti.
Lee Hachadoorian,

1
@LeeHachadoorian, d'accordo. Ho modificato la risposta come raccomandato. A mia difesa, PROMOTE_TO_MULTIè abbastanza nuovo (GDAL 1.10) che ancora non riesco a trovare la soluzione originale che era disponibile quando ho iniziato in tutto questo. :) .. in tutta onestà, tuttavia, uno shapefile combinerà solo tipi singoli e multipart, quindi non ci sarebbe mai uno scenario in cui ogr2ogr spingerebbe un shp attraverso -nlt GEOMETRYe costruire una tabella con punti, linee e polis :))))) Tuttavia, sono completamente d'accordo con la tua posizione in merito.
elrobis

1
Gli Shapefile consentono più poligoni nel loro tipo di poligono. Non hanno nemmeno il tipo MultiPolygon. Quindi, anche quando si incontra questo tipo di file di forme, è necessario utilizzarlo -nlt PROMOTE_TO_MULTIper farlo funzionare.
CMCDragonkai
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.