Как получить доступ к классам объектов в файловых базах геоданных с помощью Python и GDAL?

21

Я пытаюсь получить доступ к набору векторных данных в файловой базе геоданных ESRI, используя Python + GDAL. Я успешно скомпилировал GDAL с помощью API файловой базы геоданных. Драйвер FileGDB работает правильно с момента ввода

ogrinfo --formats

показывает драйвер FileGDB и ввод

ogrinfo myfilegdb.gdb 

дает мне правильную информацию о содержании базы данных.

Тем не менее, я не могу узнать, как получить доступ к самому контенту в Python. Для доступа к шейп-файлу я написал бы:

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

При доступе к классу объектов FileGDB я бы предположил, используя команды:

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

но это, похоже, не работает, так как не может идентифицировать / найти набор данных. Кто-нибудь знает, как вызвать отдельные классы пространственных объектов из ESRI FileGDB.

Я использую Python 2.7, GDAL 1.9.1, filegdb api 1.2 на Ubuntu 12.04 x64. Спасибо за любые предложения!

Нильс
источник
Можете ли вы дать мне идею установить драйвер OGR для FileGDB?
Giser

Ответы:

18

Ты почти там. Это на Windows 7, Python 2.6.5 32bit и 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 '
>>>

После того, как вы откроете FGDB, используйте кнопку для доступа GetLayerк вашему классу объектов.

Чед Купер
источник
Как только вы это знаете, это кажется таким логичным :-) большое спасибо, ваше решение делает свое дело.
Нильс
6

Я хотел бы добавить, что «FileGDB» является проприетарным драйвером, который не может быть включен в ваш пакет GDAL http://www.gdal.org/drv_filegdb.html . Это приводит к GetDriverByNameвозвращению None.

Существует также драйвер «OpenFileGDB», который доступен только для чтения и включен по умолчанию http://www.gdal.org/drv_openfilegdb.html.

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName("OpenFileGDB")
сельдь
источник
3

Гораздо проще и понятнее, если вы используете Фиона и геопанды

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

Примечание: Фиона использует GDAL, а геопанда использует Фиона

Смотрите также Чтение имен файловых слоев базы геоданных в Python.

Соломон Вимал
источник
Предварительные условия: установка pip "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" # здесь смотрите lfd.uci.edu/~gohlke/pythonlibs , колеса установки pip, установка pip pipwin, установка pipwin numpy, установка pipwin pandas , pipwin install shapely, pipwin установить gdal, pipwin установить fiona, pipwin установить pyproj, pipwin установить шесть, pipwin установить rtree, pipwin установить геопанду, проверить python в вашем пути к среде, в GDAL CPx.y показывает версию вашего Python для 32-битная система использует 32 бита, запятая означает новую строку
mohsen hs