Importar un archivo de forma a postgis con ogr2ogr da: No se puede abrir el origen de datos

12

Quiero usar ogr2ogr para importar un shapefile en una base de datos postgis. He instalado con éxito ogr2ogr y ejecuto desde pgsql el siguiente comando:

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

Lo que recibo es un mensaje de error:

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

También intenté definir la ruta completa del archivo de forma pero recibí el mismo mensaje.

También intenté ejecutar el:

ogrinfo world_boundaries.shp

La misma cosa.


Después de solucionar los problemas con los permisos del archivo, aparece el siguiente error:

  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)

También intenté importarlo a través de la GUI shp2pgsql y recibí el siguiente error:

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.

El problema esta vez fue que este usuario de la base de datos no tenía permisos suficientes. Esto lo solucionó:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

El siguiente mensaje de error es:

  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)

Entonces parece que necesito usar el parámetro: -nlt MULTIPOLYGON Pero cuando lo hago, obtengo otro error, que no tiene ningún sentido para mí:

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

Pero se carga usando la GUI shp2pgsql.


El comentario de @elrobis permitió que esto finalmente funcionara. ¡Datos cargados en db correctamente!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp
usuario1919
fuente
Parece que tu shapefile no es válido. ¿Funciona en otro software?
Evil Genius
1
Si. Está cargado correctamente en QGIS.
usuario1919
1
Además, suponiendo que su base de datos ya existe y que está escrita correctamente en su instrucción ogr2ogr, y que el usuario postgres en el comando tiene el complemento completo de los privilegios necesarios (SELECCIONAR, INSERTAR, ACTUALIZAR, CREAR ... etc.), intente agregar el -nln layernameargumento, quizás junto con -overwritepara ver si se trata de la vida. Además, si fuera usted, ejecutaría ogr2ogr sudojunto con mi superusuario de postgres solo para estar súper seguro de descartar permisos y privilegios. Una vez que su script es sólido, puede obtener los molestos permisos y privilegios. :)
elrobis
3
Gracias. Agregar -nlt GEOMETRY en lugar de -nlt POLYGON hizo el truco.
user1919
1
Me alegro de que funcionó. Seguiré adelante y daré una respuesta adecuada en una respuesta que también describe por qué creo que funcionó.
elrobis

Respuestas:

17

Como descubrió por prueba y error, había pocos problemas molestos que necesitaba solucionar, el último de los cuales se resolvió usando el argumento -nlt GEOMETRY* de ogr2ogr .

* Tenga en cuenta la recomendación en el comentario de @ LeeHachadoorian que -nlt PROMOTE_TO_MULTIdebe usarse como una solución predeterminada, en lugar de hacerlo nlt GEOMETRY, ya que la primera promueve las mejores prácticas además de los beneficios complementarios.

Permisos de usuario y mensajes de error

Primero, ogr2ogr no pudo abrir su archivo de forma, y ​​se dio cuenta de que los problemas de permisos estaban afectando al usuario del sistema operativo que accede a su archivo de forma. Pero hay una lección importante aquí para otros, específicamente, ¡el mensaje de error de ogr2ogr en este punto fue engañoso! De hecho, uno de los primeros comentaristas pensó que su archivo de forma no era válido, y admito, mi primera suposición fue que probablemente había un error / error tipográfico en la ruta / nombre de archivo, o que podría haber un carácter no convencional en la ruta del archivo, como un espacio: eso estaba rompiendo la capacidad de ogr2ogr de señalar el archivo de forma. Como descubrió, en realidad era solo un problema con los permisos de los usuarios. Debido a que el mensaje de error crea un arenque rojo, esta es una posibilidad que otros deben tener en cuenta. :)

Privilegios de usuario SQL y fallas misteriosas

Su segundo error me hubiera dejado perplejo por un tiempo, pero al probar a su usuario de SQL con una utilidad de importación diferente (shp2pgsql), que era inteligente, obtuvo un mensaje de error más preciso y le dio a su usuario de SQL los privilegios necesarios sobre la spatial_ref_sysmesa. Por lo tanto, alguien que tenga dificultades para que su instrucción de importación ogr2ogr funcione correctamente debe asegurarse de que su usuario SQL tenga privilegios suficientes tanto en la base de datos como en la tabla 'spatial_ref_sys'.

Tipos de geometría mixta y mejores prácticas

El último obstáculo que encontró parece estar relacionado con el hecho de que los archivos de forma permiten que las geometrías de una o varias partes coexistan en el mismo conjunto de datos / archivo. Se considera una mala práctica mezclar tipos de geometría en la misma tabla, incluso para una / varias partes del mismo tipo de función, y de forma predeterminada, los jugadores de código abierto en su cadena de herramientas tratarán de protegerlo de mezclar tipos de geometría. Afortunadamente, sin embargo, te dan algunas opciones. Inicialmente, recomendé establecer el argumento -nlt GEOMETRY* en su instrucción ogr2ogr, lo que le permitió importar su conjunto de datos poligonales a pesar de la convención más flexible de ESRI. Sin embargo, tenga en cuenta que esto significa que probablemente tenga geometrías de una sola parte y de varias partes en su tabla, ¡y eso puede crear otros dolores de cabeza para su posterior!

Vale la pena mencionar que ogr2ogr tiene otra -nltopción que debe considerar, a saber PROMOTE_TO_MULTI. Para citar la documentación ...

Comenzando con GDAL 1.10, PROMOTE_TO_MULTI se puede usar para promover automáticamente capas que mezclan polígonos o multipolígonos a multipolígonos, y capas que mezclan cadenas lineales o multilíneas a multilíneas. Puede ser útil al convertir archivos de forma a PostGIS y otros controladores de destino que implementan comprobaciones estrictas para los tipos de geometría.

En otras palabras, si usa la PROMOTE_TO_MULTIbandera, TODAS sus características se convertirán en características de varias partes, incluso cuando consistan en una sola parte. Como señaló @LeeHachadoorian en los comentarios, y estoy seguro de que la mayoría estaría de acuerdo, se recomienda que prefiera PROMOTE_TO_MULTIla GEOMETRYbandera más flexible , ya que se ajusta a las mejores prácticas, unificando las geometrías de entidades en su tabla. Básicamente, cualquier código que escriba debería esperar geometrías multiparte. Es cierto que esto puede ser más limpio y simplificar parte del desarrollo.

Asesoramiento genérico para alguien que tiene problemas con un SHP para publicar la importación

  1. Asegúrese de que sus rutas no tengan caracteres extraños y que no haya errores tipográficos ni de ortografía en la ruta ni en el nombre del archivo
  2. Como descubrió @ user1919, ¡asegúrese de que su usuario del sistema operativo tenga privilegios suficientes para acceder al archivo de forma! Como demostraron, puede ayudar intentar abrir el archivo de forma en otro software, como QGIS: si funciona en un software, entonces no está dañado y debería funcionar en otro software.

Al principio, considere ejecutar su comando ogr2ogr sudopara descartar problemas de permisos hasta que sepa con certeza que su script está funcionando según lo previsto.

  1. También como se dio cuenta @ user1919, asegúrese de que su usuario de SQL tenga privilegios suficientes tanto en la base de datos a la que apunta su script como en la spatial_ref_systabla.

Nuevamente, al principio, considere usar el superusuario PostGRESql aquí para descartar problemas de privilegios de SQL hasta que su script esté funcionando. Si su script funciona con el superusuario y luego falla con un usuario de automatización preferido, sabe que el problema está relacionado con el usuario de SQL y no con sus datos o su entorno (instalación de gdal / ogr, etc.)

  1. Intente configurar la -nltbandera en PROMOTE_TO_MULTIo GEOMETRY. Dado que los archivos de forma permiten una convención de tipo de característica más flexible, a veces tienes que instruir a tus utilidades de código abierto para que sean más complacientes :)

  2. Si va a importar a PostgreSQL o MySQL, intente establecer -lco PRECISION=no..fair advertencia, no entiendo exactamente lo que hace este argumento, pero esto es lo que he experimentado .. Como saben, archivos de formas a menudo incluyen las SHAPE_LENGTHy los SHAPE_AREAcampos, y yo A veces me doy cuenta cuando estoy experimentando fallas misteriosas, si elimino esos campos puedo hacer que los datos se importen correctamente. Sin embargo, si lo uso -lco PRECISION=no, puedo obtener los datos para importar sin tener que eliminar esos campos. Mi recomendación es utilizar este parámetro como un paso de solución de problemas, pero para comprender qué problema está resolviendo realmente antes de aceptar la importación en una solución de producción.

  3. Finalmente, si está usando MySQL, tenga en cuenta que algunas geometrías de características muy grandes pueden ofender el max_allowed_packetparámetro de MySQL . Puede leer más sobre esto en la documentación del controlador MySQL ... pero la solución es cambiar su configuración de MySQL para permitir un valor mayor que el predeterminado.

Ejemplo de SHP para el comando de importación PostGIS para ogr2ogr

Por el bien de cualquier novato que pueda pasear por aquí, esto es lo que parece la mayoría de mis importaciones de SHP para publicar usando ogr2ogr. Tenga en cuenta que envuelvo las rutas / nombres de archivo entre comillas, esto protege contra espacios, caracteres extraños y saltos de línea a través del terminal ... también he incluido la mayoría de los argumentos discutidos anteriormente, además de anulaciones para el campo de nombre de geometría, el Campo FID y el nombre de la capa:

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
fuente
3
En cuanto a -nlt PROMOTE_TO_MULTIesto, esta es realmente una mejor práctica para las geometrías de polígonos. Sugeriría cambiar su respuesta para recomendar esto como una opción fuerte por defecto, solo para ser violada después de una cuidadosa consideración. También recomendaría encarecidamente no usar el geometrytipo genérico para manejar polígonos / multipolígonos mixtos, a menos que el usuario / desarrollador realmente sepa lo que está haciendo y necesite mezclar tipos de polígonos, líneas y puntos.
Lee Hachadoorian
1
@LeeHachadoorian, de acuerdo. Edité la respuesta según lo recomendado. En mi defensa, PROMOTE_TO_MULTIes lo suficientemente nuevo (GDAL 1.10) que aún prefiero la solución original que estaba disponible cuando comencé con todo esto. :) .. para ser justos, sin embargo, un archivo de formas solo combinará tipos individuales y multiparte, por lo que nunca habría un escenario en el que ogr2ogr empujara un shp -nlt GEOMETRYy construyera una tabla con puntos, líneas y polys :))))) Sin embargo, estoy completamente de acuerdo con su posición al respecto.
elrobis
1
Los archivos de forma permiten múltiples polígonos en su tipo Polígono. Ni siquiera tienen el tipo MultiPolygon. Entonces, incluso cuando solo se encuentra con este tipo de archivo de formas, uno debe usar -nlt PROMOTE_TO_MULTIpara que esto funcione.
CMCDragonkai