路网车辆仿真产品是是一款先进的交通模拟工具,专为城市规划者、交通工程师和研究人员等用户提供强大的分析和预测能力。该产品通过全面、精准、高效的模拟,帮助用户深入理解和优化复杂的交通系统。
支持上传两种主流的路网文件格式——OpenDRIVE(xodr)和OpenStreetMap(osm)。OpenDRIVE是一种专门用于描述道路网络的标准化文件格式,能够详细记录道路的几何形状、车道布局、交通标志和信号等信息,而OpenStreetMap则是全球最大的用户生成地理信息数据库,包含了丰富的路网数据。通过兼容这两种格式,我们的产品能够灵活适应各种来源的路网数据,从而在不同交通需求环境下实现精准的路网车辆仿真。
在交通需求模拟方面,我们的产品提供了两种模式供用户选择:随机模式和OD(起始点)模式。随机模式下,系统会根据预设的参数和概率分布自动生成交通需求,适用于对整体交通状况进行宏观模拟和分析。而OD模式则允许用户根据实际的起始点数据来定制交通需求,从而实现更精确、更具针对性的模拟。
在仿真数据输出方面,我们的产品提供了两种方式供用户选择:实时输出和一次性输出仿真数据。实时输出数据时,通过WebSocket技术,我们的产品能够在模拟过程中实时地将仿真数据推送到用户的界面,使用户能够即时观察到交通流量、车辆速度、拥堵情况等动态变化。一次性输出数据,通过调用API接口,让用户能够一次性获取所有的仿真数据,这种功能对于需要深度分析和二次处理数据的用户来说尤其便利。
仿真输出数据结构方面,包含当前仿真时间点,路网上车辆统计信息(已加载车辆数、已出发车辆数、已到达车辆数、运行中车辆数、平均车速),车辆详细信息(每一辆车当前车速、车位置坐标、所在车道ID、角度、车型号、车颜色)等。
实现一个仿真操作主要有三步,见下图。
车流量
定义在一段时间内,在仿真场景中运行的车辆数量
车辆配置参数
车辆类型配置,主要是定义车辆的一些属性。目前支持自定义,车型号(小汽车、卡车等)、最大车速(单位m/s)、加速度、减速度、车长、车距、车颜色、车型占比等参数
仿真时长
指定仿真时长,在实时仿真模式,可配置每一秒模拟步长,可实现针对仿真车流的快进、慢放等功能
OD模式
用于指定车流出发路口与目标路口
随机模式
随机模型由系统根据路网中逻辑互通的路口,随机生成车流流量
封闭路段
可通过在运行时或启动前,配置需要封闭的车道,车道封闭后,车流会自动避开封闭车道
解封路段
可通过在运行时,对已封闭的车道进行解封
动态增加车辆
可在运行时,对指定道路,一次或者持续增加车辆
车辆变道
可在运行时,控制指定车辆变道
车辆变更目的地
可在运行时,控制指定车辆变更行驶目的地
车道限速
可在运行时,限制指定车道最大允许车速
变更仿真时间步长
可在运行时,随时控制仿真时间步长
1、系统运行环境
windows系统,win10+
2、安装python
要求 python 3,推荐版本python 3.10.6
3、安装 sumo
将环境变量SUMO_HOME设置为sumo安装的基本目录。这个目录包含bin和tools文件夹。
注意: 使用msi包安装,一般会有两个选项:自动配置环境变量SUMO_HOME,自动将sumo工具配置到python安装目录下的PYTHONPATH环境变量中。
手动将环境变量SUMO_HOME设置为sumo安装的基本目录。这个目录包含bin和tools文件夹。
注意: 请注意确保在PYTHONPATH环境变量中添加"/your/path/to/sumo/tools"。
4、安装mysql数据库
服务需要依赖mysql数据库,使用mysql安装包、docker镜像安装或其它方式安装均可。
安装好mysql后,新建数据库名称traci
traci
配置数据库结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for demand_conf
-- ----------------------------
DROP TABLE IF EXISTS `demand_conf`;
CREATE TABLE `demand_conf` (
`task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
`mode` int(1) NOT NULL COMMENT '模式(1-od 2-randomtrips)',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`time_conf_json` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT ' 时间段配置json',
`vehicle_conf_json` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '车辆配置json',
`od_conf_json` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'od配置json',
`randomtrips_conf_json` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'randomtrips配置json',
PRIMARY KEY (`task_id`, `mode`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for net_conf
-- ----------------------------
DROP TABLE IF EXISTS `net_conf`;
CREATE TABLE `net_conf` (
`task_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`net_file` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路网文件',
`task_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务名称',
PRIMARY KEY (`task_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
1、可自定义配置
{
"serverPort":8100,
"dbconfig":{
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"password": "enzo@123456",
"db": "traci"
},
"websocketPublicDomainOnTestClientPage":"ws://127.0.0.1:8100",
"fastApiPublicDomainOnTestClientPage":"http://127.0.0.1:8100",
"basedir": "D:\\simulateTaskFiles"
}
config.json配置详细说明如下:
字段 | 字段说明 | 是否必须 | 默认值 |
---|---|---|---|
serverPort | 自定义服务端口 | 可选 | 8100 |
dbconfig | 自定义mysql数据库配置 | 可选 | { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "enzo@123456", "db": "traci" } |
websocketPublicDomainOnTestClientPage | 内置websocket测试页面 ws连接url | 可选 | ws://127.0.0.1:8100 |
fastApiPublicDomainOnTestClientPage | 内置websocket测试页面 api访问url | 可选 | http://127.0.0.1:8100 |
basedir | 自定义服务端文件保存目录 | 可选 | D:\simulateTaskFiles |
2、安装依赖
pip install -r requirements.txt
3、启动服务
python main.pyc
例如,发送http请求格式如下:
url:
POST http://127.0.0.1:8100/netConvert
请求:
Content-Type: multipart/form-data
响应:
{
"code": 200,
"data": {
"task_id": "9a5a61d8-d89d-469f-90f4-6498c46592db"
},
"msg": null
}
如使用od模式创建交通需求,则配置参数(仿真时间配置、车辆配置、od配置),后台默认mode=1 如使用随机模式创建交通需求,则配置参数(仿真时间配置、车辆配置、随机配置),后台默认mode=2 说明:两种模式可同时创建
od模式:仿真时间配置、车辆配置为非必传,od配置为必传
例如,发送http请求格式如下:
url:
POST http://127.0.0.1:8100/odDemandGenerate
请求:
Content-Type: application/json
{
"task_id":"9a5a61d8-d89d-469f-90f4-6498c46592db",
"time_conf_json":"{\"begin\":0,\"end\":100,\"stepLength\":0.5}",
"vehicle_conf_json":"{\"vtype\":[{\"vClass\":\"passenger\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"yellow\"},{\"vClass\":\"truck\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"green\"}]}",
"od_conf_json":"{\"odBegin\":0,\"odEnd\":500,\"odMapping\":[{\"from\":\"2\",\"to\":\"0\",\"count\":\"2000\"},{\"from\":\"11\",\"to\":\"-24\",\"count\":\"2000\"}]}"
}
响应:
{
"code": 200,
"data": true,
"msg": null
}
随机模式:仿真时间配置、车辆配置、随机配置为非必传
例如,发送http请求格式如下:
url:
POST http://127.0.0.1:8100/randomtripsDemandGenerate
请求:
Content-Type: application/json
{
"task_id":"9a5a61d8-d89d-469f-90f4-6498c46592db",
"time_conf_json":"{\"begin\":0,\"end\":100,\"stepLength\":0.5}",
"vehicle_conf_json":"{\"vtype\":[{\"vClass\":\"passenger\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"yellow\"},{\"vClass\":\"truck\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"green\"}]}",
"randomtrips_conf_json":"{\"period\":1,\"random\":true,\"randomDepart\":true}"
}
响应:
{
"code": 200,
"data": true,
"msg": null
}
1、websocket连接方式
websocket连接方式可对仿真数据进行实时输出。
在线访问测试体验地址为:websocket 在线访问测试,或者启动本地仿真服务后,访问本地测试地址: http://127.0.0.1:8100/testClient
websocket支持的命令,见【5.3.2、客户端向服务端发送仿真控制命令列表】详细说明
客户端创建websocket连接格式如下:
连接服务端点:
ws://127.0.0.1:8100/ws/${task_id}/${mode}
请求:
task_id=9a5a61d8-d89d-469f-90f4-6498c46592db
mode=1
响应:
{
"msgtype":"simulateData",
"data":{
"taskkey":"9a5a61d8-d89d-469f-90f4-6498c46592db_1",
"time":0.5,
"loadedNumber":2,
"departedNumber":2,
"arrivedNumber":0,
"runningNumber":2,
"avgSpeed":18.39763,
"data":[
{
"vehicle_id":"0.0",
"speed":17.437,
"x":1516.22578,
"y":482.34661,
"z":0,
"lane":"22_0",
"angle":303.2581865480051,
"vclass":"passenger",
"color":[
255,
255,
0,
255
]
},
{
"vehicle_id":"1.0",
"speed":19.359,
"x":-0.44943,
"y":1285.53668,
"z":0,
"lane":"16_0",
"angle":122.78335187281229,
"vclass":"passenger",
"color":[
255,
255,
0,
255
]
}
]
}
}
websocket客户端连接服务端,参考html脚本代码:
<!DOCTYPE html>
<html>
<head>
<title>Chat</title>
</head>
<body>
<h1><span>task_id和mode获取说明</span></h1>
<p>
<table>
<tr><td>api接口地址:http://127.0.0.1:8100/docs</td></tr>
<tr><td>1、使用转换路网文件api接口,上传xodr/osm文件,响应中可获取task_id</td></tr>
<tr><td>2、使用配置交通需求api接口,传入参数task_id,</td></tr>
<tr><td> 如使用od模式创建交通需求,则配置参数(仿真时间配置、车辆配置、od配置),后台默认mode=1</td></tr>
<tr><td> 如使用随机模式创建交通需求,则配置参数(仿真时间配置、车辆配置、随机配置),后台默认mode=2</td></tr>
<tr><td> 说明:两种模式可同时创建</td></tr>
<tr><td>3、使用查询交通需求配置api接口,可获取详细交通需求信息</td></tr>
</table>
</p>
<h1>WebSocket Chat <span id="ws-id"></span></h1>
<h2>注意: <span style='color:red'>请先开启一个指定task_id和mode的websocket连接,再发送仿真命令消息</span></h2>
<h3><span>第一步:创建websocket连接</span></h3>
<p>
<table>
<tr><td>例如</td></tr>
<tr><td>task_id数据:9a5a61d8-d89d-469f-90f4-6498c46592db</td></tr>
<tr><td>mode数据:1</td></tr>
</table>
</p>
<form action="" onsubmit="startWebsocketConnect(event)">
your task_id:
<input type="text" id="messageText2" autocomplete="off"/>
your mode:
<input type="text" id="messageText3" autocomplete="off"/>
<button id = "b1">start websocket connect</button>
</form>
<h3><span>第二步:发送仿真命令消息(开启、暂停、恢复、关闭)</span></h3>
<p>
<table>
<tr><td>例如:</td></tr>
<tr><td>开启命令:{"command":"start"}</td></tr>
<tr><td>暂停命令:{"command":"stop"}</td></tr>
<tr><td>恢复命令:{"command":"recover"}</td></tr>
<tr><td>关闭命令:{"command":"close"}</td></tr>
<tr><td>封闭车道命令:{"command":"closeLane","closelanes":["1_0"]}</td></tr>
<tr><td>解封车道命令:{"command":"uncloseLane","uncloselanes":["1_0"]}</td></tr>
<tr><td>变更仿真时间步长命令:{"command":"changeParam","stepLength":0.1}</td></tr>
<tr><td>动态增加车辆命令:{"command":"addVehicle","vehicleData":[{"edges":[22,21],"num":10,"addType":"once"}]}</td></tr>
<tr><td>车辆变道命令:{"command":"changeLane","vehicleData":[{"vehicleId":"0.0","laneIndex":1}]}</td></tr>
<tr><td>车辆变更目的地命令:{"command":"changeTarget","vehicleData":[{"vehicleId":"0.0","edge":"-23"}]}</td></tr>
<tr><td>车道限速命令:{"command":"limitLaneSpeed","laneSpeedData":[{"laneId":"1_0","maxSpeed":"5"},{"laneId":"1_1","maxSpeed":"5"},{"laneId":"1_2","maxSpeed":"5"}]}</td></tr>
</table>
</p>
<form action="" onsubmit="sendMessage(event)">
your command:
<input type="text" id="messageText" autocomplete="off"/>
<button>send msg</button>
</form>
<ul id='messages'>
</ul>
<script>
var client_id = Date.now()
document.querySelector("#ws-id").textContent = client_id;
var ws;
function startWebsocketConnect(event){
var input2 = document.getElementById("messageText2")
var input3 = document.getElementById("messageText3")
var b1 = document.getElementById("b1")
console.log(input2.value)
console.log(input3.value)
ws = new WebSocket(`ws://localhost:8100/ws/${input2.value}/${input3.value}`);
ws.onmessage = function(event) {
var messages = document.getElementById('messages')
var message = document.createElement('li')
var content = document.createTextNode(event.data)
message.appendChild(content)
messages.appendChild(message)
};
input2.disabled = true;
input3.disabled = true;
b1.disabled = true;
event.preventDefault()
}
function sendMessage(event) {
var input = document.getElementById("messageText")
ws.send(input.value)
input.value = ''
event.preventDefault()
}
</script>
</body>
</html>
2、http接口调用方式
http接口启动仿真,仿真结果数据一次性输出到响应中。需要注意,如果仿真时间区间设置较长或车流量设置较大,响应结果数据会很大,接口响应需要花费很长时间。发送http请求格式如下:
url:
GET http://127.0.0.1:8100/getSimulateDataOnce?task_id=9a5a61d8-d89d-469f-90f4-6498c46592db&mode=2&renew=1
请求:
task_id=9a5a61d8-d89d-469f-90f4-6498c46592db&mode=2&renew=1
响应:
{
"code": 200,
"data": [
{
"vehicle_id": "0",
"data": [
{
"vehicle_id": "0",
"speed": 0.0,
"x": 1514.46993,
"y": 483.49816,
"z": 0.0,
"lane": "22_0",
"angle": 303.25818654800537,
"vclass": "truck",
"color": [
255,
255,
0,
255
],
"time": 1.5
},
...
]
}
...
],
"msg": null
}
成功安装sumo软件,并配置SUMO_HOME环境变量后,使用netedit.exe工具可以查看转换后路网文件。先打开windos系统cmd控制台,再输入打开路网文件命令 netedit net.xml
,net.xml为使用接口【5.1.2.下载转换后路网文件】导出的net.xml文件。凡是数据服务接口中涉及到需要指定道路id(edge_id)或者车道id(lane_id),均需要使用此种方式查找。
打开文件后显示如下
查看道路edge_id方法
查看车道lane_id方法
接口地址:/netConvert
请求方式:POST
请求数据类型:multipart/form-data
响应数据类型:*/*
接口描述:将osm或xodr文件转成路网文件
请求示例:
file:(binary)
task_name:str
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
file | osm或xodr文件 | true | file | ||
task_name | 任务名称 | false | string |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应码 | string | |
data | 响应参数 | object | |
task_id | 任务ID | integer | |
msg | 响应消息 | string |
响应示例:
{
"code": 200,
"data": {
"task_id": "9b9e1fbb-8848-47c2-9457-57df1d183260"
},
"msg": null
}
接口地址:/getNet/{task_id}
请求方式:GET
请求数据类型:
响应数据类型:*/*
接口描述:获取转换后的路网xml文件
请求示例:
task_id=9a5a61d8-d89d-469f-90f4-6498c46592db
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
task_id | 任务ID | path | true | string |
响应参数:
xml格式文件流
响应示例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- generated on 2023-12-21 20:38:57 by Eclipse SUMO netconvert Version 1.19.0
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/netconvertConfiguration.xsd">
<input>
<opendrive-files value="D:\simulateTaskFiles\9a5a61d8-d89d-469f-90f4-6498c46592db\origin.xodr"/>
</input>
<output>
<output-file value="D:\simulateTaskFiles\9a5a61d8-d89d-469f-90f4-6498c46592db\net.xml"/>
</output>
<junctions>
<no-turnarounds.except-deadend value="true"/>
</junctions>
</configuration>
-->
<net version="1.16" junctionCornerDetail="5" rectangularLaneCut="true" limitTurnSpeed="5.50" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/net_file.xsd">
<location netOffset="749.29,743.61" convBoundary="0.00,0.00,1515.69,1304.54" origBoundary="0.000000,0.000000,0.000000,0.000000" projParameter="+proj=tmerc +lat_0=23.63212998122232 +lon_0=116.3125251081986 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +vunits=m +no_defs "/>
<type id="driving" priority="1" speed="13.89" disallow="pedestrian tram rail_urban rail rail_electric rail_fast ship" width="3.65"/>
<edge id=":105_0" function="internal">
<lane id=":105_0_0" index="0" disallow="pedestrian tram rail_urban rail rail_electric rail_fast ship" speed="17.88" length="38.30" width="3.50" shape="1430.36,548.22 1424.91,552.03 1415.82,557.46 1405.85,563.30 1397.78,568.32"/>
...
接口地址:/getTaskConfs
请求方式:GET
请求数据类型:
响应数据类型:*/*
接口描述:获取全部的路网文件和仿真需求配置
请求示例:
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应码 | string | |
data | 响应参数 | object数组 | |
net_conf | 路网数据 | object | |
task_id | 任务ID | string | |
task_name | 任务名称 | string | |
create_time | 创建时间 | string | |
demand_conf | 交通需求数据 | string | |
task_id | 任务ID | string | |
mode | 任务模式 1-od 2-随机 | string | |
create_time | 创建时间 | string | |
update_time | 修改时间 | string | |
time_conf_json | 仿真时间配置参数,参考5.2.2详细字段说明 | ||
vehicle_conf_json | 车辆配置参数,参考5.2.2详细字段说明 | ||
od_conf_json | od配置参数,参考5.2.2详细字段说明 | ||
randomtrips_conf_json | 随机配置参数,参考5.2.3详细字段说明 | ||
msg | 响应消息 | string |
响应示例:
{
"code": 200,
"data": [{
"net_conf": {
"task_id": "9a5a61d8-d89d-469f-90f4-6498c46592db",
"create_time": "2023-12-21T20:38:57",
"update_time": null,
"net_file": "D:\\simulateTaskFiles\\9a5a61d8-d89d-469f-90f4-6498c46592db\\net.xml",
"task_name": "demo-3-阶段"
},
"demand_conf": [
{
"task_id": "9a5a61d8-d89d-469f-90f4-6498c46592db",
"mode": 1,
"create_time": "2023-12-21T20:41:26",
"update_time": "2023-12-29T15:13:14",
"time_conf_json": "{\"begin\":0,\"end\":400,\"stepLength\":0.01}",
"vehicle_conf_json": "{\"vType\":[{\"vClass\":\"passenger\",\"probability\":0,\"maSpeed\":34,\"color\":\"yellow\"},{\"vClass\":\"truck\",\"probability\":1,\"maSpeed\":34,\"color\":\"yellow\"}]}",
"od_conf_json": "{\"odBegin\":0,\"odEnd\":380,\"odMapping\":[{\"from\":\"22\",\"to\":\"21\",\"count\":500},{\"from\":\"16\",\"to\":\"5\",\"count\":500}]}",
"randomtrips_conf_json": null
}
]
}],
"msg": null
}
接口地址:/getNetEdgeByGeo
请求方式:GET
请求数据类型:
响应数据类型:*/*
接口描述:根据地理坐标定位附近的道路
请求示例:
task_id=9a5a61d8-d89d-469f-90f4-6498c46592db&lon=116.30517725232666&lat=23.63702291904673
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
task_id | 任务ID | query | true | string | |
lon | lon或者x,由参数lonLatIsXy决定 | query | true | float | |
lat | lat或者y,由参数lonLatIsXy决定 | query | true | float | |
radius | 指定半径范围内的道路,默认10.0米范围内 | query | false | float | |
lonLatIsXy | lon,lat是否表示x,y,默认false | query | false | bool |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应码 | string | |
data | 响应参数 | object | |
id | 道路ID,即edgeId | string | |
from | 起始节点的id | string | |
to | 结束的节点的id | string | |
msg | 响应消息 | string |
响应示例:
{
"code": 200,
"data": {
"id": "16",
"from": "16.end",
"to": "98"
},
"msg": null
}
接口地址:/getTaskConf
请求方式:GET
请求数据类型:
响应数据类型:*/*
接口描述:获取指定任务的路网和交通需求配置
请求示例:
task_id=9a5a61d8-d89d-469f-90f4-6498c46592db
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
task_id | 任务ID | query | true | string |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应码 | string | |
data | 响应参数 | object | |
net_conf | 路网数据 | object | |
task_id | 任务ID | string | |
task_name | 任务名称 | string | |
create_time | 创建时间 | string | |
demand_conf | 交通需求数据 | string | |
task_id | 任务ID | string | |
mode | 任务模式 1-od 2-随机 | string | |
create_time | 创建时间 | string | |
update_time | 修改时间 | string | |
time_conf_json | 仿真时间配置参数,参考5.2.2详细字段说明 | ||
vehicle_conf_json | 车辆配置参数,参考5.2.2详细字段说明 | ||
od_conf_json | od配置参数,参考5.2.2详细字段说明 | ||
randomtrips_conf_json | 随机配置参数,参考5.2.3详细字段说明 | ||
msg | 响应消息 | string |
响应示例:
{
"code": 200,
"data": {
"net_conf": {
"task_id": "9a5a61d8-d89d-469f-90f4-6498c46592db",
"create_time": "2023-12-21T20:38:57",
"update_time": null,
"net_file": "D:\\simulateTaskFiles\\9a5a61d8-d89d-469f-90f4-6498c46592db\\net.xml",
"task_name": "demo-3-阶段"
},
"demand_conf": [
{
"task_id": "9a5a61d8-d89d-469f-90f4-6498c46592db",
"mode": 1,
"create_time": "2023-12-21T20:41:26",
"update_time": "2023-12-29T15:13:14",
"time_conf_json": "{\"begin\":0,\"end\":400,\"stepLength\":0.01}",
"vehicle_conf_json": "{\"vType\":[{\"vClass\":\"passenger\",\"probability\":0,\"maSpeed\":34,\"color\":\"yellow\"},{\"vClass\":\"truck\",\"probability\":1,\"maSpeed\":34,\"color\":\"yellow\"}]}",
"od_conf_json": "{\"odBegin\":0,\"odEnd\":380,\"odMapping\":[{\"from\":\"22\",\"to\":\"21\",\"count\":500},{\"from\":\"16\",\"to\":\"5\",\"count\":500}]}",
"randomtrips_conf_json": null
}
]
},
"msg": null
}
接口地址:/odDemandGenerate
请求方式:POST
请求数据类型:application/json
响应数据类型:*/*
接口描述:通过配置道路起始点方式生成交通需求文件
请求示例:
{
"task_id": "9a5a61d8-d89d-469f-90f4-6498c46592db",
"time_conf_json": "{\"begin\":0,\"end\":100,\"stepLength\":0.5}",
"vehicle_conf_json": "{\"vtype\":[{\"vClass\":\"passenger\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"yellow\"},{\"vClass\":\"truck\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"green\"}]}",
"od_conf_json": "{\"odBegin\":0,\"odEnd\":500,\"odMapping\":[{\"from\":\"22\",\"to\":\"21\",\"count\":\"2\"},{\"from\":\"16\",\"to\":\"5\",\"count\":\"2\"}]}"
}
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
task_id | 任务ID | true | string | ||
time_conf_json | 仿真时间配置参数,非必须,不传后台默认{"begin":0,"end":3600,"stepLength":1}。自定义则需要将下属的json对象转成字符串。 | false | string | ||
begin | begin表示仿真开始时间,单位秒。 | true | int | ||
end | end表示仿真结束时间,单位秒。 | true | int | ||
stepLength | stepLength表示仿真启动后,每走一步的时间步长,单位秒。区间为[0.001~1],步长越小,仿真速度越慢。 | true | double | ||
vehicle_conf_json | 车辆配置参数,非必须,不传后台默认{"vtype":[{"vClass":"passenger","probability":"0.5","maxSpeed":"34","color":"yellow"},{"vClass":"truck","probability":"0.5","maxSpeed":"34","color":"green"}]}。自定义则需要将下属的json对象转成字符串。 | false | string | ||
vtype | vtype表示车辆类型配置,可以有多个。 | true | object | ||
vClass | vClass表示车辆具体类型(passenger:普通乘用车,truck:大货车)。 | true | string | ||
maxSpeed | maxSpeed表示车辆最大速度,单位m/s。 | true | double | ||
color | color表示车辆颜色。 | true | string | ||
probability | probability表示该车型在车流中占比。 | true | double | ||
od_conf_json | od配置参数,必须。自定义则需要将下属的json对象转成字符串。 | true | string | ||
odBegin | odBegin表示车流出发时间段中的开始时间 | true | int | ||
odEnd | odEnd表示车流出发时间段中的结束时间 | true | int | ||
odMapping | od映射关系 | true | object | ||
from | 道路起点edge_id,需要从路网net.xml中获取 | true | string | ||
to | 道路目的地edge_id,需要从路网net.xml中获取 | true | string | ||
count | 车辆数 | true | int | ||
flowOutputProbability | flowOutputProbability表示写概率流或者均匀分布流,true表示为概率流,false表示均匀分布流即车辆等间隔出发,默认false。 | false | boolean |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应码 | string | |
data | 响应参数 | boolean | |
msg | 响应消息 | string |
响应示例:
{
"code": 200,
"data": true,
"msg": null
}
接口地址:/randomtripsDemandGenerate
请求方式:POST
请求数据类型:application/json
响应数据类型:*/*
接口描述:通过配置道路起始点方式生成交通需求文件
请求示例:
{
"task_id": "9a5a61d8-d89d-469f-90f4-6498c46592db",
"time_conf_json": "{\"begin\":0,\"end\":100,\"stepLength\":0.5}",
"vehicle_conf_json": "{\"vtype\":[{\"vClass\":\"passenger\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"yellow\"},{\"vClass\":\"truck\",\"probability\":\"0.5\",\"maxSpeed\":\"34\",\"color\":\"green\"}]}",
"randomtrips_conf_json":"{\"period\":1,\"random\":true,\"randomDepart\":true}"
}
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
task_id | 任务ID | true | string | ||
time_conf_json | 仿真时间配置参数,非必须,不传后台默认{"begin":0,"end":3600,"stepLength":1}。自定义则需要将下属的json对象转成字符串。 | false | string | ||
begin | begin表示仿真开始时间,单位秒。 | true | int | ||
end | end表示仿真结束时间,单位秒。 | true | int | ||
stepLength | stepLength表示仿真启动后,每走一步的时间步长,单位秒。区间为[0.001~1],步长越小,仿真速度越慢。 | true | double | ||
vehicle_conf_json | 车辆配置参数,非必须,不传后台默认{"vtype":[{"vClass":"passenger","probability":"0.5","maxSpeed":"34","color":"yellow"},{"vClass":"truck","probability":"0.5","maxSpeed":"34","color":"green"}]}。自定义则需要将下属的json对象转成字符串。 | false | string | ||
vtype | vtype表示车辆类型配置,可以有多个。 | true | object | ||
vClass | vClass表示车辆具体类型(passenger:普通乘用小汽车,truck:大货车)。 | true | string | ||
maxSpeed | maxSpeed表示车辆最大速度,单位m/s。 | true | double | ||
color | color表示车辆颜色。 | true | string | ||
probability | probability表示该车型在车流中占比。 | true | double | ||
randomtrips_conf_json | 随机配置参数,非必须,不传后台默认{"period":1,"random":false,"randomDepart":false}。自定义则需要将下属的json对象转成字符串。 | false | string | ||
period | 车辆插入率, 默认1,值越小,插入的车辆数据越多。 | false | double | ||
random | 是否真随机,默认false。真随机时则相同配置参数,每次生成的路线数据均不同 | false | boolean | ||
randomDepart | 是否等间隔出发,默认true | false | boolean |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应码 | string | |
data | 响应参数 | boolean | |
msg | 响应消息 | string |
响应示例:
{
"code": 200,
"data": true,
"msg": null
}
ws://{服务名}:{服务端口}/ws/${task_id}/${mode}
或者
ws://{服务名}:{服务端口}/ws/${task_id}/${mode}?loopByTime=false
参数说明:
参数名称 | 参数说明 | 是否必须 | 默认值 |
---|---|---|---|
task_id | 任务ID | 必须 | |
mode | 任务模式 1-od 2-随机 | 必须 | |
loopByTime | 控制仿真循环结束的方式,结束时间到了才结束仿真,或者所有车辆都跑完行程才结束仿真。默认false,即所有车辆都跑完行程才结束仿真。 | 非必须 | false |
websocket客户端可以在仿真期间,向服务端发送动态交互命令,改变正在运行的仿真任务状态。
仿真功能 | webscoket支持输入命令参数 | 参数说明 |
---|---|---|
开启仿真 | {"command":"start"} | 后台会启动一个仿真任务 |
暂停仿真 | {"command":"stop"} | 暂停正在运行的仿真任务 |
恢复仿真 | {"command":"recover"} | 恢复已经暂停的仿真任务 |
关闭仿真 | {"command":"close"} | 关闭已启动的仿真 |
变更仿真时间步长 | {"command":"changeParam","stepLength":0.1} | 仿真时间步长,默认为1秒采集一次,区间为[0.001~1],步长越小,仿真速度越慢。 |
封闭车道 | {"command":"closeLane","closelanes":["1_0"]} | closelanes:封闭车道lane_id列表,需从net.xml文件中获取 |
解封车道 | {"command":"uncloseLane","uncloselanes":["1_0"]} | uncloselanes:解封车道lane_id列表,需从net.xml文件中获取 |
动态增加车辆 | {"command":"addVehicle","vehicleData":[{"edges":[22,21],"num":10,"addType":"once"}]} | vehicleData:动态增加的车辆数据列表。edges:起点和目的地道路edge_id,据此生成行程路线,需从net.xml文件中获取。num:增加车辆数量。addType:增加车辆方式,once为增加一次,always为每个仿真步骤都会增加。 |
车辆变道 | {"command":"changeTarget","vehicleData":[{"vehicleId":"0.0","edge":"-23"}]} | vehicleData:动态改变的车辆数据列表。vehicleId:车辆ID,需从net.xml文件中获取。laneIndex: 要变更车道序号(从右侧车道开始顺序编号,0,1,2,...)。 |
车辆变更目的地 | {"command":"changeTarget","vehicleData":[{"vehicleId":"0.0","edge":"-23"}]} | vehicleData:动态改变的车辆数据列表。vehicleId:车辆ID,需从net.xml文件中获取。edge: 要变目的地的道路edge_id,需从net.xml文件中获取。 |
车道限速 | {"command":"limitLaneSpeed","laneSpeedData":[{"laneId":"1_0","maxSpeed":"5"},{"laneId":"1_1","maxSpeed":"5"},{"laneId":"1_2","maxSpeed":"5"}]} | laneSpeedData:动态限制车道速度数据列表。laneId:车道ID,需从net.xml文件中获取。maxSpeed:限制车道的最大速度。 |
websocket方式仿真时,服务端向客户端推送的响应数据示例:
{
"msgtype":"simulateData",
"data":{
"taskkey":"9a5a61d8-d89d-469f-90f4-6498c46592db_1",
"time":0.5,
"loadedNumber":2,
"departedNumber":2,
"arrivedNumber":0,
"runningNumber":2,
"avgSpeed":18.39763,
"data":[
{
"vehicle_id":"0.0",
"speed":17.437,
"x":1516.22578,
"y":482.34661,
"z":0,
"lane":"22_0",
"angle":303.2581865480051,
"vclass":"passenger",
"color":[
255,
255,
0,
255
]
},
{
"vehicle_id":"1.0",
"speed":19.359,
"x":-0.44943,
"y":1285.53668,
"z":0,
"lane":"16_0",
"angle":122.78335187281229,
"vclass":"passenger",
"color":[
255,
255,
0,
255
]
}
]
}
}
websocket方式仿真时,服务端向客户端推送的响应数据参数说明
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
msgtype | 消息类型 | string | |
data | 当前路网中每个仿真时间步长内,行驶车辆的数据集合 | object数组 | |
taskkey | 任务id | string | |
time | 仿真时间点 | string | |
loadedNumber | 当前仿真时间点,路网中已加载的车辆总数 | int | |
departedNumber | 当前仿真时间点,路网中已出发的车辆总数 | int | |
arrivedNumber | 当前仿真时间点,路网中已到达的车辆总数 | int | |
runningNumber | 当前仿真时间点,路网中正在行驶的车辆总数 | int | |
avgSpeed | 当前仿真时间点,路网中平均车速,单位m/s | double | |
data | 当前仿真时间点,路网中车辆行驶数据列表 | object数组 | |
speed | 车速,m/s | double | |
x | 平面x坐标。x,y,z:以米为单位的坐标(笛卡尔坐标) | double | |
y | 平面y坐标。x,y,z:以米为单位的坐标(笛卡尔坐标) | double | |
z | 平面z坐标。x,y,z:以米为单位的坐标(笛卡尔坐标) | double | |
lane | 车道lane_id | string | |
angle | 车辆的角度(以度为单位) | double | |
vclass | vClass表示车辆具体类型(passenger:普通乘用小汽车,truck:大货车)。 | string | |
color | 车颜色 | ||
msg | 响应消息 | string |
接口地址:/getSimulateDataOnce
请求方式:GET
请求数据类型:
响应数据类型:*/*
接口描述:直接获取仿真所有结果数据
请求示例:
task_id=9a5a61d8-d89d-469f-90f4-6498c46592db
请求参数:
参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
task_id | 任务ID | query | true | string | |
mode | 任务模式 1-od 2-随机 | query | true | int | |
renew | 是否每次都重新执行仿真任务 0-不重新 1-重新。默认0,表示有历史数据直接返回 | query | false | int | |
closelanes | 关闭车道lane_id列表 | query | false | string数组 | |
loopByTime | 控制仿真循环结束的方式,结束时间到了才结束仿真,或者所有车辆都跑完行程才结束仿真。默认false,即所有车辆都跑完行程才结束仿真。 | query | false | bool |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | 响应码 | string | |
data | 响应参数 | object数组 | |
vehicle_id | 车辆id | string | |
data | 车辆行驶数据列表 | object数组 | |
speed | 车速,米每秒,m/s | double | |
x | 平面x坐标。x,y,z:以米为单位的坐标(笛卡尔坐标) | double | |
y | 平面y坐标。x,y,z:以米为单位的坐标(笛卡尔坐标) | double | |
z | 平面z坐标。x,y,z:以米为单位的坐标(笛卡尔坐标) | double | |
lane | 车道lane_id | string | |
angle | 车辆的角度(以度为单位) | double | |
vclass | vClass表示车辆具体类型(passenger:普通乘用小汽车,truck:大货车)。 | string | |
color | 车颜色 | string | |
time | 仿真时间点,单位秒 | double | |
msg | 响应消息 | string |
响应示例:
{
"code": 200,
"data": [
{
"vehicle_id": "0",
"data": [
{
"vehicle_id": "0",
"speed": 0.0,
"x": 1514.46993,
"y": 483.49816,
"z": 0.0,
"lane": "22_0",
"angle": 303.25818654800537,
"vclass": "truck",
"color": [
255,
255,
0,
255
],
"time": 1.5
},
...
]
}
...
],
"msg": null
}