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 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_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 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_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 prefiera PROMOTE_TO_MULTI
la GEOMETRY
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
- 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
- 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 sudo
para descartar problemas de permisos hasta que sepa con certeza que su script está funcionando según lo previsto.
- 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_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 en PROMOTE_TO_MULTI
o 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 :)
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_LENGTH
y los SHAPE_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