7 votos

¿Conflicto entre ArcPy y GDAL/OGR?

TL;DR

Yo no puede tener una instalación de la versión gratuita de GDAL/OGR a trabajar desde dentro de ArcMap 10.0. Puedo obtener un ImportError: DLL load failed a _mod = imp.load_module('_gdal', fp, pathname, description).

A continuación, más detalles sobre el contexto y un procedimiento sobre cómo reproducir el error.


Alguien en los comentarios especificado que arcpy y GDAL funcionan bien juntos en su máquina. ¿Cuáles podrían ser las diferencias entre nuestras configuraciones (software instalado, variables de entorno, ...)?

Descripción de mi problema

Lo que estoy tratando de hacer...

Quiero implementar un ArcMap 10.0 caja de herramientas con scripts que utilizan las bibliotecas externas. Me gustaría evitar tener cualquier manipulación que se hace en el lado del usuario: idealmente, ninguna instalación adicional/manipulación debe ser requerido por el usuario. Por esa razón, puedo incluir a las bibliotecas de los archivos dentro de la caja de herramientas.

Lo que mi problema es...

Cuando trato de usar gdal/ogr de osgeo junto con arcpy, me sale el siguiente error:

Traceback (most recent call last):
  File "path_to_script\debugDepl.py", line 32, in <module>
    from osgeo import ogr
  File "path_to_script\osgeo\__init__.py", line 30, in <module>
    _gdal = swig_import_helper()
  File "path_to_script\osgeo\__init__.py", line 26, in swig_import_helper
    _mod = imp.load_module('_gdal', fp, pathname, description)
ImportError: DLL load failed: The specified procedure could not be found.

Hay algunos unión errores que no entiendo. Parece que hay un conflicto entre arcpy y gdal/ogr (más información a continuación)

Relacionado con:


Cómo reproducir el error

Si usted me puede ayudar a lograr quiero quiero, puede ser útil si me explique cada paso que conducen a este error. He intentado detallar tanto como pude para que usted pueda reproducirlo.

1/ En un Windows 7 de 64 bits de la máquina, Instalar ArcGIS Desktop 10.0 (32 bits)

2/ Descargar GDAL-1.11.0.win32-py2.6.exe binarios de Windows

3/ Instalar la biblioteca con su instalación de Python

4/ Mover la asociada archivos de biblioteca (path_to_python_install\Python26\ArcGIS10.0\Lib\site-packages) a otra carpeta nueva (osgeo carpeta + varios archivos de Python)

5/ Crear una secuencia de comandos de Python en esa carpeta y editar en su favorito de Python editor y comprobar que se puede importar gdal/ogr

from osgeo import gdal
from osgeo import ogr

6/ Trate de la importación de arcpy de la secuencia de comandos antes y después de la importación de gdal/ogr

from osgeo import ogr
from osgeo import gdal 
import arcpy

Que debería de funcionar, ahora a tratar de la otra manera

import arcpy
# Maybe some environment variable settings
from osgeo import ogr
from osgeo import gdal

Y que versión debería crear el error.

7/ Crear una caja de herramientas (o llame a la secuencia de comandos desde dentro de ArcMap) con la versión que trabajó de forma independiente. Y tratar de ejecutarlo dentro de ArcMap (falla).

Notas sobre los pasos

1/ he encontrado algunos oficial de Python bindings pero sólo para ArcMap 10.1

2/ Esta distribución incluye un completo GDAL de la instalación. Es una versión de 32 bits para mi versión de 32 bits de Python26.

4/ Como se especifica en estas recomendaciones para los scripts de implementación, que debo copiar los archivos de la biblioteca directamente. Quiero evitar que el usuario tenga que instalar las cosas tanto como sea posible

5/ Esto puede (o no) de requerir alguna configuración de variables de entorno:

import os
environList = os.environ['PATH'].split(';')
environList.insert(0, r'path_to_folder\osgeo')
os.environ['PATH'] = ';'.join(environList)
os.environ['GDAL_DATA'] = r'path_to_folder\osgeo\data\gdal'

GDAL Documentación especifica que se debe:

  • Agregar el directorio bin de la carpeta a la RUTA del sistema, recuerda poner un punto y coma delante de ella antes de agregar a la ruta existente.
  • Crear un nuevo usuario o variable de sistema con los datos de la carpeta de tu instalación.

Los desarrolladores en esta página del blog parecía tener ese error cuando las variables de entorno son incorrectas.

6/ parece que, por alguna razón, si la importación de arcpy primera y ogr/gdal segundo, gdal ya no es capaz de encontrar la dll que se requiere. Esto podría haber sido debido a una cierta configuración de variables de entorno, pero la modificación propuesta en el paso 5) no cambiar nada.

7/ Pero mi conjetura es que arcpy se importan automáticamente (primero) así que estamos de vuelta a la versión 2 de 6)

Algo más de información acerca de mi intento de entender lo que está pasando

De PyScripter:

>>> from osgeo import gdal
>>> gdal.__file__
'C:\\Python26\\ArcGIS10.0\\lib\\site-packages\\osgeo\\gdal.pyc'
>>> import arcpy
>>> arcpy.__file__
'C:\\Program Files (x86)\\ArcGIS\\Desktop10.0\\arcpy\\arcpy\\__init__.pyc'

Bien, los archivos de la biblioteca se encuentra en el lugar donde se supone que deben ser. Pero entonces...

>>> import arcpy
>>> from osgeo import gdal
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python26\ArcGIS10.0\lib\site-packages\osgeo\__init__.py", line 29, in <module>
    _gdal = swig_import_helper()
  File "C:\Python26\ArcGIS10.0\lib\site-packages\osgeo\__init__.py", line 25, in swig_import_helper
    _mod = imp.load_module('_gdal', fp, pathname, description)
ImportError: DLL load failed: The specified procedure could not be found.

Tal vez algo que sucedió a las variables de entorno o a la de python path cuando la importación de Arcpy? Bueno, parece que no...

>>> import os
>>> import sys
>>> envBefore = os.environ
>>> pyPathBefore = sys.path
>>> import arcpy
>>> envAfter = os.environ
>>> pyPathAfter = sys.path
>>> envBefore == envAfter
True
>>> pyPathBefore == pyPathAfter
True

Gracias por llegar al final de ese largo post.

3voto

csmba Puntos 2440

Sospecho que el problema es el GDAL 1.11 enlaces se está recuperando de gohlke no coinciden con los internos GDAL el interior del Arco*. Los enlaces deben ser compilados en contra de ESRI GDAL para trabajar de forma fiable. Es posible que se puede hacer para trabajar, pero va a ser un montón de dolores de cabeza.

En resumen, ESRI debe proporcionar la gdal_i.lib archivo de código auxiliar que GDAL genera como parte de su proceso de compilación, y que necesita para construir los enlaces Python en contra de eso. No sé que ESRI proporciona esto, sin embargo.

Tal vez ESRI podría ser requerido para proporcionar un gdal.py y GDAL enlaces como parte de ArcPy? Alternativamente, tal vez usted podría utilizar Fiona y rasterio para replicar el GDAL los enlaces de las piezas que necesita. Estos tienen la ventaja de no necesitar enlace en contra de la ESRI GDAL y en su lugar se puede utilizar haciendo llamadas a la API de C directamente en el archivo DLL.

1voto

Steven Parkes Puntos 625

Gdal PYthon obras de enlace con conjura con gdal. Usted necesita tener instalado GDAL junto con el enlace a la obra.

Una rápida descremada sobre los errores que siempre que sugieren que mientras instalado gdal-python no se ha instalado el gdal por sí mismo:

Una de las posibles soluciones de la cadena es:

  1. Instalar GDAL (http://www.gisinternals.com/sdk/)
  2. Anexar la ruta de instalación para el "CAMINO" de la variable para su equipo
  3. A continuación, instale gdal-python para cualquier python intérpretes que usted está utilizando (incluyendo arcgis)

Un tutorial más en profundidad puede verse aquí.

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