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

pandas快速查找无匹配ID行 解决GeoJSON LineString生成报错

代码修改方案

你遇到的报错是因为部分WAYID分组仅包含1个坐标点,不满足LineString的构造要求,以下提供两种符合你需求的实现:

方案1:快速筛除仅含单个坐标点的WAYID记录

该方案直接过滤掉所有点数<2的WAYID分组,处理效率最高,适合大文件场景:

import pandas as pd
import geopandas as gpd
from shapely.geometry import LineString, Point
import io
col = ['lat','long','pointID','WAYID']
# 加载数据逻辑保持不变
df = pd.read_csv(io.StringIO(data), names=col, sep=',', engine='python', converters={'lat': lambda x: float(x.split('=')[1]), 'long': lambda x: float(x.split('=')[1])})
# df = pd.read_csv("latlongWayID.txt", names=col, sep=',', engine='python', converters={'lat': lambda x: float(x.split('=')[1]), 'long': lambda x: float(x.split('=')[1])})

gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.long, df.lat))

# ------------------- 修改部分开始 -------------------
# 先统计每个WAYID对应的点数,向量化过滤速度远高于逐行遍历
wayid_point_count = gdf.groupby('WAYID').size()
# 只保留点数>=2的有效WAYID
valid_wayids = wayid_point_count[wayid_point_count >= 2].index
gdf = gdf[gdf['WAYID'].isin(valid_wayids)].groupby('WAYID')['geometry'].apply(lambda x: LineString(x.tolist())).reset_index()
# ------------------- 修改部分结束 -------------------

jsonLoad = gdf.to_json()

后续保存文件的代码无需修改。如果是超大规模文件超出内存,可在pd.read_csv中添加chunksize=100000参数分块读取,先统计全量WAYID的点数再过滤处理即可。

方案2:单坐标点保留为Point、多坐标点生成LineString

该方案保留所有记录,几何类型自动适配,修改逻辑如下:

import pandas as pd
import geopandas as gpd
from shapely.geometry import LineString, Point
import io
col = ['lat','long','pointID','WAYID']
# 加载数据逻辑保持不变
df = pd.read_csv(io.StringIO(data), names=col, sep=',', engine='python', converters={'lat': lambda x: float(x.split('=')[1]), 'long': lambda x: float(x.split('=')[1])})
# df = pd.read_csv("latlongWayID.txt", names=col, sep=',', engine='python', converters={'lat': lambda x: float(x.split('=')[1]), 'long': lambda x: float(x.split('=')[1])})

gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.long, df.lat))

# ------------------- 修改部分开始 -------------------
# 分组时按点数判断几何类型
gdf = gdf.groupby('WAYID')['geometry'].apply(lambda x: LineString(x.tolist()) if len(x)>=2 else x.iloc[0]).reset_index()
# ------------------- 修改部分结束 -------------------

jsonLoad = gdf.to_json()

GeoJSON标准支持混合几何类型,后续保存代码无需修改即可正常输出包含Point和LineString的结果文件。


内容的提问来源于stack exchange,提问作者Megan Darcy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:09