You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让AnyLogic中Bus代理内的Passenger在Main代理的GIS地图上移动?

AnyLogic子代理GIS移动问题解决方法

核心问题原因

Passenger作为Bus的子代理,默认继承Bus的Continuous局部空间上下文,调用自带moveTo(lat, lon)时,会以Bus的局部坐标为基准,而非Main代理的GIS全局坐标。

具体解决步骤

1. 开放Main地图的访问权限

在Main代理中选中GIS地图组件(map),在右侧属性面板General标签下,将Access设置为Public,让子代理能直接调用地图的坐标转换工具。

2. 调整Passenger的显示层级

打开Bus代理的Presentation面板,选中passengers_presentaion组件:

  • 勾选Advanced标签下的Visible on upper agent
  • 将Draw on选项设置为Main > level(即Main代理中的层级容器,确保Passenger图形直接绘制在Main的GIS地图层级上)

3. 替换Passenger的移动逻辑

放弃使用Passenger自带的moveTo(lat, lon),改用基于Main地图的坐标转换实现全局定位:

直接定位到指定经纬度

// 获取Main的GIS地图实例
GISMap mainMap = getMain().map;
// 经纬度转Main地图的全局屏幕坐标
Point targetScreenPoint = mainMap.getScreenPoint(目标纬度, 目标经度);
// 设置Passenger的全局坐标
setX(targetScreenPoint.getX());
setY(targetScreenPoint.getY());

平滑移动到指定经纬度

GISMap mainMap = getMain().map;
Point targetScreenPoint = mainMap.getScreenPoint(目标纬度, 目标经度);
// 第二个参数为移动速度(单位:像素/时间单位)
moveTo(targetScreenPoint.getX(), targetScreenPoint.getY(), 50);

沿GIS路线移动

如果需要沿Main地图上的预设GIS路线移动,先在Main中创建GISRoute组件并命名(比如busRoute),然后用以下代码:

GISRoute targetRoute = getMain().busRoute;
// 遍历路线上的所有经纬度点,依次移动
for (PointLatLon routePoint : targetRoute.getPoints()) {
    Point screenPoint = getMain().map.getScreenPoint(routePoint);
    moveTo(screenPoint.getX(), screenPoint.getY(), 50);
}

4. 关键注意事项

  • 保持Bus代理的Space type为Continuous,避免在Bus内部生成独立GIS地图
  • 若Passenger需要和Bus保持关联(比如上车状态),可在关联时将Passenger的坐标设为Bus的全局坐标,脱离关联后再执行上述全局移动逻辑

内容的提问来源于stack exchange,提问作者Lucida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:15:22