Je souhaite utiliser ogr2ogr afin d'importer un fichier de formes dans une base de données postgis. J'ai installé avec succès ogr2ogr et j'exécute à partir du pgsql la commande suivante:
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp
Ce que je reçois est un message d'erreur:
Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)
J'ai également essayé de définir le chemin complet du fichier de formes mais j'ai reçu le même message.
J'ai aussi essayé de lancer:
ogrinfo world_boundaries.shp
Même chose.
Après avoir résolu les problèmes avec les autorisations du fichier, j'obtiens l'erreur suivante:
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)
J'ai également essayé de l'importer via l'interface graphique shp2pgsql et j'obtiens l'erreur suivante:
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.
Le problème cette fois était que cet utilisateur de base de données ne disposait pas des autorisations suffisantes. Cela l'a corrigé:
GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;
Le message d'erreur suivant est:
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)
Il semble donc que je doive utiliser le paramètre: -nlt MULTIPOLYGON Mais quand je le fais, j'obtiens une autre erreur, ce qui n'a aucun sens pour moi:
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
Mais il est chargé à l'aide de l'interface graphique shp2pgsql.
Le commentaire de @elrobis a finalement permis que cela fonctionne. Les données sont chargées correctement dans db!
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp
la source
-nln layername
argument, peut-être avec-overwrite
pour voir si cela prend vie. De plus, si j'étais vous, j'exécuterais ogr2ogr commesudo
avec mon superutilisateur postgres juste pour être super super certain d'exclure les autorisations et privilèges. Une fois que votre script est solide, vous pouvez picorer les autorisations et privilèges embêtants. :)Réponses:
Comme vous l'avez découvert par essais et erreurs, il y avait quelques problèmes lancinants que vous deviez résoudre, le dernier ayant été résolu en utilisant l' argument
-nlt GEOMETRY
* d'ogr2ogr .* Notez la recommandation dans le commentaire de @ LeeHachadoorian qui doit
-nlt PROMOTE_TO_MULTI
être utilisée comme solution par défaut, plutôt quenlt GEOMETRY
, car la première promeut les meilleures pratiques en plus des avantages accessoires.Autorisations utilisateur et messages d'erreur
Tout d'abord, ogr2ogr n'a pas pu ouvrir votre fichier de formes et vous avez réalisé que des problèmes d'autorisations affectaient en fait l'utilisateur du système d'exploitation accédant à votre fichier de formes. Mais il y a une leçon importante ici pour les autres, en particulier, le message d'erreur d'ogr2ogr sur ce point était trompeur! En effet, l'un des premiers commentateurs pensait que votre fichier de formes n'était pas valide, et il est vrai que ma première supposition était qu'il y avait probablement une erreur / faute de frappe dans le chemin / nom de fichier, ou qu'il pouvait y avoir un caractère non conventionnel dans le chemin du fichier - comme un l'espace - qui brisait la capacité d'ogr2ogr à pointer vers le fichier de formes. Comme vous l'avez découvert, ce n'était en fait qu'un problème avec les autorisations des utilisateurs. Parce que le message d'erreur crée un hareng rouge, c'est une possibilité que les autres doivent garder à l'esprit. :)
Privilèges utilisateur SQL et échecs mystères
J'aurais été bloqué par votre deuxième erreur pendant un certain temps, mais en testant votre utilisateur SQL avec un autre utilitaire d'importation (shp2pgsql), qui était intelligent, vous avez reçu un message d'erreur plus précis et donné à votre utilisateur SQL les privilèges nécessaires sur la
spatial_ref_sys
table. Ainsi, quelqu'un qui a du mal à faire fonctionner correctement son instruction d'importation ogr2ogr doit s'assurer que son utilisateur SQL dispose de privilèges suffisants sur la base de données elle - même et sur la table 'spatial_ref_sys'.Types de géométrie mixte et meilleures pratiques
Le dernier obstacle que vous avez rencontré semble lié au fait que les fichiers de formes permettent aux géométries à la fois uniques et multiples de coexister dans le même ensemble de données / fichier. Il est considéré comme une mauvaise pratique de mélanger les types de géométrie dans la même table, même pour un seul / plusieurs parties du même type d'entité, et par défaut, les lecteurs open source de votre chaîne d'outils essaieront de vous protéger contre le mélange des types de géométrie. Heureusement, cependant, ils vous offrent quelques options. Initialement, j'ai recommandé de définir l' argument
-nlt GEOMETRY
* sur votre instruction ogr2ogr, ce qui vous a permis d'importer votre jeu de données de polygones malgré la convention plus lâche d'ESRI. Soyez avisé cependant, cela signifie que vous avez probablement à la fois des géométries en une seule partie et en plusieurs parties dans votre table, et cela peut créer d'autres maux de tête pour votre futur!Il convient de mentionner que ogr2ogr a une autre
-nlt
option à considérer, à savoirPROMOTE_TO_MULTI
. Pour citer la documentation ..En d'autres termes, si vous utilisez l'
PROMOTE_TO_MULTI
indicateur, TOUTES vos fonctionnalités seront converties en fonctionnalités en plusieurs parties, même lorsqu'elles sont constituées d'une seule pièce. Comme indiqué par @LeeHachadoorian dans les commentaires - et je suis sûr que la plupart seraient d'accord - il est conseillé de préférerPROMOTE_TO_MULTI
leGEOMETRY
drapeau plus lâche , car il est conforme aux meilleures pratiques, unifiant les géométries des entités dans votre table. Fondamentalement, tout code que vous écrivez doit simplement attendre des géométries en plusieurs parties. Certes, cela peut être plus propre et simplifier une partie du développement.Conseils génériques pour une personne ayant des problèmes avec un SHP pour importer des POST
Dans un premier temps, envisagez d'exécuter votre commande ogr2ogr
sudo
pour exclure les problèmes d'autorisations jusqu'à ce que vous soyez certain que votre script fonctionne comme prévu.spatial_ref_sys
table.Encore une fois, dans un premier temps, envisagez d'utiliser le super utilisateur PostGRESql ici pour exclure les problèmes de privilèges SQL jusqu'à ce que votre script fonctionne. Si votre script fonctionne avec le superutilisateur puis échoue avec un utilisateur d'automatisation préféré, vous savez que le problème est lié à l'utilisateur SQL et non à vos données ou à votre environnement (installation de gdal / ogr, etc.)
Essayez de définir le
-nlt
drapeau surPROMOTE_TO_MULTI
ouGEOMETRY
. Étant donné que les fichiers de formes permettent une convention de type de fonctionnalité plus lâche, vous devez parfois demander à vos utilitaires open source d'être plus accommodants :)Si vous importez à MySQL ou PostGreSQL, essayez de
-lco PRECISION=no
..fair avertissement, je ne comprends pas exactement ce que cet argument fait, mais voici ce que j'ai vécu .. Comme vous le savez, shapefiles incluent souvent lesSHAPE_LENGTH
et lesSHAPE_AREA
champs, et je 'ai parfois remarqué lorsque je rencontrais des échecs mystères, si je supprime ces champs, je peux obtenir les données à importer correctement. Cependant, si j'utilise-lco PRECISION=no
, je peux obtenir les données à importer sans avoir à supprimer ces champs. Ma recommandation est d'utiliser ce paramètre comme étape de dépannage, mais pour comprendre quel problème il résout vraiment avant d'accepter l'importation dans une solution de production.Enfin, si vous utilisez MySQL, gardez à l'esprit que de très grandes géométries d'entités peuvent offenser le
max_allowed_packet
paramètre de MySQL . Vous pouvez en savoir plus à ce sujet dans la documentation du pilote MySQL .. mais la solution consiste à modifier votre configuration MySQL pour autoriser une valeur supérieure à la valeur par défaut.Exemple de commande d'importation SHP vers PostGIS pour ogr2ogr
Pour le bien des débutants qui pourraient se promener ici, voici à quoi ressemblent la plupart de mes importations SHP to Post en utilisant ogr2ogr. Notez que j'encapsule les chemins / noms de fichier entre guillemets, cela protège contre les espaces, les caractères étranges et les sauts de ligne sur le terminal. J'ai également inclus la plupart des arguments discutés ci-dessus, en plus des remplacements pour le champ de nom de la géométrie, le Champ FID et nom de couche:
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
la source
-nlt PROMOTE_TO_MULTI
ce qui concerne , c'est vraiment une meilleure pratique pour les géométries de polygones. Je suggérerais de changer votre réponse pour conseiller cela comme un choix par défaut fort, seulement pour être violé après un examen attentif. Je déconseille également fortement d'utiliser legeometry
type générique pour gérer des polygones / multipolygones mixtes, à moins que l'utilisateur / développeur ne sache vraiment ce qu'il fait et doit mélanger des types de polygones, de lignes et de points.PROMOTE_TO_MULTI
est assez nouveau (GDAL 1.10) pour que je continue par défaut à la solution d'origine qui était disponible lorsque j'ai commencé tout cela. :) .. en toute équité, cependant, un fichier de formes ne combinera que des types simples et multiparties, donc il n'y aurait jamais de scénario où ogr2ogr pousserait un shp à travers-nlt GEOMETRY
et construirait une table avec des points, des lignes et des polys :)))))) Cependant, je suis entièrement d'accord avec votre position sur la question.-nlt PROMOTE_TO_MULTI
pour que cela fonctionne.