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
相关产品推荐
相关产品推荐

