19 votos

Importar un shapefile a postgis con ogr2ogr da: No se puede abrir la fuente de datos

Quiero utilizar ogr2ogr para importar un shapefile en una base de datos postgis. He instalado correctamente ogr2ogr y ejecuto desde el pgsql el siguiente comando:

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

Lo que obtengo 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 he intentado definir la ruta completa del archivo shapefile pero me aparece el mismo mensaje.

También traté de ejecutar el:

ogrinfo world_boundaries.shp

Es lo mismo.


Después de solucionar los problemas con los permisos del archivo me 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 he intentado importarlo a través de la GUI shp2pgsql y me da 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 era que este usuario de la base de datos no tenía suficientes permisos. 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)

Así que parece que tengo que utilizar 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 utilizando la GUI shp2pgsql.


El comentario de @elrobis ha permitido que por fin funcione. Los datos se han cargado correctamente en la base de datos.

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

0 votos

Parece que tu shapefile no es válido. ¿Funciona en otro software?

1 votos

Sí, se carga correctamente en QGIS.

0 votos

Yo volvería a comprobar la ruta a world_boundaries.shp.

28voto

warsze Puntos 178

Como descubrió por ensayo y error, había algunos problemas persistentes que tenía que solucionar, el último de los cuales se resolvió utilizando ogr2ogr's -nlt GEOMETRY * argumento.

* Nótese la recomendación en el comentario de @LeeHachadoorian de que <code>-nlt PROMOTE_TO_MULTI</code> como solución por defecto, en lugar de <code>nlt GEOMETRY</code> ya que la primera fomenta las buenas prácticas además de los beneficios secundarios.

Permisos de usuario y mensajes de error

En primer lugar, ogr2ogr no podía abrir su shapefile, y se dio cuenta de que los problemas de permisos estaban afectando al usuario del sistema operativo que accedía a su shapefile. Pero hay una lección importante aquí para otros, específicamente, El mensaje de error de ogr2ogr sobre este punto era engañoso. De hecho, uno de los primeros comentaristas pensó que su archivo shapefile no era válido, y hay que admitir que 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 sido un carácter no convencional en la ruta del archivo-como un espacio-que estaba rompiendo la capacidad de ogr2ogr para apuntar al archivo shapefile. Como usted descubrió, en realidad era sólo un problema con los permisos de usuario. Debido a que el mensaje de error crea una pista falsa, esta es una posibilidad que otros necesitan tener en mente :)

Privilegios de usuario SQL y fallos misteriosos

Yo habría estado perplejo por tu segundo error durante un tiempo, pero al probar tu usuario SQL con una utilidad de importación diferente (shp2pgsql), que era inteligente, obtuviste un mensaje de error más preciso y le diste a tu usuario SQL los privilegios necesarios en el archivo spatial_ref_sys mesa. Por lo tanto, si alguien tiene dificultades para conseguir que su instrucción de importación ogr2ogr funcione correctamente, debe asegurarse de que su usuario SQL tiene privilegios suficientes tanto en la propia base de datos y la tabla 'spatial_ref_sys'.

Tipos de geometría mixta y buenas prácticas

El último obstáculo con el que te has encontrado parece estar relacionado con el hecho de que los shapefiles permiten la coexistencia de geometrías de una y varias partes en el mismo conjunto de datos/archivo. Se considera una mala práctica mezclar tipos de geometría en la misma tabla, incluso para geometrías simples/multiparte del mismo tipo de característica, y por defecto, los reproductores de código abierto de tu cadena de herramientas intentarán protegerte de la mezcla de tipos de geometría. Afortunadamente, sin embargo, te dan algunas opciones. Inicialmente recomendé establecer el -nlt GEOMETRY * en su instrucción ogr2ogr, lo que le permitió importar su conjunto de datos de polígonos a pesar de la convención más laxa de ESRI. Tenga en cuenta, sin embargo, que esto significa que es probable que tenga geometrías tanto de una sola parte como de varias partes en su tabla, lo que puede crearle otros dolores de cabeza más adelante.

Vale la pena mencionar que ogr2ogr tiene otro -nlt opción que debería considerar, a saber PROMOTE_TO_MULTI . Para citar la documentación ..

A partir de GDAL 1.10, PROMOTE_TO_MULTI puede utilizarse para promover automáticamente promover capas que mezclan polígonos o multipolígonos a multipolígonos, y capas que mezclan cadenas de líneas o multilíneas a multilíneas. Puede ser útil al convertir archivos shape a PostGIS y otros controladores de destino que implementan comprobaciones estrictas de los tipos de geometría.

En otras palabras, si utiliza la función PROMOTE_TO_MULTI bandera, entonces TODOS de sus características se convertirán en características multiparte, incluso cuando consten de una sola parte. Como señala @LeeHachadoorian en los comentarios -y estoy seguro de que la mayoría estará de acuerdo- se aconseja preferir PROMOTE_TO_MULTI sobre el más flojo GEOMETRY ya que se ajusta a las mejores prácticas, unificando las geometrías de las características en su tabla. Básicamente, cualquier código que escriba debería esperar geometrías multiparte. Hay que admitir que esto puede ser más limpio y simplificar parte del desarrollo.

Consejo genérico para alguien que tiene problemas con una importación de SHP a POST

  1. Asegúrese de que sus rutas no contengan caracteres extraños y que no haya errores tipográficos ni ortográficos ni en la ruta ni en el nombre de archivo
  2. Como descubrió @user1919, asegúrese de que el usuario de su sistema operativo tiene suficientes privilegios para acceder al archivo shapefile. privilegios suficientes para acceder al shapefile. Como demostraron, puede intentar abrir el shapefile 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 como sudo para descartar problemas de permisos hasta que esté seguro de que su script funciona como es debido.

  1. También como @user1919 se dio cuenta, asegúrese de que su usuario SQL tiene privilegios suficientes tanto en la base de datos objetivo de su script, así como el spatial_ref_sys mesa.

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

  1. Pruebe a configurar el -nlt a PROMOTE_TO_MULTI ou GEOMETRY . Dado que los shapefiles permiten una convención de tipos de características menos estricta, a veces hay que dar instrucciones a las utilidades de código abierto para que se adapten mejor :)

  2. Si está importando a PostGRESql o MySQL, intente configurar -lco PRECISION=no ..aviso, no entiendo exactamente lo que hace este argumento, pero esto es lo que he experimentado.. Como usted sabe, shapefiles a menudo incluyen la SHAPE_LENGTH y SHAPE_AREA y me he dado cuenta de que a veces, cuando tengo fallos misteriosos, si borro esos campos consigo que los datos se importen correctamente. Sin embargo, si utilizo -lco PRECISION=no Puedo conseguir que los datos se importen sin tener que borrar esos campos. Mi recomendación es utilizar este parámetro como un paso de solución de problemas, pero para entender qué problema está resolviendo realmente antes de aceptar la importación en una solución de producción.

  3. Por último, si utiliza MySQL, tenga en cuenta que algunas geometrías de características muy grandes pueden ofender a MySQL. max_allowed_packet parámetro. Puede obtener más información en la documentación del controlador MySQL .. pero la solución es cambiar la configuración de MySQL para permitir un valor mayor que el predeterminado.

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

Para cualquier novato que pueda vagar por aquí, esto es lo que la mayoría de mis SHP a Post importaciones parecen utilizando ogr2ogr. Nótese que las rutas/nombres de los archivos están entre comillas, esto protege contra espacios, caracteres extraños, y saltos de línea en la terminal también he incluido la mayoría de los argumentos discutidos anteriormente, además de anulaciones para el campo del nombre de la 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

3 votos

En relación con -nlt PROMOTE_TO_MULTI Esta es realmente la mejor práctica para geometrías poligonales. Yo sugeriría cambiar su respuesta para aconsejar esto como una fuerte opción por defecto, sólo para ser violado después de una cuidadosa consideración. También me gustaría desaconsejar el uso de la genérica geometry para manejar tipos mixtos polígono/multipolígono, a menos que el usuario/desarrollador realmente sepa lo que está haciendo y necesite mezclar tipos de polígono, línea y punto.

1 votos

@LeeHachadoorian, de acuerdo. He editado la respuesta como se recomienda. En mi defensa, PROMOTE_TO_MULTI es lo suficientemente nuevo (GDAL 1.10) como para que siga utilizando por defecto la solución original que estaba disponible cuando me inicié en todo esto. :) para ser justos, sin embargo, un shapefile sólo se combinan los tipos individuales y multiparte, por lo que nunca habría un escenario en el que ogr2ogr empujaría un shp a través de -nlt GEOMETRY y construir una tabla con puntos, líneas y polis :))))) Sin embargo estoy completamente de acuerdo con tu postura al respecto.

1 votos

Los Shapefiles permiten múltiples polígonos en su tipo Polígono. Ni siquiera tienen el tipo MultiPolygon. Así que incluso cuando sólo se encuentra este tipo de archivo de forma, es necesario utilizar -nlt PROMOTE_TO_MULTI para que esto funcione.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X