Moveet:构建一个城市无关的车队模拟器,使用真实道路网络和实时交通
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 仓库。