基于共享属性值合并sf对象中的GeoJSON线几何(条件st_combine)
按属性合并街道线几何解决方案(Geopandas)
核心思路:分组聚合替代手动循环
不用纠结st_combine的问题,直接用Geopandas的dissolve()方法,就能按街道名(MKN列)批量合并同属性的LINESTRING,同时处理长度字段:
1. 基础合并代码
import geopandas as gpd # 读取街道GeoJSON streets_gdf = gpd.read_file("你的街道数据.geojson") # 按MKN分组合并几何+处理长度 merged_streets = streets_gdf.dissolve( by="MKN", aggfunc={"Shape_Length": "sum"}, # 手动求和各小段长度 as_index=False )
2. Shape_Length的处理方式
- 要总长度就用
sum聚合,这是最准确的(原小段长度之和=整条街道长度) - 不需要的话可以直接忽略这个字段,后续如果需要重新计算,用
merged_streets["new_length"] = merged_streets.geometry.length即可(和求和值可能有细微误差,但不影响分析) - 绝对不要保留原单个小段的Shape_Length,分组后这个值没有意义
3. 把MultiLineString转成连续LINESTRING
dissolve()会把同街道的小段合并成MultiLineString,如果这些线段本来是连通的,用line_merge()转成单条LINESTRING:
merged_streets["geometry"] = merged_streets.geometry.apply( lambda x: x.line_merge() if x.type == "MultiLineString" else x )
4. 和交通事件数据关联
合并完街道数据后,直接用属性关联交通事件CSV:
import pandas as pd events_df = pd.read_csv("交通事件数据.csv") # 用标准化后的street列和MKN列关联 final_data = pd.merge(events_df, merged_streets, left_on="street", right_on="MKN", how="left")
踩坑提醒
- 确保street和MKN列的街道名完全一致(你已经做过标准化,这步没问题)
- 如果合并后还是MultiLineString,说明原数据中同街道的小段本来就不连通,不用强行转,不影响后续可视化
- 90万行事件数据关联时,属性匹配比空间join效率高很多,就用上面的
merge就行
内容的提问来源于stack exchange,提问作者dahj
相关产品推荐
相关产品推荐

