给GeoDataFrame分配转换后的LINESTRING几何时出错求助
问题根源:你把几何对象转成了字符串,而GeoDataFrame需要的是Shapely几何对象
你的报错核心原因很明确:你通过.wkt把转换后的Shapely几何对象转成了字符串格式,但GeoPandas的geometry列只接受Shapely的BaseGeometry子类对象(比如LineString)或者None,不接受纯文本的WKT字符串。
修正方案1:去掉.wkt,直接赋值几何对象
你不需要把转换后的几何转成WKT,shapely.ops.transform返回的本身就是符合要求的Shapely几何对象,直接赋值即可:
for i in range(len(SHP)): l = SHP.at[i, "geometry"] # 去掉.wkt,直接保留transform返回的几何对象 a = shapely.ops.transform(lambda x, y, z=None: (x, y), l) SHP.at[i, "geometry"] = a
更优方案:用矢量化操作替代循环(推荐)
GeoPandas和Pandas一样,矢量化操作比逐行循环高效得多,尤其是处理大数据集时。你可以用apply方法直接处理整个geometry列:
SHP["geometry"] = SHP["geometry"].apply( lambda geom: shapely.ops.transform(lambda x, y, z=None: (x, y), geom) )
为什么第二种方法也报错?
你第二次尝试新增newgeometry列时,同样存的是WKT字符串,set_geometry方法需要的是几何对象列,不是字符串列。如果要保留原几何,用矢量化方式新增列再设置的话,可以这么写:
# 新增几何列,直接存几何对象,不是WKT SHP["newgeometry"] = SHP["geometry"].apply( lambda geom: shapely.ops.transform(lambda x, y, z=None: (x, y), geom) ) # 设置新的几何列 SHP = SHP.set_geometry("newgeometry")
额外验证:检查几何类型
修改完成后,你可以用下面的代码确认几何类型已经变成LINESTRING(不带Z):
print(SHP.geometry.type.unique())
内容的提问来源于stack exchange,提问作者FG85
相关产品推荐
相关产品推荐

