¿Cómo acceder a las clases de entidad en geodatabases de archivos con Python y GDAL?

21

Estoy tratando de acceder a un conjunto de datos vectoriales en una geodatabase de archivos ESRI usando Python + GDAL. He compilado con éxito GDAL con la API de geodatabase de archivos. El controlador FileGDB funciona correctamente desde que ingresó

ogrinfo --formats

muestra el controlador FileGDB y al ingresar

ogrinfo myfilegdb.gdb 

me da la información correcta sobre el contenido de la base de datos.

Sin embargo, no puedo descubrir cómo acceder al contenido en Python. Para acceder a un shapefile, escribiría:

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

Al acceder a una clase de entidad FileGDB, supongo que usa los comandos:

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

pero esto no parece funcionar ya que no puede identificar / localizar el conjunto de datos. ¿Alguien sabe cómo llamar a clases de entidad individuales desde un ESRI FileGDB.

Estoy usando Python 2.7, GDAL 1.9.1, filegdb api 1.2 en Ubuntu 12.04 x64. Gracias por cualquier sugerencia!

Niels
fuente
¿Me puede dar alguna idea para instalar el OGR para el controlador FileGDB?
Giser

Respuestas:

18

Ya casi estás ahí. Esto está en Windows 7, Python 2.6.5 32bit y 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 '
>>>

Una vez que abra el FGDB, úselo GetLayerpara acceder a su clase de características.

Chad Cooper
fuente
Una vez que lo sabes, parece tan lógico :-) muchas gracias, tu solución funciona.
Niels
6

Me gustaría agregar que "FileGDB" es un controlador propio que podría no estar incluido en su paquete GDAL http://www.gdal.org/drv_filegdb.html . Esto da como resultado el GetDriverByNameregreso None.

También está el controlador "OpenFileGDB" que es de solo lectura y se incluye por defecto http://www.gdal.org/drv_openfilegdb.html

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

Mucho más simple e intuitivo si usas fiona y 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 y geopandas usa fiona

Consulte también Leer los nombres de las capas de archivos de geodatabase en Python

Solomon Vimal
fuente
Prerrequisitos: pip install "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" #ver aquí lfd.uci.edu/~gohlke/pythonlibs , pip install wheels, pip install pipwin, pipwin install numpy, pipwin install pandas , pipwin instala bien, pipwin instala gdal, pipwin instala fiona, pipwin instala pyproj, pipwin instala seis, pipwin instala rtree, pipwin instala geopandas, comprueba que python está en tu entorno Path, en el GDAL CPx.y muestra la versión de tu Python para El sistema de 32 bits usa 32 bits, la coma significa una nueva línea
mohsen hs