Moveet:构建一个城市无关的车队模拟器,使用真实道路网络和实时交通

发布: (2026年3月19日 GMT+8 19:06)
5 分钟阅读
原文: Dev.to

Source: Dev.to

概述

Moveet 是一个用 TypeScript 构建的开源实时车队模拟器。它在真实的道路网络上运行车辆,采用 A* 寻路、逼真的交通建模以及基于 D3 的自定义地图渲染器——无需 Leaflet、Mapbox 或瓦片提供商。

最新版本使模拟器完全不依赖特定城市。只需指向任意城市,它即可从 OpenStreetMap 数据构建可路由的图形,并配备拥堵建模、地理围栏以及实时交通叠加层。

从 OSM 数据到可路由图

一个 CLI 流程 (apps/network) 处理完整的 OpenStreetMap 导入:

npm run dev -- prepare nairobi
  • 从 Geofabrik 下载国家级 PBF 文件。
  • 使用 osmium(通过 Docker)裁剪出指定的边界框。
  • 过滤出可通行的道路类别,导出为 GeoJSON,并验证拓扑结构。
  • 首次运行后缓存结果。

一个 regions.json 清单覆盖全球主要城市——切换城市只需更改一个参数。

构建器会修剪掉不连通的组件,解析 OSM 标签(如车道数、路面质量、环形交叉口、通行限制和交通信号灯),并处理诸如逆向单行道和近似重复节点等边缘情况。

交通真实感

A* 引擎在计算路径成本时使用 BPR(公共道路局)拥堵函数。道路容量来源于 OSM 车道数据。随着车辆在路段上累积,路径成本会增加,交通会自然转向其他走廊——这与专业交通分配模型使用的原理相同。

额外的真实感层包括:

  • 路面质量速度因子
  • 交通信号灯交叉口延迟
  • 基于当前事故状态的事故感知路径缓存

仿真时钟驱动时变需求(高峰时段放大、夜间减弱),服务器定期广播每条边的拥堵快照。UI 使用类似 Google Maps 的颜色渐变(从绿到红)进行渲染,仅为实际承载交通的道路着色。

路由质量

A* 路由器现在:

  • 处理 OSM 转向限制
  • 强制仅前向环形交叉口通行并降低速度
  • 过滤私有道路和受限通行道路
  • 从网络的实际速度范围计算可接受的启发式,而不是使用硬编码常数

地理围栏

在地图上绘制多边形,命名,分配类型和颜色。服务器每个 tick 进行射线投射检查,并通过 WebSocket 广播进入/退出事件。功能包括完整的 REST CRUD、警报面板以及每个区域的切换开关。

车辆类型与轨迹

支持的车辆类型:汽车、卡车、摩托车、救护车和公交车——每种都有不同的速度曲线、加速曲线、道路限制和特殊行为。车队组成可在启动时配置。

每辆车在地图上留下渐隐的面包屑轨迹,存储在循环缓冲区中,并以不透明度渐变方式渲染。轨迹长度可调。

WebSocket 订阅过滤器

客户端可以通过车队、车辆类型或地理边界框来过滤其 WebSocket 数据流:

{
  "type": "subscribe",
  "filter": {
    "fleetId": "fleet-1",
    "vehicleType": "truck"
  }
}

系统向后兼容——未使用过滤器的客户端将接收所有数据。

UI 大改

所有交互组件已迁移至 React Aria,以实现适当的可访问性。视觉层采用了玻璃态(glassmorphism)主题并具备分层深度,加入了自定义模糊搜索及匹配高亮,并且面板比例更为紧凑。

底层实现:

  • 具备 sparkline 关键绩效指标的舰队分析仪表板
  • 带关联 ID 的结构化日志记录
  • 健康检查端点
  • CI 强制的测试覆盖率,覆盖所有工作区

尝试

git clone https://github.com/ivannovazzi/moveet.git
cd moveet && npm install && npm run dev

仪表板可在 localhost:5012 访问。MIT 许可证。GitHub 仓库

0 浏览
Back to Blog

相关文章

阅读更多 »