Como acessar classes de recurso em bancos de dados geográficos de arquivos com Python e GDAL?

21

Estou tentando acessar um conjunto de dados de vetor em um geodatabase de arquivo ESRI usando Python + GDAL. Compilei com êxito o GDAL com a API de geodatabase do arquivo. O driver FileGDB está funcionando corretamente desde a entrada

ogrinfo --formats

mostra o driver FileGDB e digitando

ogrinfo myfilegdb.gdb 

fornece as informações corretas sobre o conteúdo do banco de dados.

No entanto, não consigo descobrir como acessar o próprio conteúdo em Python. Para acessar um shapefile, eu escreveria:

driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.Open('shapefile.shp', 0)

Ao acessar uma classe de recurso FileGDB, eu assumiria o uso dos comandos:

driver = ogr.GetDriverByName('FileGDB')
ds = driver.Open('myfilegdb.gdb/feature_class', 0)

mas isso parece não funcionar, pois não pode identificar / localizar o conjunto de dados. Alguém sabe como chamar classes de recursos individuais de um ESRI FileGDB.

Estou usando o Python 2.7, GDAL 1.9.1, filegdb api 1.2 no Ubuntu 12.04 x64. Obrigado por todas as sugestões!

Niels
fonte
Você pode me dar uma idéia para instalar o driver OGR para FileGDB?
giser

Respostas:

18

Você está quase lá. Isso está no Windows 7, Python 2.6.5 32bit e GDAL 1.9.0:

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName("FileGDB")
>>> ds = driver.Open(r"C:\temp\buildings.gdb", 0)
>>> ds
<osgeo.ogr.DataSource; proxy of <Swig Object of type 'OGRDataSourceShadow *' at 0x02BB7038> >
>>> ds.GetLayer("buildings")
<osgeo.ogr.Layer; proxy of <Swig Object of type 'OGRLayerShadow *' at 0x02BB7050> >
>>> b = ds.GetLayer("buildings")
>>> sr = b.GetSpatialRef()
>>> sr
<osgeo.osr.SpatialReference; proxy of <Swig Object of type 'OSRSpatialReferenceShadow *' at 0x02BB7080> >
>>> sr.ExportToProj4()
'+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs '
>>>

Depois de abrir o FGDB, use GetLayerpara obter a sua classe de recurso.

Chad Cooper
fonte
Depois que você souber, parece tão lógico :-) muito obrigado, sua solução faz o truque.
Niels
6

Gostaria de acrescentar que "FileGDB" é um driver proprietário que pode não estar incluído no seu pacote GDAL http://www.gdal.org/drv_filegdb.html . Isso resulta em GetDriverByNameretorno None.

Há também o driver "OpenFileGDB", que é somente leitura e é incluído por padrão http://www.gdal.org/drv_openfilegdb.html

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName("OpenFileGDB")
Alec
fonte
3

Muito mais simples e intuitivo se você usar fiona e geopandas

import fiona 
import geopandas as gpd

# Get all the layers from the .gdb file 
layers = fiona.listlayers(gdb_file)

for layer in layers:
    gdf = gpd.read_file(gdb_file,layer=layer)
    # Do stuff with the gdf

Nota: fiona usa gdal e geopandas usa fiona

Consulte também Lendo os nomes das camadas de arquivos de geodatabase no Python

Salomon Vimal
fonte
Pré-requisitos: instalação do pip "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" # veja aqui lfd.uci.edu/~gohlke/pythonlibs , rodas de instalação do pip, rodas de instalação do pip, pipwin de instalação do pip, pipwin de instalação do numpy, pandas de instalação do pipwin , verifique se o python está no seu caminho de ambiente, no GDAL CPx.y mostra a versão do seu Python para Sistema de 32 bits usa 32 bits, vírgula significa uma nova linha
mohsen hs 25/11