33

I am trying to access a vector dataset in an Esri File Geodatabase using Python and GDAL. I have successfully compiled GDAL with the file geodatabase API. The FileGDB driver is working correctly since entering

ogrinfo --formats 

shows the FileGDB driver and entering

ogrinfo myfilegdb.gdb 

gives me the correct information on the content of the database.

However, I can't find out how to access the content itself in Python. For accessing a shapefile, I would write:

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

When accessing a FileGDB feature class I would assume using the commands:

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

but this doesn't seem to work since it cannot identify/locate the data set. Does anyone know how to call individual feature classes from a ESRI FileGDB.

I'm using Python 2.7, GDAL 1.9.1, filegdb api 1.2 on Ubuntu 12.04 x64.

0

3 Answers 3

26

You're almost there. This is on Windows 7, Python 2.6.5 32bit, and 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 ' 

Once you open the FGDB, then use GetLayer to get at your featureclass.

2
  • 1
    For python 3+, use "OpenFileGDB" driver Commented Dec 21, 2022 at 10:28
  • This was a great start to start moving away from arcpy. ExecuteSQL can then be used on ds to replace functions like MakeTableView_management and AddJoin_management. Commented Nov 13, 2024 at 20:05
23

Much simpler and intuitive if you use fiona and 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 

Note: fiona uses gdal and geopandas uses fiona

See also Reading the names of geodatabase file layers in Python

0
16

I would like to add that "FileGDB" is a propriatary driver that might not be included with you GDAL package http://www.gdal.org/drv_filegdb.html. This results in GetDriverByName returning None.

There is also the "OpenFileGDB" driver which is read only and is included by default http://www.gdal.org/drv_openfilegdb.html

>>> from osgeo import ogr >>> driver = ogr.GetDriverByName("OpenFileGDB") 
0

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.