L'importation d'un fichier de formes dans postgis avec ogr2ogr donne: Impossible d'ouvrir la source de données

12

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
user1919
la source
Il semble que votre fichier de formes ne soit pas valide. Fonctionne-t-il dans d'autres logiciels?
Evil Genius
1
Oui. Son chargé correctement dans QGIS.
user1919
1
En outre, en supposant que votre base de données existe déjà et qu'elle est correctement orthographiée dans votre instruction ogr2ogr, et que l'utilisateur postgres dans la commande dispose de tous les privilèges nécessaires (SELECT, INSERT, UPDATE, CREATE .. etc.), essayez d'ajouter l' -nln layernameargument, peut-être avec -overwritepour voir si cela prend vie. De plus, si j'étais vous, j'exécuterais ogr2ogr comme sudoavec 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. :)
elrobis
3
Merci. L'ajout de -nlt GEOMETRY au lieu de -nlt POLYGON a fait l'affaire.
user1919
1
Heureux que cela ait fonctionné. Je vais aller de l'avant et apporter une réponse appropriée dans une réponse qui décrit également pourquoi je pense que cela a fonctionné.
elrobis

Réponses:

17

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 que nlt 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_systable. 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 -nltoption à considérer, à savoir PROMOTE_TO_MULTI. Pour citer la documentation ..

À partir de GDAL 1.10, PROMOTE_TO_MULTI peut être utilisé pour promouvoir automatiquement des couches qui mélangent des polygones ou des multipolygones en multipolygones, et des couches qui mélangent des chaînes de lignes ou des chaînes multiples en chaînes multiples. Peut être utile lors de la conversion de fichiers de formes en PostGIS et autres pilotes cibles qui implémentent des contrôles stricts pour les types de géométrie.

En d'autres termes, si vous utilisez l' PROMOTE_TO_MULTIindicateur, 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érer PROMOTE_TO_MULTIle GEOMETRYdrapeau 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

  1. Assurez-vous que vos chemins ne contiennent aucun caractère génial et qu'il n'y a pas de fautes de frappe ou d'orthographe dans le chemin ou le nom de fichier
  2. Comme l'a découvert @ user1919, assurez-vous que votre utilisateur du système d'exploitation dispose de privilèges suffisants pour accéder au fichier de formes! Comme ils l'ont démontré, cela peut aider à essayer d'ouvrir le fichier de formes dans un autre logiciel, comme QGIS - s'il fonctionne dans un logiciel, il n'est pas corrompu et devrait fonctionner dans d'autres logiciels.

Dans un premier temps, envisagez d'exécuter votre commande ogr2ogr sudopour exclure les problèmes d'autorisations jusqu'à ce que vous soyez certain que votre script fonctionne comme prévu.

  1. Aussi, comme @ user1919 l'a réalisé, assurez-vous que votre utilisateur SQL dispose de privilèges suffisants sur la base de données ciblée par votre script, ainsi que sur la spatial_ref_systable.

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.)

  1. Essayez de définir le -nltdrapeau sur PROMOTE_TO_MULTIou GEOMETRY. É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 :)

  2. 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 les SHAPE_LENGTHet les SHAPE_AREAchamps, 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.

  3. Enfin, si vous utilisez MySQL, gardez à l'esprit que de très grandes géométries d'entités peuvent offenser le max_allowed_packetparamè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

elrobis
la source
3
En -nlt PROMOTE_TO_MULTIce 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 le geometrytype 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.
Lee Hachadoorian
1
@LeeHachadoorian, d'accord. J'ai édité la réponse comme recommandé. À ma défense, PROMOTE_TO_MULTIest 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 GEOMETRYet construirait une table avec des points, des lignes et des polys :)))))) Cependant, je suis entièrement d'accord avec votre position sur la question.
elrobis
1
Les fichiers de formes autorisent plusieurs polygones dans leur type de polygone. Ils n'ont même pas le type MultiPolygon. Ainsi, même lorsque vous rencontrez simplement ce type de fichier de forme, vous devez utiliser -nlt PROMOTE_TO_MULTIpour que cela fonctionne.
CMCDragonkai