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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:47:30