Comment accéder aux classes d'entités dans les géodatabases fichier avec Python et GDAL?

21

J'essaie d'accéder à un ensemble de données vectorielles dans une géodatabase fichier ESRI à l'aide de Python + GDAL. J'ai compilé avec succès GDAL avec l'API de géodatabase fichier. Le pilote FileGDB fonctionne correctement depuis la saisie

ogrinfo --formats

affiche le pilote FileGDB et saisit

ogrinfo myfilegdb.gdb 

me donne les informations correctes sur le contenu de la base de données.

Cependant, je ne peux pas savoir comment accéder au contenu lui-même en Python. Pour accéder à un fichier de formes, j'écrirais:

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

Lors de l'accès à une classe d'entités FileGDB, je suppose en utilisant les commandes:

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

mais cela ne semble pas fonctionner car il ne peut pas identifier / localiser l'ensemble de données. Quelqu'un sait-il comment appeler des classes d'entités individuelles à partir d'un ESRI FileGDB?

J'utilise Python 2.7, GDAL 1.9.1, filegdb api 1.2 sur Ubuntu 12.04 x64. Merci pour toutes suggestions!

Niels
la source
Pouvez-vous me donner une idée pour installer le pilote OGR for FileGDB?
giser

Réponses:

18

Tu y es presque. Il s'agit de Windows 7, Python 2.6.5 32 bits et 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 '
>>>

Une fois que vous avez ouvert le FGDB, utilisez-le GetLayerpour accéder à votre classe de fonctionnalités.

Chad Cooper
la source
Une fois que vous le savez, cela semble si logique :-) merci beaucoup, votre solution fait l'affaire.
Niels
6

Je voudrais ajouter que "FileGDB" est un pilote propriétaire qui pourrait ne pas être inclus avec votre package GDAL http://www.gdal.org/drv_filegdb.html . Cela se traduit par le GetDriverByNameretour None.

Il existe également le pilote "OpenFileGDB" qui est en lecture seule et est inclus par défaut http://www.gdal.org/drv_openfilegdb.html

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

Beaucoup plus simple et intuitif si vous utilisez des fiona et des géopandas

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

Remarque: fiona utilise gdal et geopandas utilise fiona

Voir aussi Lecture des noms des couches de fichiers de géodatabase en Python

Salomon Vimal
la source
Pré-requis: pip install "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" #see here lfd.uci.edu/~gohlke/pythonlibs , roues d'installation pip, pip install pipwin, pipwin install numpy, pipwin install pandas , installation de pipwin bien faite, installation de pipwin gdal, installation de pipwin fiona, installation de pipwin pyproj, installation de pipwin six, installation de pipwin rtree, géopandas d'installation de pipwin, Vérifiez que python est dans votre chemin d'accès à l'environnement, dans le GDAL CPx.y montre la version de votre Python pour Le système 32 bits utilise 32 bits, la virgule signifie une nouvelle ligne
mohsen hs