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
相关产品推荐
相关产品推荐

