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!


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.


Kiedy już to wiesz, wydaje się to logiczne :-) wielkie dzięki, twoje rozwiązanie załatwia sprawę.
— Niels


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.