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.

PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked Sep 4, 2012 at 10:47
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.

Keggering
1,1371 gold badge8 silver badges27 bronze badges
answered Sep 4, 2012 at 13:33
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

answered Jun 23, 2019 at 21:03
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")
answered Oct 10, 2017 at 15:30
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.