Come accedere alle classi di caratteristiche nei database di file con Python e GDAL?


21

Sto cercando di accedere a un set di dati vettoriali in un geodatabase di file ESRI utilizzando Python + GDAL. Ho compilato con successo GDAL con il file geodatabase API. Il driver FileGDB funziona correttamente da quando è entrato

ogrinfo --formats

mostra il driver FileGDB e inserendo

ogrinfo myfilegdb.gdb 

mi dà le informazioni corrette sul contenuto del database.

Tuttavia, non riesco a scoprire come accedere al contenuto stesso in Python. Per accedere a un file di forma, scriverei:

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

Quando accedo a una classe di funzionalità FileGDB, suppongo che usando i comandi:

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

ma questo non sembra funzionare poiché non è in grado di identificare / localizzare il set di dati. Qualcuno sa come chiamare singole classi di caratteristiche da un FileGDB ESRI.

Sto usando Python 2.7, GDAL 1.9.1, filegdb api 1.2 su Ubuntu 12.04 x64. Grazie per eventuali suggerimenti!


Potete darmi qualche idea per installare il driver OGR per FileGDB?
giser,

Risposte:


18

Ci sei quasi. Questo è su Windows 7, Python 2.6.5 a 32 bit e 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 '
>>>

Dopo aver aperto l'FGDB, utilizza GetLayerper accedere alla tua featureclass.


Una volta che lo sai sembra così logico :-) grazie mille, la tua soluzione fa il trucco.
Niels,


3

Molto più semplice ed intuitivo se usi fiona e 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 e geopandas usa fiona

Vedi anche Lettura dei nomi dei layer di file di geodatabase in Python


Prerequisiti: installazione pip "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" #vedi qui lfd.uci.edu/~gohlke/pythonlibs , ruote installazione pip, installazione pipwin pipwin, installazione pipwin numpy, installazione pipwin panda , pipwin installa ben fatto, pipwin installa gdal, pipwin installa fiona, pipwin installa pyproj, pipwin installa sei, pipwin installa rtree, pipwin installa geopandas, controlla python è nel tuo percorso ambientale, nel GDAL CPx.y mostra la versione di Python per Il sistema a 32 bit utilizza 32 bit, virgola indica una nuova riga
mohsen hs
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.