AnyLogic中如何通过数据表经纬度配置moveTo块实现列车GIS移动
报错原因与修复方案
"Non-unique value in the database"报错的核心原因是数据库查询语句未使用唯一筛选条件,单次查询返回了多条记录,修复步骤如下:
- 给存储列车时刻表的数据表添加唯一主键字段(如自增id、唯一车次号),确保每条列车运行记录可被唯一定位
- 为列车Agent提前添加属性存储目标坐标,避免在moveTo执行时临时查询数据库:
- 给列车Agent新增4个double类型属性:
depLon、depLat、arrLon、arrLat,新增1个String类型属性trainId存储唯一车次标识 - 在source块生成列车实例时完成属性赋值,示例代码放在source块的On exit动作中:
注意必须使用// 替换train_schedule为你的表名,替换字段名为你实际表的对应字段名 agent.trainId = (String) selectFrom(train_schedule) .where(train_schedule.id.eq(agent.getIndex())) .uniqueResult(train_schedule.train_id); agent.arrLon = (double) selectFrom(train_schedule) .where(train_schedule.train_id.eq(agent.trainId)) .uniqueResult(train_schedule.arr_lon); agent.arrLat = (double) selectFrom(train_schedule) .where(train_schedule.train_id.eq(agent.trainId)) .uniqueResult(train_schedule.arr_lat);uniqueResult()方法获取查询结果,确保查询仅返回单条记录。 - 给列车Agent新增4个double类型属性:
MoveTo块动态设置GIS目的地配置
不需要在moveTo块中配置固定目的地,直接调用列车Agent提前存储的经纬度生成目标GIS点即可,配置规则如下:
- moveTo块的目的地类型选择
Point - 点参数输入动态值:
new GISPoint(agent.arrLon, agent.arrLat, defaultGISMap)
(把defaultGISMap替换为你工程中GIS地图组件的变量名)
AnyLogic会自动基于GIS地图的路网生成行驶路径,不需要手动导入铁路线路。
注意事项
- 确保数据表存储的经纬度坐标系和GIS地图默认的WGS84坐标系一致,避免坐标偏移
- 若需要停靠到已创建的站场Agent,可提前将所有站场存入
Map<String, Agent>集合,key为站场名称,moveTo目的地类型选择Agent,值输入stationMap.get(agent.arrStationName),稳定性高于直接传经纬度 - 所有数据库查询操作尽量在代理生成阶段完成,不要在仿真运行过程中反复查询数据库,避免触发并发查询异常
内容的提问来源于stack exchange,提问作者Tatianna
相关产品推荐
相关产品推荐

