Como adicionar suporte para o driver FileGDB (Esri file gdb API) no fiona?

12

Houve muitas perguntas sobre isso, mas nenhuma delas resolveu meu problema.

Eu tenho uma máquina com:

  • Windows 7 x64
  • Python 3.4.3 x64
  • gdal instalado: gdalinfo --version --> GDAL 1.11.4, released 2016/01/25; gdal foi instalado a partir de uma roda GDAL-1.11.4-cp34-none-win_amd64.whlde aqui

O GDAL está instalado no C:\Python34\Lib\site-packages\osgeo. Lá eu tenho um monte de arquivos .exe para arquivos gdal e ogr e .pyd.

  • fiona instalado: foi instalado a partir de uma roda Fiona-1.6.3-cp34-none-win_amd64.whl, no mesmo site.

Eu sou capaz de executar este código e ele executa com sucesso:

import gdal
import ogr
from gdalconst import *

shp = r"C:\Data\GIS\PTS.shp"
driver = ogr.GetDriverByName('ESRI Shapefile')

dataset = driver.Open(shp)    
layer = dataset.GetLayer()
layer.GetFeatureCount()    
schema = layer.schema
fields = [field.GetName() for field in schema]    
feature = layer.GetNextFeature()

Também consigo obter formatos OGR: ogrinfo --formatsimprime vários deles no cmd do Windows (sem o FileGDB lá).

Eu sou capaz de executar este código e ele executa com sucesso:

import fiona
with fiona.drivers():
  with fiona.open(path=r'C:\Data\GIS\TemplateData.gdb', driver='OpenFileGDB') as source:
    print(source.meta)

No entanto, esse código não será executado:

with fiona.drivers():
    with fiona.open(path=r'C:\Data\GIS\TemplateData.gdb', driver='FileGDB') as source:
        print(source.meta)

Porque eu não tenho as bibliotecas compiladas do Esri File GDB que são necessárias.

Fiz o download e descompactei FileGDB_API_VS2012_1_3.zipna página de downloads da Esri . Pelo que entendi, não há necessidade de compilar nada, pois a DLL já está lá.

Qual é o procedimento correto para registrar a DLL da API do Esri File GDB para poder usá-las no fiona no meu ambiente?


ATUALIZAÇÃO: (com base na resposta de Luke)

Fiz File Geodatabase API 1.4 version for Windows (Visual Studio 2010)o download na página de downloads da Esri . Eu copiei o FileGDB_API_VS2010_1_4\bin64\FileGDBAPI.dllpara o C:\Python34\Lib\site-packages\osgeo. Agora eu tenho dois arquivos aqui ogr_FileGDB.dlle FileGDBAPI.dll.

Eu criei uma variável do Windows GDAL_DRIVER_PATH : C:\Python34\Lib\site-packages\osgeo\gdalplugins. Na PATHvariável, não tenho nada específico em Python, exceto o C:\Python34\Lib\site-packages\osgeo.

Agora, ao executar o que ogrinfo --formatseu recebo -> "FileGDB" (read/write)e posso usar o código Python para trabalhar com o driver FileGDB.

Alex Tereshenkov
fonte
O 1.4 Arquivo Geodatabase API foi liberado para uma lonnng tempo agora. Realmente não há razão para usar o 1.3.
Vince
@ Lucas, obrigado, mas preciso de acesso de gravação ao gdb. No entanto, você só pode ler com o OpenFileGDB ... Quaisquer links específicos ou página de documento como conseguir isso com a compilação e como apontar para a dll (via variáveis ​​do Windows etc.)? Seria muito útil.
Alex Tereshenkov
@Vince, não me importo de usar a versão 1.4 ou qualquer outra versão que me permita editar o arquivo gdb :) Não tenho a página / especificação do docs com instruções claras sobre como fazer isso.
Alex Tereshenkov
@AlexTereshenkov Ao usar o python de 64 bits, copie o Esri bin64 \ FileGDBAPI.dll para o [python install dir]\Lib\site-packages\osgeodiretório conforme especificado na minha resposta, e não o diretório gdalplugins que você mencionou na sua edição. Somente plug-ins de driver entram nesse diretório, não dlls de terceiros.
User2856
1
@AlexTereshenkov, ogr_FileGDB.dll é o driver FileGDB (não o OpenFileGDB, que está embutido no gdal / ogr). Essa DLL é compilada a partir do código do driver GDAL / OGR . Ele precisa estar no diretório especificado pelo GDAL_DRIVER_PATH env var.
User2856

Respostas:

9

A roda Gohlke GDAL / OGR inclui o driver FileGDB compilado como um plug-in.

Para que o driver FileGDB funcione:

  1. Copie o Esri bin64 \ FileGDB.dll para [python install/virtualenv dir]\Lib\site-packages\osgeo(use bin \ FileGDB.dll se estiver usando o python de 32 bits). Não copie o FileGDB.dll para o diretório gdalplugins.
  2. Defina a variável de ambiente GDAL_DRIVER_PATH:
    • manualmente; ou
    • editar [python install/virtualenv dir]\Lib\site-packages\osgeo\__init__.pye descomentar a linha 10.
      # uncomment the next line to enable plugins
      os.environ['GDAL_DRIVER_PATH'] = os.path.join(os.path.dirname(__file__), 'gdalplugins')

A abertura de um GDB com o driver FileGDB agora deve funcionar.

>>> import fiona
>>> with fiona.drivers():
...     with fiona.open(path=r'C:\Temp\Default.gdb', driver='FileGDB') as source:
...         print(source.meta)
...
{'crs': {'init': u'epsg:4326'}, 'driver': 'FileGDB', 'crs_wkt': u'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01
74532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', 'schema': {'geometry': 'MultiPolygon', 'properties': OrderedDict([(u'SHAPE_Length', 'float'), (u'SHAPE_Area', 'float')])}}
>>>

Nota:

Usando o Python 2.7, só consegui que o plugin FileGDB funcionasse com a API FileGDB v1.3 (MSVC 2008). como v.1.4 segfaults python. Suponho que isso ocorre porque o python e as bibliotecas GDAL e Fiona fornecidas pela Gohlke são compiladas com o MSVC 2008 e a v. 1.4 é compilada com o MSVC 2010 (e posterior).

A API FileGDB v1.4 funciona bem com o Python 3.4 e as bibliotecas GDAL e Fiona fornecidas pela Gohlke, que são compiladas com o MSVC 2010.

user2856
fonte
Eu tinha para copiar bin64\FileGDBAPI.dlla partir FileGDB_API_1_5_1-VS2010.ziplocalizado na github.com/Esri/file-geodatabase-api/tree/master/... em step 1fazê-lo funcionar (em Python 3.5 64bit)
Mattijn
Meu gdal foi instalado automaticamente geopandasusando a linha de comando miniconda conda install geopandas. Na __init__.pylinha 10 já não é comentada, então não acho que seja a linha a que você está se referindo. Também não há nenhum gdalpluginsarquivo
user32882
@ user32882 Estas instruções não são para o conda instalado gdal ...
user2856
Como posso configurá-lo para o conda? Isso é possível?
user32882
4

As informações principais estão aqui:

Também consigo obter formatos OGR: ogrinfo --formats imprime vários deles no cmd do Windows (sem o FileGDB lá).

Isso me diz que sua GDAL_DRIVER_PATHvariável de ambiente não está definida. Consulte as instruções em https://trac.osgeo.org/gdal/wiki/FileGDB#Testingthedriver . Quando o "FileGDB" aparecer em ogrinfo --formats(ou fio env --formats), você estará pronto .

sgillies
fonte
obrigado. Surpreso por ter tempo para responder perguntas no GIS.SE - você provavelmente está super ocupado com fiona, bem torneadas e outras coisas. Coisas muito legais que você escreveu, parabéns. Estou ciente de que não tenho o driver FileGDB, portanto, perguntando como fazer isso. Eu vi a página a que você se refere, ela diz que é preciso Compile GDAL with the FGDB section commented . Eu não tenho a fonte GDAL; Acabei de instalá-lo a partir do volante, então acho que essas etapas não são aplicáveis ​​no meu caso. Para onde devo ir daqui?
Alex Tereshenkov
1
A GDAL_DRIVER_PATHvariável é a chave. Leia trac.osgeo.org/gdal/wiki/ConfigOptions#GDAL_DRIVER_PATH e, se isso não o colocar no caminho certo, consulte o tópico em lists.osgeo.org/pipermail/gdal-dev/2014-May/039066.html .
Sgillies
Passos um pouco enganadores, já que eu não precisava compilar nada - as rodas que eu instalei já tinham tudo o que eu precisava, era apenas colar os arquivos na pasta correta. Mas agradeço muito pelas informações úteis, é bom saber para alguns outros casos de uso.
Alex Tereshenkov
Esta é absolutamente a resposta correta. Não há necessidade de alterar a instalação, apenas defina os caminhos certos!
Benjamin