{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671508829029,"data":{"id":71712121,"title":"4.2.2 切换平行路","slug":"lk0h7d","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"
⚠️ 平行路切换的场景:真实导航 ☑️ ; 模拟导航 ✖️ ;巡航 ✖️
public class LocParallelRoadInfo {\n public int status; /**< 主辅路切换状态:0 非平行路切换期间 1 平行路切换期间 */\n public int flag; /* 主辅路标识(默认0,离线数据计算/在线算路下发)\n * 0:无主辅路(车标所在道路旁无主辅路)\n * 1:车标在主路(车标所在道路旁有辅路)\n * 2:车标在辅路(车标所在道路旁有主路)*/\n public int hwFlag;/**< 高架上下标识(默认0,在线算路下发)\n * 0:无高架\n * 1:车标在高架上(车标所在道路有对应高架下)\n * 2:车标在高架下(车标所在道路有对应高架上) */\n public int count; /**< 主辅路条数(离线数据计算,用于离线算路) */\n public ArrayList<LocParallelRoad> parallelRoadList; /**< 主辅路信息(离线数据计算,用于离线算路) */\n}
RouteService.requestRoute重算参数如下设置:
boolean com.autonavi.gbl.common.path.drive.model.POIForRequest.setPointRoadID(@PointType.PointType1 int pointType,long index,java.math.BigInteger roadID )\t
需要将主辅路观察者回调IPosParallelRoadObserver.onParallelRoadUpdate(LocParallelRoadInfo pstParallelRoad)里面的roadID信息设置给起点(在线算路roadID可以传0,离线算路必须传正确)。
具体数据是:com.autonavi.gbl.pos.model.LocParallelRoadInfo.parallelRoadList[0].roadId(默认第0条即是需要切换过去的道路ID)。
boolean com.autonavi.gbl.common.path.option.RouteOption.setRouteType(@RouteType.RouteType1 int type)
boolean com.autonavi.gbl.common.path.option.RouteOption.setParalleType(@ParalleType.ParalleType1 int type)
来源最近一次OnUpdateNaviInfo回调的信息
boolean com.autonavi.gbl.common.path.option.RouteOption.setCurrentLocation(CurrentPositionInfo posInfo)
//添加平行路信息观察者\nvoid com.autonavi.gbl.pos.PosService.addParallelRoadObserver(IPosParallelRoadObserver pObserver)\n//删除平行路信息观察者\nvoid com.autonavi.gbl.pos.PosService.removeSwitchParallelRoadObserver(IPosSwitchParallelRoadObserver pObserver)
void com.autonavi.gbl.pos.observer.IPosParallelRoadObserver.onParallelRoadUpdate(LocParallelRoadInfo pstParallelRoad)
void com.autonavi.gbl.pos.PosService.switchParallelRoad(LocSwitchRoadType switchRoadType, java.math.BigInteger pstRoadID)
void com.autonavi.gbl.pos.observer.IPosSwitchParallelRoadObserver.onSwitchParallelRoadFinished()
说明:函数详情,请复制函数名称到在线API搜索
private PosService mPosService;\n// 初始化PosService\nprivate void initPosService() {\n mPosService = (PosService) ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.PosSingleServiceID);\n // 定位模块初始化设置略,详见定位章节\n // TODO : mPosService.init();...\n \n // 添加平行路信息观察者\n mPosService.addParallelRoadObserver(posParallelRoadObserver);\n // 添加切换平行路观察者\n mPosService.addSwitchParallelRoadObserver(posSwitchParallelRoadObserver);\n}\n\nIPosParallelRoadObserver posParallelRoadObserver = new IPosParallelRoadObserver() {\n @Override\n public void onParallelRoadUpdate(LocParallelRoadInfo locParallelRoadInfo) {\n if (locParallelRoadInfo.status != 1) //不在主辅路切换期间\n {\n // 监听平行路信息回调,实现显示 "主路/辅路" "桥上/桥下"切换的提示按钮\n if (locParallelRoadInfo.flag == 1) // 车标在主路(车标所在道路旁有辅路)\n {\n // todo: 显示 "切到辅路" 按钮\n }\n else if (locParallelRoadInfo.flag == 2) // 车标在辅路(车标所在道路旁有主路)\n {\n // todo: 显示 "切到主路" 按钮\n }\n if (locParallelRoadInfo.hwFlag == 1) // 车标在高架上(车标所在道路有对应高架下)\n {\n // if (net == true){}\n // todo: 显示 "切到桥下" 按钮,在线才显示\n }\n else if (locParallelRoadInfo.hwFlag == 2) // 车标在高架下(车标所在道路有对应高架上)\n {\n // if (net == true){}\n // todo: 显示 "切到桥上" 按钮,在线才显示\n }\n if (locParallelRoadInfo.flag == 0 || locParallelRoadInfo.hwFlag == 0)\n {\n // todo: 隐藏 主辅路、上下桥按钮\n }\n if (locParallelRoadInfo.parallelRoadList.size() > 0)\n {\n // 获取切换的roadid,后面重新算路时需要设置给起点\n BigInteger roadId = locParallelRoadInfo.parallelRoadList.get(0).roadId;\n }\n }\n else // 在主辅路切换期间,不要显示按钮\n {\n // todo: 隐藏 主辅路、上下桥按钮\n }\n }\n};\n\nPathInfo curPath; //当前路线\n\n// 算路结果观察者\nIRouteResultObserver routeResultObserver = new IRouteResultObserver() {\n @Override\n public void onNewRoute(PathResultData pathResultData, ArrayList<PathInfo> pathInfoList, java.lang.Object externData) {\n \n /* 转线程前,这边需要特殊处理。对SDK回调回来的PathInfo对象需重新构造创建一遍 */\n ArrayList<PathInfo> paths = new ArrayList<>();\n for(int i=0;i<pathInfoList.size();i++){\n PathInfo paths =new PathInfo(pathInfoList.get(i));\n paths.add(pathInfo);\n }\n // 根据情况决定是否将后续处理流程转为其他线程处理,如果转线程,只需将下面示例中的HandleNewRoute函数放在指定线程执行即可\n HandleNewRoute(pathResultData, paths);\n }\n\n @Override\n public void onNewRouteError(PathResultData pathResultData, java.lang.Object externData) {\n //code ...\n }\n};\n\n/* UI 线程逻辑 */\nvoid HandleNewRoute(PathResultData pathResultData, ArrayList<PathInfo> paths)\n{\n \tPathsMgr.getInstance().setPathsCache(paths);\n \n \t// 根据客户端逻辑配置当前选中的导航路线下标iCurPathIndex\n int iCurPathIndex = 0;\n // 当前路线\n curPath = paths.get(iCurPathIndex) \n \n // 若之后业务还需使用路线 通过PathsMgr.getPathsCache获取\n // 若不在需当前路线时回收路线 PathsMgr.destoryPathsCache() \n}\n\n\nIPosSwitchParallelRoadObserver posSwitchParallelRoadObserver = new IPosSwitchParallelRoadObserver() {\n @Override\n public void onSwitchParallelRoadFinished() {\n // 监听平行路切换完成的回调\n // TODO:发起新的路线请求,RouteService.requestRoute(RouteOption routeOption)\n // 这里需要把原来的routeOption信息重新设置\n // -->以下是伪代码>>>>>>\n // 由于篇幅关系,这里仅用于说明需要设置的项目清单\n \n // routeOption:拷贝自初始路线请求或最近一次重算的算路请求信息\n // 发生主辅路重算时,需要对上次的routeOption部分内容做如下设置:\n\t\t\n // 设置算路类型为 RouteTypeParallelRoad\n routeOption.setRouteType(RouteTypeParallelRoad)\n // 设置算路附加条件,根据现在的状态设置,一般是更新当前网络在/离线,其它参数保持上一次的不变\n routeOption.setConstrainCode(code);\n \n // 设置行程点信息poiForRequest\n // 对于平行路切换来说终点和途径点一般保持上一次的不变,但是起点需要重新设置,且必须设置起点的道路ID\n // 起点信息poiInfo,来源于定位回调 IPosLocInfoObserver.onLocInfoUpdate\n poiForRequest.reset()\n \n // 起点设置\n POIInfo startPoiInfo = new POIInfo();\n startPoiInfo.realPos.lon = pstLocInfo.matchInfo.get(0).stPos.lon;\n startPoiInfo.realPos.lat = pstLocInfo.matchInfo.get(0).stPos.lon;\n startPoiInfo.type = 0;//GPS点\n poiForRequest.addPoint(PointTypeStart, startPoiInfo)\n // 添加终点,同上一次设置的 \n poiForRequest.addPoint(PointTypeEnd, endPoiInfo); \n // 添加途径点\n for (vialist){\n // 判断是否途径点有效,需要客户端对接INaviObserver.onUpdateViaPass监听回调,剔除已经经过的途径点\n poiForRequest.addPoint(PointTypeVia, viaPoiInfo); //添加途径点\n }\n // 定位回调onLocInfoUpdate的最近一次信息pstLocInfo\n // 添加起点抓路优化信息\n poiForRequest.SetDirection(pstLocInfo.matchRoadCourse);\n poiForRequest.SetReliability(pstLocInfo.courseAcc);\n poiForRequest.SetAngleType(pstLocInfo.startDirType);\n poiForRequest.SetAngleGps(pstLocInfo.gpsDir);\n poiForRequest.SetAngleComp(pstLocInfo.compassDir);\n poiForRequest.SetSpeed(pstLocInfo.speed);\n poiForRequest.SetLinkType(pstLocInfo.matchInfo.get(0).linkType);\n poiForRequest.SetFormWay(pstLocInfo.matchInfo.get(0).formway);\n poiForRequest.SetSigType(pstLocInfo.startPosType);\n poiForRequest.SetFittingDir(pstLocInfo.fittingCourse);\n poiForRequest.SetMatchingDir(pstLocInfo.roadDir);\n poiForRequest.SetFittingCredit(pstLocInfo.fittingCourseAcc);\n poiForRequest.SetPrecision(pstLocInfo.posAcc);\n\t\t\n // 平行路切换必须使用定位onParallelRoadUpdate回调的内容\n roadId = locParallelRoadInfo.parallelRoadList.get(0).roadId\n poiForRequest.setPointRoadID(PointTypeStart, 0, roadId)\n \n // 更新行程点信息\n routeOption.setPOIForRequest(poiForRequest)\n \n // 设置当前导航位置信息\n // 定位回调onLocInfoUpdate的最近一次信息pstLocInfo\n CurrentPositionInfo curLocation;\n curLocation.linkIndex = pstLocInfo.vecPathMatchInfo.get(0).nLinkCur;\n curLocation.pointIndex = pstLocInfo.vecPathMatchInfo.get(0).nPostCur;\n curLocation.segmentIndex = pstLocInfo.vecPathMatchInfo.get(0).nSegmCur; \n curLocation.overheadFlag = locParallelRoadInfo.hwFlag; //0:无高架 1:车标在高架上(车标所在道路有对应高架下) 2:车标在高架下(车标所在道路有对应高架上)\n curLocation.parallelRoadFlag = locParallelRoadInfo.flag; //0:无主辅路(车标所在道路旁无主辅路) 1:车标在主路(车标所在道路旁有辅路) 2:车标在辅路(车标所在道路旁有主路)\n routeOption.setCurrentLocation(curLocation);\n \n // 设置切换类型:高架切换 paralleTypeOverhead 还是 主辅路切换 paralleTypeMainSide,根据主辅路切换信息决定的\n if(locParallelRoadInfo.hwFlag != 0)\n \trouteOption.setParalleType(paralleTypeOverhead);\n if (locParallelRoadInfo.flag != 0)\n routeOption.setParalleType(paralleTypeMainSide);\n\n // 设置当前导航剩余信息接口,来源:最近一次的Guide回调onUpdateNaviInfo \n CurrentNaviInfo curNaviInfo;\n curNaviInfo.remainRouteTime = naviInfo.routeRemain.time;\n curNaviInfo.remainRouteDist = naviInfo.routeRemain.dist;\n curNaviInfo.remainSegmentDist = naviInfo.NaviInfoData[naviInfo.NaviInfoFlag].segmentRemain.dist;\n curNaviInfo.drivingRouteDist = naviInfo.driveDist;\n routeOption.setRemainNaviInfo(curNaviInfo);\n \n // 设置上一次路线进来\n routeOption.setNaviPath(curPath)\n \n // 发起路线重算\n routeService.requestRoute(routeOption)\t\n }\n};