能否在Python GIS应用中读写Flatgeobuf?
在Python中读写Flatgeobuf的可行方案
1. 官方Python绑定库flatgeobuf
这是官方维护的Python实现,直接支持Flatgeobuf的读写操作,无需依赖其他重型GIS库。
- 安装命令:
pip install flatgeobuf - 读取示例代码:
import flatgeobuf as fgb # 读取本地Flatgeobuf文件 with open("sample.fgb", "rb") as f: # 反序列化为要素列表 features = list(fgb.deserialize(f)) # 遍历处理要素 for feature in features: print("属性:", feature.properties) print("几何:", feature.geometry)
- 写入示例代码:
from shapely.geometry import Point, LineString import flatgeobuf as fgb # 构造待写入的要素集合 features = [ {"properties": {"id": 1, "name": "起点"}, "geometry": Point(116.39, 39.9)}, {"properties": {"id": 2, "name": "路径"}, "geometry": LineString([(116.39, 39.9), (116.4, 39.91)])} ] # 写入到Flatgeobuf文件 with open("output.fgb", "wb") as f: fgb.serialize(f, features)
2. 通过GDAL/OGR处理
GDAL 3.1及以上版本已原生支持Flatgeobuf格式,可借助Python的GDAL绑定完成读写:
- 读取示例代码:
from osgeo import ogr # 打开Flatgeobuf数据源 ds = ogr.Open("sample.fgb") if not ds: raise Exception("无法打开文件") # 获取第一个图层 layer = ds.GetLayer(0) # 遍历图层要素 for feat in layer: # 获取属性 props = feat.items() # 获取几何并转为WKT格式 geom = feat.GetGeometryRef().ExportToWkt() print(f"属性: {props}, 几何: {geom}") # 释放资源 ds = None
- 写入示例代码:
from osgeo import ogr, osr # 创建WGS84空间参考 srs = osr.SpatialReference() srs.ImportFromEPSG(4326) # 获取FlatGeobuf驱动 driver = ogr.GetDriverByName("FlatGeobuf") if not driver: raise Exception("未找到FlatGeobuf驱动") # 创建输出数据源 ds = driver.CreateDataSource("output_gdal.fgb") # 创建点图层 layer = ds.CreateLayer("point_layer", srs, ogr.wkbPoint) # 添加属性字段 field_def = ogr.FieldDefn("name", ogr.OFTString) field_def.SetWidth(20) layer.CreateField(field_def) # 定义添加要素的函数 def add_feature(name, x, y): feat = ogr.Feature(layer.GetLayerDefn()) feat.SetField("name", name) geom = ogr.CreateGeometryFromWkt(f"POINT ({x} {y})") feat.SetGeometry(geom) layer.CreateFeature(feat) feat = None # 释放资源 # 添加示例要素 add_feature("北京", 116.39, 39.9) add_feature("上海", 121.47, 31.23) # 释放资源 ds = None
3. 结合Geopandas快速处理
如果日常使用Geopandas,可以直接指定engine="flatgeobuf"来读写,底层依赖flatgeobuf库:
- 读取代码:
import geopandas as gpd # 读取Flatgeobuf文件为GeoDataFrame gdf = gpd.read_file("sample.fgb", engine="flatgeobuf") print(gdf.head())
- 写入代码:
# 将GeoDataFrame写入为Flatgeobuf格式 gdf.to_file("output_gpd.fgb", engine="flatgeobuf")
内容的提问来源于stack exchange,提问作者WhyNotTryCalmer
相关产品推荐
相关产品推荐

