You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:12:29