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
quelle
-nln layername
Argument hinzu. vielleicht zusammen mit, um-overwrite
zu sehen, ob es zum Leben kommt. Wenn ich Sie wäre, würde ich ogr2ogrsudo
zusammen 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. :)Antworten:
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_MULTI
die als Standardlösung verwendet werden soll und nichtnlt 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_sys
Tabelle 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
-nlt
Option hat, die Sie in Betracht ziehen sollten, nämlichPROMOTE_TO_MULTI
. Um die Dokumentation zu zitieren ..Mit anderen Worten, wenn Sie das
PROMOTE_TO_MULTI
Flag 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_MULTI
das lockerereGEOMETRY
Flag 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
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.spatial_ref_sys
Tabelle 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.).
Setzen Sie die
-nlt
Flagge entweder aufPROMOTE_TO_MULTI
oderGEOMETRY
. Da Shapefiles eine lockerere Konvention für Feature-Typen zulassen, müssen Sie Ihre Open Source-Dienstprogramme manchmal anweisen, unterhaltsamer zu sein :)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 dieSHAPE_LENGTH
undSHAPE_AREA
Felder, 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.Wenn Sie MySQL verwenden, beachten Sie, dass einige sehr große Feature-Geometrien den MySQL-
max_allowed_packet
Parameter 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
quelle
-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 generischengeometry
Typ 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.PROMOTE_TO_MULTI
ist 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 GEOMETRY
und eine Tabelle mit Punkten, Linien und Polys erstellt :))))) Ich stimme jedoch Ihrer Position in dieser Angelegenheit vollkommen zu.-nlt PROMOTE_TO_MULTI
, damit sie funktioniert.