Ein Shapefile mit ogr2ogr nach postgis importieren ergibt: Datenquelle kann nicht geöffnet werden

12

Ich möchte ogr2ogr verwenden, um ein Shapefile in eine Postgis-Datenbank zu importieren. Ich habe ogr2ogr erfolgreich installiert und führe aus der pgsql den folgenden Befehl aus:

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

Was ich zurück bekomme, ist eine Fehlermeldung:

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

Ich habe auch versucht, den vollständigen Pfad des Shapefiles zu definieren, aber ich habe die gleiche Meldung erhalten.

Auch habe ich versucht, das auszuführen:

ogrinfo world_boundaries.shp

Gleiche Sache.


Nach dem Beheben der Probleme mit den Berechtigungen der Datei erhalte ich den folgenden Fehler:

  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)

Ich habe auch versucht, es über die GUI shp2pgsql zu importieren, und ich erhalte die folgende Fehlermeldung:

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.

Diesmal bestand das Problem darin, dass dieser Datenbankbenutzer nicht über ausreichende Berechtigungen verfügte. Das hat es behoben:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

Nächste Fehlermeldung ist:

  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)

Es scheint also, dass ich den folgenden Parameter verwenden muss: -nlt MULTIPOLYGON Aber wenn ich das tue, erhalte ich einen weiteren Fehler, der für mich keinen Sinn ergibt:

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

Es wird jedoch über die shp2pgsql-GUI geladen.


Der Kommentar von @elrobis ermöglichte es, endlich zu funktionieren. Daten korrekt in db geladen!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp
user1919
quelle
Es hört sich so an, als ob Ihr Shapefile nicht gültig ist. Funktioniert es in anderer Software?
Evil Genius
1
Ja. Es ist korrekt in QGIS geladen.
user1919
1
Angenommen, Ihre DB existiert bereits und ist in Ihrer Anweisung ogr2ogr richtig geschrieben und der Benutzer postgres im Befehl verfügt über alle erforderlichen Berechtigungen (SELECT, INSERT, UPDATE, CREATE .. etc). Fügen Sie das -nln layernameArgument hinzu. vielleicht zusammen mit, um -overwritezu sehen, ob es zum Leben kommt. Wenn ich Sie wäre, würde ich ogr2ogr sudozusammen mit meinem postgres-Superuser ausführen, um ganz sicher zu sein, dass Berechtigungen und Privilegien ausgeschlossen sind. Sobald Ihr Skript solide ist, können Sie die lästigen Berechtigungen und Privilegien ausprobieren. :)
Elrobis
3
Vielen Dank. Hinzufügen von -nlt GEOMETRY anstelle von -nlt POLYGON hat den Trick gemacht.
user1919
1
Ich bin froh, dass es funktioniert hat. Ich werde fortfahren und eine richtige Antwort in einer Antwort geben, die auch beschreibt, warum ich denke, dass es funktioniert hat.
Elrobis

Antworten:

17

Wie Sie durch Ausprobieren herausgefunden haben, mussten Sie nur wenige Probleme beheben, von denen das letzte mit dem Argument -nlt GEOMETRY* von ogr2ogr behoben wurde .

* Beachten Sie die Empfehlung in @ LeeHachadoorians Kommentar, -nlt PROMOTE_TO_MULTIdie als Standardlösung verwendet werden soll und nicht nlt GEOMETRY, da erstere zusätzlich zu den zusätzlichen Vorteilen die Best Practice fördert.

Benutzerberechtigungen und Fehlermeldungen

Erstens konnte ogr2ogr Ihr Shapefile nicht öffnen, und Sie stellten fest, dass Berechtigungsprobleme tatsächlich den Betriebssystembenutzer betrafen, der auf Ihr Shapefile zugreift. Aber es gibt hier eine wichtige Lektion für andere, insbesondere war die Fehlermeldung von ogr2ogr in diesem Punkt irreführend! In der Tat dachte einer der ersten Kommentatoren, Ihr Shapefile sei ungültig, und zugegebenermaßen war meine erste Vermutung, dass der Pfad / Dateiname wahrscheinlich einen Fehler / Tippfehler enthält oder dass der Dateipfad ein unkonventionelles Zeichen enthält - wie z space - das hat die Fähigkeit von ogr2ogr gebrochen, auf das Shapefile zu zeigen. Wie Sie festgestellt haben, handelte es sich eigentlich nur um ein Problem mit den Benutzerberechtigungen. Da die Fehlermeldung einen roten Hering erzeugt, ist dies eine Möglichkeit, die andere im Hinterkopf behalten müssen. :)

SQL-Benutzerrechte und Mystery-Fehler

Ich wäre eine Weile von Ihrem zweiten Fehler überrascht gewesen, aber als Sie Ihren SQL-Benutzer mit einem anderen Importdienstprogramm (shp2pgsql) getestet haben, das klug war, haben Sie eine genauere Fehlermeldung erhalten und Ihrem SQL-Benutzer die erforderlichen Berechtigungen für die spatial_ref_sysTabelle erteilt . Daher sollte jemand, der Schwierigkeiten hat, seine ogr2ogr-Importanweisung zum Funktionieren zu bringen, sicherstellen, dass sein SQL-Benutzer über ausreichende Berechtigungen sowohl für die Datenbank selbst als auch für die Tabelle 'spatial_ref_sys' verfügt.

Gemischte Geometrietypen und Best Practices

Die letzte Hürde, auf die Sie gestoßen sind, hängt anscheinend mit der Tatsache zusammen, dass Shapefiles die Koexistenz von ein- und mehrteiligen Geometrien in demselben Datensatz / derselben Datei ermöglichen. Es wird als schlechte Praxis angesehen, Geometrietypen in derselben Tabelle zu mischen, auch für einzelne / mehrteilige Elemente desselben Feature-Typs. Standardmäßig versuchen die Open Source-Player in Ihrer Toolchain, Sie vor dem Mischen von Geometrietypen zu schützen. Glücklicherweise bieten sie Ihnen einige Optionen. Ursprünglich empfahl ich, das Argument -nlt GEOMETRY* in Ihrer Anweisung ogr2ogr zu setzen, damit Sie Ihr Polygon-Dataset trotz der lockereren Konvention von ESRI importieren können. Beachten Sie jedoch, dass Sie wahrscheinlich sowohl einteilige als auch mehrteilige Geometrien in Ihrer Tabelle haben. Dies kann später zu weiteren Kopfschmerzen führen!

Es ist erwähnenswert, dass Ogr2ogr eine andere -nltOption hat, die Sie in Betracht ziehen sollten, nämlich PROMOTE_TO_MULTI. Um die Dokumentation zu zitieren ..

Ab GDAL 1.10 kann PROMOTE_TO_MULTI verwendet werden, um Layer, die Polygone oder Multipolygone mit Multipolygonen mischen, und Layer, die Linestrings oder Multilinestrings mit Multilinestrings mischen, automatisch zu befördern. Kann hilfreich sein, wenn Sie Shapefiles in PostGIS und andere Zieltreiber konvertieren, die strenge Prüfungen für Geometrietypen implementieren.

Mit anderen Worten, wenn Sie das PROMOTE_TO_MULTIFlag verwenden, werden ALLE Ihre Features in mehrteilige Features konvertiert, auch wenn sie aus einem einzigen Teil bestehen. Wie von @LeeHachadoorian in den Kommentaren erwähnt - und ich bin sicher, dass die meisten zustimmen -, wird empfohlen, PROMOTE_TO_MULTIdas lockerere GEOMETRYFlag vorzuziehen , da es den bewährten Methoden entspricht und die Feature-Geometrien in Ihrer Tabelle vereinheitlicht. Grundsätzlich sollte jeder Code, den Sie schreiben, nur mehrteilige Geometrien erwarten. Dies kann zugegebenermaßen sauberer sein und einen Teil der Entwicklung vereinfachen.

Allgemeiner Rat für jemanden, der Probleme mit dem POST-Import eines SHP hat

  1. Stellen Sie sicher, dass Ihre Pfade keine irren Zeichen enthalten und dass weder im Pfad noch im Dateinamen Tippfehler oder Rechtschreibfehler enthalten sind
  2. Stellen Sie, wie @ user1919 feststellte, sicher, dass Ihr Betriebssystembenutzer über ausreichende Berechtigungen für den Zugriff auf das Shapefile verfügt! Wie gezeigt, kann es hilfreich sein, das Shapefile in einer anderen Software wie QGIS zu öffnen. Wenn es in einer Software funktioniert, ist es nicht beschädigt und sollte in einer anderen Software funktionieren.

Erwägen Sie zunächst, den Befehl ogr2ogr auszuführen sudo, um Berechtigungsprobleme auszuschließen, bis Sie sicher sind, dass Ihr Skript wie beabsichtigt funktioniert.

  1. Stellen Sie, wie @ user1919 erkannt hat, sicher, dass Ihr SQL-Benutzer über ausreichende Berechtigungen sowohl für die Datenbank, auf die sich Ihr Skript bezieht, als auch für die spatial_ref_sysTabelle verfügt.

Ziehen Sie zunächst die Verwendung des PostGRESql-Superuser in Betracht, um SQL-Berechtigungsprobleme auszuschließen, bis Ihr Skript funktioniert. Wenn Ihr Skript mit dem Superuser funktioniert und dann mit einem bevorzugten Automatisierungsbenutzer fehlschlägt, wissen Sie, dass das Problem mit dem SQL-Benutzer zusammenhängt und nicht mit Ihren Daten oder Ihrer Umgebung (Installation von gdal / ogr usw.).

  1. Setzen Sie die -nltFlagge entweder auf PROMOTE_TO_MULTIoder GEOMETRY. Da Shapefiles eine lockerere Konvention für Feature-Typen zulassen, müssen Sie Ihre Open Source-Dienstprogramme manchmal anweisen, unterhaltsamer zu sein :)

  2. Wenn Sie PostgreSQL oder MySQL importieren, versuchen Einstellung -lco PRECISION=no..fair Warnung, ich weiß nicht genau verstehen , was dieses Argument tut, aber hier ist das, was ich erlebt habe .. Wie Sie wissen, sind Shape - Dateien häufig die SHAPE_LENGTHund SHAPE_AREAFelder, und ich Ich habe manchmal bemerkt, dass ich bei mysteriösen Fehlern die Daten korrekt importieren kann, wenn ich diese Felder lösche. Wenn ich jedoch verwende -lco PRECISION=no, kann ich die Daten importieren, ohne diese Felder löschen zu müssen. Ich empfehle, diesen Parameter als Fehlerbehebungsschritt zu verwenden, aber zu verstehen, welches Problem tatsächlich behoben wird, bevor Sie den Import in eine Produktionslösung akzeptieren.

  3. Wenn Sie MySQL verwenden, beachten Sie, dass einige sehr große Feature-Geometrien den MySQL- max_allowed_packetParameter verletzen können . Weitere Informationen hierzu finden Sie in der Dokumentation zum MySQL-Treiber . Die Lösung besteht jedoch darin, Ihre MySQL-Konfiguration so zu ändern, dass ein Wert zulässig ist, der über dem Standardwert liegt.

Beispiel SHP to PostGIS-Importbefehl für ogr2ogr

Für alle Neulinge, die hier durchwandern, sehen die meisten meiner SHP to Post-Importe so aus, als würden sie ogr2ogr verwenden. Beachten Sie, dass ich Dateipfade / -namen in Anführungszeichen einfüge. Dies schützt vor Leerzeichen, seltsamen Zeichen und Zeilenumbrüchen im Terminal. Außerdem habe ich die meisten der oben diskutierten Argumente eingefügt, zusätzlich zu den Überschreibungen für das Geometrienamensfeld, das FID-Feld und der Layername:

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

Elrobis
quelle
3
In Bezug auf -nlt PROMOTE_TO_MULTI, das ist wirklich eine bewährte Methode für Polygon - Geometrien. Ich würde vorschlagen, Ihre Antwort zu ändern, um dies als starke Standardauswahl zu empfehlen, die nach sorgfältiger Überlegung verletzt werden sollte. Ich würde auch dringend davon abraten, den generischen geometryTyp für gemischte Polygone / Multipolygone zu verwenden, es sei denn, der Benutzer / Entwickler weiß wirklich, was er tut und muss Polygon-, Linien- und Punkttypen mischen.
Lee Hachadoorian
1
@LeeHachadoorian, einverstanden. Ich habe die Antwort wie empfohlen bearbeitet. Zu meiner Verteidigung PROMOTE_TO_MULTIist neu genug (GDAL 1.10), dass ich immer noch die ursprüngliche Lösung verwende, die verfügbar war, als ich damit angefangen habe. :) ..um ehrlich zu sein, ein Shapefile wird nur Single- und Multipart-Typen kombinieren, daher würde es niemals ein Szenario geben, in dem ogr2ogr einen SHP durchdrückt -nlt GEOMETRYund eine Tabelle mit Punkten, Linien und Polys erstellt :))))) Ich stimme jedoch Ihrer Position in dieser Angelegenheit vollkommen zu.
Elrobis
1
Shapefiles erlauben mehrere Polygone in ihrem Polygontyp. Sie haben nicht einmal MultiPolygon-Typ. Selbst wenn man auf diese Art von Formdatei stößt, muss man sie verwenden -nlt PROMOTE_TO_MULTI, damit sie funktioniert.
CMCDragonkai