如何在GeoPandas中将LineString转换为多行经纬度列
报错原因
报错核心原因是你DataFrame里的geometry列存储的是WKT格式的字符串,不是Shapely库的几何对象,字符串类型没有.coords属性,所以调用时报错。
另外补充:你给出的示例坐标(95.xxx, 5.xxx)本身就是WGS84坐标系下的经纬度值,不需要调用UTM转经纬度的逻辑,直接解析拆分即可。如果你的实际业务数据是UTM 44N投影坐标,可以在拆分坐标后追加转换步骤。
实现代码
import pandas as pd from shapely import wkt # 1. 将WKT字符串转换为Shapely几何对象 df['geometry'] = df['geometry'].apply(wkt.loads) # 2. 提取LineString中所有坐标点 df['coord_list'] = df['geometry'].apply(lambda geom: list(geom.coords)) # 3. 将坐标列表拆分为单行,每个坐标点对应一行记录 df = df.explode('coord_list', ignore_index=True) # 4. 拆分经度、纬度为独立列 # Shapely坐标存储顺序为 (经度, 纬度),和字段对应 df['Longitude'] = df['coord_list'].apply(lambda item: item[0]) df['Latitude'] = df['coord_list'].apply(lambda item: item[1]) # 5. 筛选需要的字段输出,可根据需要调整列名和你预期完全一致 final_df = df[['Name', 'Longitude', 'Latitude']] # 如果要完全匹配你给出的输出表头(注意原表头Langitude为拼写笔误),可执行重命名 # final_df = final_df.rename(columns={'Longitude': 'Langitude', 'Latitude': 'Longitude'})
补充:如果实际使用UTM坐标的调整方式
如果你的真实数据geometry列存储的是UTM 44N投影坐标,不是示例里的WGS84经纬度,只需要在拆分行之后增加转换逻辑即可,注意utm.to_latlon返回值顺序为(纬度, 经度),拆分字段时要对应调整顺序:
import utm # 坐标转换 df['coord_list'] = df['coord_list'].apply(lambda xy: utm.to_latlon(xy[0], xy[1], 44, 'N')) # 拆分列时调整顺序 df['Latitude'] = df['coord_list'].apply(lambda item: item[0]) df['Longitude'] = df['coord_list'].apply(lambda item: item[1])
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

