如何在Thingsboard中实现车辆行驶路线可视化?
Thingsboard仪表盘路线显示实现方案
问题背景
我是Thingsboard新手,已创建仪表盘展示两个枢纽地点与一辆车辆,但不知如何实现路线显示。当前做法如下:
1. JSON定义路线
"route":{ "name": "Route for Working Plan 1", "num_route": 0, "pos": 0, "arrival_time": "", "departure_time": "", "arr_veh_weight": 0.0, "dep_veh_weight": 0.0, "arrive_veh_items": 0, "dep_veh_items": 0, "accu_distance_km": 0.0, "point_List": "(41.6721, -0.8899), (41.6705, -0.8902), (41.6688, -0.8904), (41.6672, -0.8907), (41.6656, -0.8909), (41.6639, -0.8912), (41.6623, -0.8914), (41.6607, -0.8917), (41.6590, -0.8919), (41.6574, -0.8922), (41.6558, -0.8924), (41.6542, -0.8927), (41.6525, -0.8929), (41.6509, -0.8932), (41.6493, -0.8934), (41.6476, -0.8937), (41.6460, -0.8939), (41.6444, -0.8942), (41.6427, -0.8944), (41.6411, -0.8947)" }
2. 按时间戳发送遥测数据
telemetry = [] ts = int(time.time() * 1000) for route_point in route_points_lat: ts = ts telemetry.append({ "ts": ts, "values": { "latitude": route_point, "longitude": route_points_lon[pos] } }) pos += 1 ts += 1000 ... try: route_point_tb_asset = API.find_asset(route.name) send_telemetry_asset(token, route_point_tb_asset.id.id, telemetry) print(f"Telemetry properly sent to {route.name}")
目前仅能看到发送给资产的最后一个点位,需要实现路线显示效果。
解决方案
核心问题
默认地图部件只显示最新单个点位,要绘制路线需调整数据格式或部件配置,以下两种方法任选:
方法1:静态路线(一次性绘制整条路线)
适合展示固定规划路线:
- 调整数据发送格式:将路线点位转换为GeoJSON的
LineString格式,作为单个遥测字段发送(注意GeoJSON坐标顺序是[经度, 纬度]):
{ "route_line": { "type": "LineString", "coordinates": [ [-0.8899, 41.6721], [-0.8902, 41.6705], // 依次添加所有点位坐标 ] } }
- 仪表盘配置:
- 添加「地图」部件,进入编辑模式
- 在「图层」中添加轨迹图层
- 绑定资产的
route_line遥测字段,设置路线颜色、线宽等样式
方法2:实时轨迹(基于历史点位绘制)
适合展示车辆移动的动态轨迹:
- 确认数据存储:先检查资产的「遥测」页面,确保每个时间戳的经纬度都已成功写入(如果数据只存最后一条,检查发送逻辑是否有覆盖问题)
- 部件配置:
- 添加「地图」部件,编辑时选择标记图层,绑定车辆的
latitude和longitude字段 - 开启「显示轨迹」选项,设置轨迹的时间范围(如最近1小时)、轨迹样式
- 地图会自动连接该资产在指定时间范围内的所有历史点位,形成连续路线
- 添加「地图」部件,编辑时选择标记图层,绑定车辆的
当前代码优化
原代码中ts = ts是冗余代码,且用pos索引容易出错,建议改为同时遍历经纬度:
telemetry = [] ts = int(time.time() * 1000) # 用zip同时遍历经纬度,避免索引越界 for lat, lon in zip(route_points_lat, route_points_lon): telemetry.append({ "ts": ts, "values": { "latitude": lat, "longitude": lon } }) ts += 1000 # 每个点位间隔1秒 try: route_point_tb_asset = API.find_asset(route.name) send_telemetry_asset(token, route_point_tb_asset.id.id, telemetry) print(f"Telemetry properly sent to {route.name}") except Exception as e: print(f"Failed to send telemetry: {str(e)}")
内容的提问来源于stack exchange,提问作者Jesús Navarro Hernández
相关产品推荐
相关产品推荐

