Bagaimana cara mengakses kelas fitur dalam file geodatabases dengan Python dan GDAL?

21

Saya mencoba mengakses dataset vektor dalam ESRI File Geodatabase menggunakan Python + GDAL. Saya telah berhasil mengkompilasi GDAL dengan file geodatabase API. Driver FileGDB berfungsi dengan benar sejak masuk

ogrinfo --formats

menunjukkan driver FileGDB dan masuk

ogrinfo myfilegdb.gdb 

memberi saya informasi yang benar tentang isi database.

Namun, saya tidak dapat menemukan cara mengakses konten itu sendiri dengan Python. Untuk mengakses shapefile, saya akan menulis:

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

Saat mengakses kelas fitur FileGDB saya akan berasumsi menggunakan perintah:

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

tetapi ini tampaknya tidak berfungsi karena tidak dapat mengidentifikasi / menemukan kumpulan data. Adakah yang tahu cara memanggil kelas fitur individual dari ESRI FileGDB.

Saya menggunakan Python 2.7, GDAL 1.9.1, filegdb api 1.2 di Ubuntu 12.04 x64. Terima kasih atas sarannya!

Niels
sumber
Bisakah Anda memberi saya ide untuk menginstal OGR untuk driver FileGDB?
Giser

Jawaban:

18

Kamu hampir sampai. Ini pada Windows 7, Python 2.6.5 32bit, dan 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 '
>>>

Setelah Anda membuka FGDB, kemudian gunakan GetLayeruntuk mendapatkan di FeatureClass Anda.

Chad Cooper
sumber
Setelah Anda tahu itu tampak sangat logis :-) terima kasih banyak, solusi Anda akan berhasil.
Niels
6

Saya ingin menambahkan bahwa "FileGDB" adalah driver berpemilik yang mungkin tidak termasuk dalam paket GDAL Anda http://www.gdal.org/drv_filegdb.html . Ini menghasilkan GetDriverByNamekembali None.

Ada juga driver "OpenFileGDB" yang hanya baca dan disertakan secara default http://www.gdal.org/drv_openfilegdb.html

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

Jauh lebih sederhana dan intuitif jika Anda menggunakan fiona dan geopanda

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

Catatan: fiona menggunakan gdal dan geopanda menggunakan fiona

Lihat juga Membaca nama lapisan file geodatabase dengan Python

Solomon Vimal
sumber
Prasyarat: pip instal "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" # lihat di sini lfd.uci.edu/~gohlke/pythonlibs , pip pasang roda, pip pasang pipwin, pipwin install numpy, pipwin install panda , pipwin instal rupawan, pipwin instal gdal, pipwin instal fiona, pipwin instal pyproj, pipwin instal enam, pipwin instal rtree, instal pipwin instal geopandas, Periksa python ada di Path Lingkungan Anda, Di GDAL CPx.y menunjukkan versi Python Anda untuk Sistem 32-bit menggunakan 32 bit, koma berarti baris baru
mohsen hs