Как получить доступ к классам объектов в файловых базах геоданных с помощью 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.