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
fuente
-nln layername
argumento, quizás junto con-overwrite
para ver si se trata de la vida. Además, si fuera usted, ejecutaría ogr2ogrsudo
junto 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. :)Respuestas:
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_MULTI
debe usarse como una solución predeterminada, en lugar de hacerlonlt 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_sys
mesa. 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
-nlt
opción que debe considerar, a saberPROMOTE_TO_MULTI
. Para citar la documentación ...En otras palabras, si usa la
PROMOTE_TO_MULTI
bandera, 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 prefieraPROMOTE_TO_MULTI
laGEOMETRY
bandera 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
Al principio, considere ejecutar su comando ogr2ogr
sudo
para descartar problemas de permisos hasta que sepa con certeza que su script está funcionando según lo previsto.spatial_ref_sys
tabla.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.)
Intente configurar la
-nlt
bandera enPROMOTE_TO_MULTI
oGEOMETRY
. 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 :)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 lasSHAPE_LENGTH
y losSHAPE_AREA
campos, 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.Finalmente, si está usando MySQL, tenga en cuenta que algunas geometrías de características muy grandes pueden ofender el
max_allowed_packet
pará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
fuente
-nlt PROMOTE_TO_MULTI
esto, 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 elgeometry
tipo 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.PROMOTE_TO_MULTI
es 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 GEOMETRY
y construyera una tabla con puntos, líneas y polys :))))) Sin embargo, estoy completamente de acuerdo con su posición al respecto.-nlt PROMOTE_TO_MULTI
para que esto funcione.