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
- 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
- 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.
- 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.).
-
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 :)
-
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.
-
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
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.
0 votos
¿Tiene todos los demás componentes del shapefile (world_boundaries.shx, world_boundaries.dbf, etc.)?
0 votos
Veo que el problema estaba relacionado con los permisos. He cambiado los permisos de los archivos. Ahora me da otro error. He editado mi pregunta.
0 votos
¿Puede probarlo con
-nlt GEOMETRY
en lugar de-nlt POLYGON
..?1 votos
También, asumiendo que su DB ya existe y que está escrito correctamente en su instrucción ogr2ogr, y que el usuario postgres en el comando tiene el complemento completo de privilegios necesarios (SELECT, INSERT, UPDATE, CREATE.. etc), intente añadir el comando
-nln layername
argumento, tal vez junto con-overwrite
para ver si cobra vida. Además, si yo fuera usted, me gustaría ejecutar ogr2ogr comosudo
junto con mi superusuario postgres solo para estar super super seguro de descartar permisos y privilegios. Una vez que su script es sólido, entonces usted puede picotear lejos en los permisos y privilegios molestos. :)3 votos
Gracias. Añadiendo -nlt GEOMETRY en lugar de -nlt POLYGON funcionó.
1 votos
Me alegro de que funcionara. Voy a seguir adelante y hacer una respuesta adecuada en una respuesta que también describe por qué creo que funcionó.
0 votos
@user1919, ¿cómo has resuelto el problema "Unable to find datasource" para conectarte a PostgreSQL?
0 votos
Desinstalar el paquete gdal de python me funciona.