如何从GeoPandas LineString DataFrame中提取经纬度对为列表
GeoPandas按行提取LineString坐标为[y,x]格式列表的最高效实现
首先明确:你的示例输出坐标顺序为纬度(y值)在前,经度(x值)在后,和WKT文本里存储的x在前y在后的顺序相反,提取时需要做顺序交换。
最优性能方案(全量数据处理)
如果你的几何列全部为单LineString类型(和你给出的示例结构一致),直接用基于shapely底层C实现的属性访问+列表推导即可,比apply逐行循环快30%~50%,万级以上数据量优势更明显:
# 假设你的GeoDataFrame变量名为gdf # 批量为所有行生成符合要求的坐标列表 gdf["coord_list"] = [ [[y, x] for x, y in line_geom.coords] for line_geom in gdf.geometry ]
需要提取指定shape_id的坐标时,直接索引即可:
# 获取shape_id=1000252对应的坐标列表 target_coords = gdf.loc[gdf["shape_id"] == 1000252, "coord_list"].iloc[0]
输出结果和你给出的示例格式完全一致。
按shape_id快速查询方案
如果后续需要频繁根据shape_id调取坐标,直接生成ID到坐标的映射字典,避免反复检索DataFrame,查询效率接近O(1):
id_coord_map = { row.shape_id: [[y, x] for x, y in row.geometry.coords] for _, row in gdf.iterrows() } # 直接读取对应ID的坐标 print(id_coord_map[1000252])
注意事项
- 如果几何列存在MultiLineString类型,需要先通过
gdf = gdf.explode(index_parts=True)把多段线拆分为单LineString再执行上述代码,否则访问.coords属性会报错。 - 不推荐使用
gdf.apply(lambda x: ..., axis=1)的写法,pandas的axis=1逐行apply会产生大量Python层临时对象,性能远低于原生列表推导。 - 不要逐点调用
geom.x、geom.y读取坐标,直接访问.coords属性是批量读取底层坐标数组,速度比逐点取值快1个量级以上。
内容的提问来源于stack exchange,提问作者sampeterson
相关产品推荐
相关产品推荐

