Wie greife ich mit Python und GDAL auf Feature-Classes in File-Geodatabases zu?

21

Ich versuche, mit Python + GDAL auf einen Vektordatensatz in einer ESRI-File-Geodatabase zuzugreifen. Ich habe GDAL erfolgreich mit der File-Geodatabase-API kompiliert. Der FileGDB-Treiber funktioniert seit der Eingabe ordnungsgemäß

ogrinfo --formats

Zeigt den FileGDB-Treiber an und gibt ihn ein

ogrinfo myfilegdb.gdb 

gibt mir die richtigen Informationen zum Inhalt der Datenbank.

Ich kann jedoch nicht herausfinden, wie ich in Python auf den Inhalt selbst zugreifen kann. Für den Zugriff auf ein Shapefile würde ich schreiben:

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

Beim Zugriff auf eine FileGDB-Feature-Class würde ich davon ausgehen, die folgenden Befehle zu verwenden:

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

Dies scheint jedoch nicht zu funktionieren, da der Datensatz nicht identifiziert / lokalisiert werden kann. Weiß jemand, wie man einzelne Feature-Classes aus einer ESRI FileGDB aufruft?

Ich verwende Python 2.7, GDAL 1.9.1, filegdb api 1.2 auf Ubuntu 12.04 x64. Vielen Dank für alle Vorschläge!

Niels
quelle
Können Sie mir eine Idee geben, wie ich den OGR for FileGDB-Treiber installieren kann?
giser

Antworten:

18

Du bist fast da. Dies ist unter Windows 7, Python 2.6.5 32bit und GDAL 1.9.0 der Fall:

>>> 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 '
>>>

Sobald Sie die FGDB geöffnet haben, rufen GetLayerSie mit Ihre Feature-Class auf.

Chad Cooper
quelle
Sobald Sie es wissen, scheint es so logisch :-) Vielen Dank, Ihre Lösung macht den Trick.
Niels
6

Ich möchte hinzufügen, dass "FileGDB" ein proprietärer Treiber ist, der möglicherweise nicht in Ihrem GDAL-Paket enthalten ist. Http://www.gdal.org/drv_filegdb.html . Dies führt zur GetDriverByNameRückkehr None.

Es gibt auch den Treiber "OpenFileGDB", der schreibgeschützt ist und standardmäßig in http://www.gdal.org/drv_openfilegdb.html enthalten ist

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

Viel einfacher und intuitiver, wenn Sie Fiona und Geopandas verwenden

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

Hinweis: fiona verwendet gdal und geopandas verwendet fiona

Siehe auch Lesen der Namen von Geodatabase-Dateischichten in Python

Solomon Vimal
quelle
Voraussetzungen: pip install "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" #siehe hier lfd.uci.edu/~gohlke/pythonlibs , pip install wheels, pip install pipwin, pipwin install numpy, pipwin install pandas , pipwin installiere shapely, pipwin installiere gdal, pipwin installiere fiona, pipwin installiere pyproj, pipwin installiere six, pipwin installiere rtree, pipwin installiere geopandas, überprüfe, ob sich python in deinem Umgebungspfad befindet 32-Bit-System verwenden 32 Bit, Komma bedeutet eine neue Zeile
mohsen hs