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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:54:39