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

Python如何解码存储为字节格式的GIS边界几何数据?

解决方案:Parquet读取shapely几何字段转bytes的解码方法

问题本质说明

pandas写入parquet时没有处理shapely几何类型的特殊逻辑,会自动将shapely对象序列化为WKB(Well-Known Binary,开放地理空间联盟定义的标准二进制几何编码格式),所以读取后得到的是二进制bytes,不是普通文本,之前的尝试错误原因分别是:

  • 尝试1直接用utf-8解码:WKB是二进制格式,不是utf-8编码的文本,必然报解码错误
  • 尝试2调用encode方法:bytes对象本身就是二进制编码结果,只有字符串str才有encode方法转bytes
  • 尝试3直接传给geojson.Polygon:该方法接收的是坐标嵌套数组,不是WKB字节,所以会把字节直接拆分为整数列表,输出错误结果

不使用GeoPandas的解码方案

直接用shapely自带的WKB解析工具即可,你之前用到pyrosm依赖shapely,无需额外安装包:

单字节串转换

from shapely.wkb import loads

x = b"\x01\x03\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x8bp\x93Q\xe5\xb5S\xc0\xc5\x98\xaaj8\x80E@\xe4\x8a\xe6\\\xe5\xb5S\xc0\x84\xe3\xe8\xe0O\x80E@\xeb\xa9\xd5W\xd7\xb5S\xc0\x84\xe3\xe8\xe0O\x80E@\xc2\xff\xb1k\xd6\xb5S\xc0\xce\xefE\xc5I\x80E@i\xe5^`\xd6\xb5S\xc0'\xbc\x04\xa7>\x80E@\xeb\xa9\xd5W\xd7\xb5S\xc0\x19i\xf3I8\x80E@\x8bp\x93Q\xe5\xb5S\xc0\xc5\x98\xaaj8\x80E@"
geom = loads(x)
# 验证转换结果
print(type(geom)) # 输出 <class 'shapely.geometry.polygon.Polygon'>
print(geom) # 输出标准POLYGON文本格式

DataFrame批量转换

读取parquet后直接对geometry字段做批量转换:

import pandas as pd
from shapely.wkb import loads

df = pd.read_parquet("你的parquet文件路径")
df["geometry"] = df["geometry"].apply(loads)

可选优化方案

如果不想每次读取都做转换,写入时可以提前把几何对象转为*WKT(Well-Known Text)*文本格式,parquet原生支持字符串存储,读取后直接是可读的几何文本:

# 写入前转换
from shapely.wkt import dumps
df["geometry"] = df["geometry"].apply(dumps)
df.to_parquet("保存路径.parquet")

# 读取时如果需要转回shapely对象
from shapely.wkt import loads
df["geometry"] = df["geometry"].apply(loads)

内容的提问来源于stack exchange,提问作者mmz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:15:04