如何在Folium地图中根据累计距离条件设置不同颜色绘制车辆轨迹
按累计距离分段绘制不同颜色的车辆轨迹线条
你的需求核心是按累计距离的阈值拆分每辆车的轨迹,分别用不同颜色绘制,之前的代码有两个关键问题:一是合并时丢掉了total_dist列和车辆标识,二是直接把所有点连成一条线,没法分段设置颜色。下面是完整的实现方案:
第一步:修正数据合并逻辑,保留关键信息
首先要把每个CSV对应的车辆ID和total_dist列都保留下来,这样才能区分不同车辆的轨迹,以及判断每个点的距离阈值:
import pandas as pd import folium from pathlib import Path import glob # 替换成你的文件路径 path = r'C:/Users/Desktop/Sample/car_new' all_files = glob.glob(path + "/*.csv") li = [] for filename in all_files: # 从文件名提取车辆标识(比如car1.csv → car1) car_id = Path(filename).stem df = pd.read_csv(filename, index_col=None, header=0) # 添加车辆ID列 df['car_id'] = car_id li.append(df) # 合并所有数据,保留total_dist和car_id car_locations = pd.concat(li, axis=0, ignore_index=True) # 确保列名和CSV里的一致(如果你的CSV列名是lat/long,这里要对应改成小写) car_locations = car_locations[["car_id", "Latitude", "Longitude", "total_dist"]]
第二步:按车辆拆分轨迹,根据距离阈值分段绘制
每辆车的轨迹是连续的,我们需要把同一辆车的轨迹拆分成「total_dist ≤120」和「total_dist >120」的连续路段,再分别设置颜色绘制:
# 初始化地图,用所有点的平均经纬度作为中心 map_center = [car_locations.Latitude.mean(), car_locations.Longitude.mean()] m = folium.Map(location=map_center, zoom_start=14, control_scale=True, tiles='Stamen Terrain') # 按车辆分组处理每个轨迹 for car_id, group in car_locations.groupby('car_id'): # 确保数据是按累计距离递增的(行驶顺序) group_sorted = group.sort_values('total_dist').reset_index(drop=True) # 判断每个点是否超过阈值 group_sorted['is_over'] = group_sorted['total_dist'] > 120 # 找到状态变化的位置(从≤120变>120,或者反过来) group_sorted['change_point'] = group_sorted['is_over'] != group_sorted['is_over'].shift(1) # 给每个连续路段分配一个组ID group_sorted['segment_id'] = group_sorted['change_point'].cumsum() # 遍历每个连续路段 for seg_id, segment in group_sorted.groupby('segment_id'): # 获取路段的经纬度列表 coords = segment[['Latitude', 'Longitude']].values.tolist() # 根据路段的状态设置颜色 color = 'green' if segment['is_over'].iloc[0] else 'red' # 绘制线段 folium.PolyLine( coords, color=color, weight=2.5, opacity=0.8, tooltip=f"{car_id} - {'累计距离>120' if color=='green' else '累计距离≤120'}" ).add_to(m) # 显示地图 m
关键细节说明
- 车辆标识:通过文件名提取
car_id,确保不同车辆的轨迹不会混在一起处理; - 轨迹排序:必须按
total_dist排序,保证轨迹是车辆行驶的顺序,否则分段会出错; - 路段拆分:用
shift()判断相邻点的阈值状态变化,给连续的相同状态点分配同一个segment_id,从而拆分出独立路段; - 交互优化:添加了tooltip,鼠标悬停可以看到当前路段的车辆ID和距离状态。
内容的提问来源于stack exchange,提问作者sandy77
相关产品推荐
相关产品推荐

