如何让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
相关产品推荐
相关产品推荐

