Jak uzyskać dostęp do klas obiektów w geobazach plików za pomocą Pythona i GDAL?

21

Usiłuję uzyskać dostęp do wektorowego zestawu danych w geobazie plików ESRI przy użyciu języka Python + GDAL. Pomyślnie skompilowałem GDAL za pomocą interfejsu API geobazy API. Sterownik FileGDB działa poprawnie od momentu wejścia

ogrinfo --formats

pokazuje sterownik FileGDB i wprowadzenie

ogrinfo myfilegdb.gdb 

daje mi poprawne informacje na temat zawartości bazy danych.

Nie mogę jednak dowiedzieć się, jak uzyskać dostęp do samej zawartości w Pythonie. Aby uzyskać dostęp do pliku kształtu, napisałbym:

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

Podczas uzyskiwania dostępu do klasy funkcji FileGDB przyjąłem następujące polecenia:

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

ale to nie działa, ponieważ nie można zidentyfikować / zlokalizować zestawu danych. Czy ktoś wie, jak wywoływać poszczególne klasy obiektów z pliku ESRI FileGDB.

Używam Python 2.7, GDAL 1.9.1, filegdb api 1.2 na Ubuntu 12.04 x64. Dziękuję za wszelkie sugestie!

Niels
źródło
Czy możesz mi podać pomysł instalacji sterownika OGR dla FileGDB?
giser

Odpowiedzi:

18

Jesteś prawie na miejscu. Dotyczy to Windows 7, Python 2.6.5 32bit i 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 '
>>>

Po otwarciu FGDB użyj przycisku, GetLayeraby uzyskać dostęp do swojej klasy funkcji.

Chad Cooper
źródło
Kiedy już to wiesz, wydaje się to logiczne :-) wielkie dzięki, twoje rozwiązanie załatwia sprawę.
Niels
6

Chciałbym dodać, że „FileGDB” to zastrzeżony sterownik, który może nie być dołączony do pakietu GDAL http://www.gdal.org/drv_filegdb.html . Powoduje to GetDriverByNamepowrót None.

Istnieje również sterownik „OpenFileGDB”, który jest tylko do odczytu i jest domyślnie dołączony http://www.gdal.org/drv_openfilegdb.html

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName("OpenFileGDB")
Alec
źródło
3

O wiele prostsze i intuicyjne, jeśli korzystasz z Fiona i geopand

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

Uwaga: fiona używa gdal, a geopanda używa fiona

Zobacz także Czytanie nazw warstw plików geobazy w Pythonie

Solomon Vimal
źródło
Wymagania wstępne: pip install „GDAL-3.0.2-cp36-cp36m-win_amd64.whl” # patrz tutaj lfd.uci.edu/~gohlke/pythonlibs , pip install wheels, pip install pipwin, pipwin install numpy, pipwin install panda , pipwin zainstaluj zgrabnie, pipwin zainstaluj gdal, pipwin zainstaluj fiona, pipwin zainstaluj pyproj, pipwin zainstaluj sześć, pipwin zainstaluj rtree, pipwin zainstaluj geopandas, sprawdź, czy python jest na twojej ścieżce środowiska, w GDAL CPx.y pokazuje wersję twojego Pythona dla System 32-bitowy używa 32 bitów, przecinek oznacza nową linię
mohsen hs