Làm cách nào để truy cập các lớp tính năng trong cơ sở dữ liệu địa lý tệp bằng Python và GDAL?


21

Tôi đang cố gắng truy cập bộ dữ liệu vectơ trong Cơ sở dữ liệu địa lý tệp ESRI bằng Python + GDAL. Tôi đã biên dịch thành công GDAL với API cơ sở dữ liệu địa lý tệp. Trình điều khiển FileGDB hoạt động chính xác kể từ khi nhập

ogrinfo --formats

hiển thị trình điều khiển FileGDB và nhập

ogrinfo myfilegdb.gdb 

cung cấp cho tôi thông tin chính xác về nội dung của cơ sở dữ liệu.

Tuy nhiên, tôi không thể tìm ra cách truy cập nội dung trong Python. Để truy cập một shapefile, tôi sẽ viết:

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

Khi truy cập một lớp tính năng FileGDB, tôi sẽ giả sử sử dụng các lệnh:

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

nhưng điều này dường như không hoạt động vì nó không thể xác định / định vị tập dữ liệu. Có ai biết cách gọi các lớp đối tượng riêng lẻ từ ESRI FileGDB không.

Tôi đang sử dụng Python 2.7, GDAL 1.9.1, filegdb api 1.2 trên Ubuntu 12.04 x64. Cảm ơn cho bất kỳ đề nghị!


Bạn có thể cho tôi một số ý tưởng để cài đặt trình điều khiển OGR cho FileGDB không?
Giser

Câu trả lời:


18

Bạn đã gần tới. Đây là trên Windows 7, Python 2.6.5 32bit và 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 '
>>>

Khi bạn mở FGDB, sau đó sử dụng GetLayerđể lấy tại featureclass của bạn.


Một khi bạn biết điều đó có vẻ rất hợp lý :-) cảm ơn rất nhiều, giải pháp của bạn thực hiện được mẹo.
Niels

6

Tôi muốn thêm rằng "FileGDB" là trình điều khiển sở hữu có thể không được bao gồm trong gói GDAL của bạn http://www.gdal.org/drv_filegdb.html . Điều này dẫn đến việc GetDriverByNametrở lại None.

Ngoài ra còn có trình điều khiển "OpenFileGDB" chỉ đọc và được bao gồm theo mặc định http://www.gdal.org/drv_openfilegdb.html

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName("OpenFileGDB")

3

Đơn giản và trực quan hơn nhiều nếu bạn sử dụng fiona và geopandas

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

Lưu ý: fiona sử dụng gdal và geopandas sử dụng fiona

Xem thêm Đọc tên của các lớp tệp cơ sở dữ liệu địa lý trong Python


Điều kiện tiên quyết: cài đặt pip "GDAL-3.0.2-cp36-cp36m-win_amd64.whl" #see tại đây lfd.uci.edu/~gohlke/pythonlibs , cài đặt pip, cài đặt pipwin, pipwin cài đặt numpy, pipwin cài đặt , Pipwin cài đặt shapely, pipwin cài đặt gdal, pipwin cài đặt fiona, pipwin cài đặt pyproj, pipwin cài đặt sáu, pipwin cài đặt rtree, cài đặt pipwin geopandas, Kiểm tra python có trong Đường dẫn môi trường của bạn, Trong GDAL CPx.y hiển thị phiên bản Python của bạn Hệ thống 32 bit sử dụng 32 bit, dấu phẩy có nghĩa là một dòng mới
mohsen hs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.