{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671516404487,"data":{"id":71713946,"title":"17.7.3.3 离线算路一致性","slug":"rbbz62","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"
离线算路一致性 和《在线算路一致性》的区别主要有几点:
(1)任何一端HMI发起离线算路请求,双端设备也都能收到算路结果回调。重点在于,远端设备的算路结果pathInfoList为空。因为离线规划得到的路线,无法通过序列化进行跨设备传输。远端收到的离线算路结果仅仅用于告知远端HMI,另外一台设备的离线算路已经完成,仅此而已。远端如果也想得到一样的路线,需要参照下面第(4)点的操作。
(2)任何一端HMI主动发起离线算路请求,必须要设置RouteConsisAdditionService.setRoutePlanTime设置离线算路时间。因为离线地图数据中可能有分时段限行的数据,必须通过这个接口设置正确的物理时间,否则有可能会出现两端计算出来的离线路线不一样的bad case。这个接口仅仅在多屏一致性服务开启,且,离线算路的情况下才需要设置。
假设距离:
深圳某市中心路段,上午7:00前限行,7:00后不限行。
如果两端设备不做离线算路的时间统一,由于两台设备之前的跨进程、跨设备通信的时间差,有可能一台设备在06:59:59发起算路,另外一台设备在07:00:01发起算路,两端规划出来的路线就会不同。
(3)同上,任何一端HMI主动发起离线算路请求,RouteOption.setOfflineReqCustomIdentityId必须要设置,且不能设置空字符串。举例说明,HMI调用此接口设置"offlineReq1",则离线算路得到的多条路线pathInfoList,其中的PathInfo.getOfflineReqCustomIdentityId接口得到的路线id就会以"offlineReq1_0","offlineReq1_1","offlineReq1_2" 排布。
(4)任何一端HMI主动发起离线算路请求,另外一台设备HMI会收到IRouteConsisAdditionObserver.onSyncRouteOption回调接收到相同的离线算路参数。建议HMI不要去修改这个RouteOption中的任何参数,此RouteOption中的行程点/路线偏好/offlineReqCustomIdentityId都和另外一台设备一致,HMI不修改任何参数,直接用来发起算路,才能确保两台设备得到一致的离线路线。
特殊情况:屏幕间的启动有先后问题,当其他屏幕算路完成后,后启动的屏幕没有算路信息。
com.autonavi.gbl.route.RouteConsisAdditionService
com.autonavi.gbl.route.observer.IRouteConsisAdditionObserver
com.autonavi.gbl.route.observer.IRouteResultObserver
com.autonavi.gbl.route.model.PathResultData
成员 | 含义 | 备注 |
requestId | 算路id | |
planChannelId | 路线规划通道Id | 用于标识本次算路结果来源于发起端设置的SdkName,主屏则固化为"MainSdk"。 |
其余PathResultData的成员,参考《5.3.4 算路结果回调》
void com.autonavi.gbl.route.RouteService.getRouteConsisAdditionService(RouteConsisAdditionService ser)
void com.autonavi.gbl.route.RouteConsisAdditionService.addRouteConsisAdditionObserver(IRouteConsisAdditionObserver ob)\nvoid com.autonavi.gbl.route.RouteConsisAdditionService.removeRouteConsisAdditionObserver(IRouteConsisAdditionObserver ob)
void com.autonavi.gbl.route.RouteConsisAdditionService.setRoutePlanTime(GDataTime dataTime)
com.autonavi.gbl.common.path.RouteOption.setOfflineReqCustomIdentityId(string customIdentity)
void com.autonavi.gbl.route.observer.IRouteConsisAdditionObserver.onSyncRouteOption(RouteOption option)
void com.autonavi.gbl.route.RouteService.addRouteResultObserver(IRouteResultObserver ob)
void com.autonavi.gbl.route.RouteService.removeRouteResultObserver(IRouteResultObserver ob)
void com.autonavi.gbl.route.observer.IRouteResultObserver.onNewRoute(PathResultData pathResultData, ArrayList<PathInfo> pathInfoList, java.lang.Object externData)
void com.autonavi.gbl.route.observer.IRouteResultObserver.onNewRouteError(PathResultData pathResultData, java.lang.Object externData)
说明:函数详情,请复制函数名称到在线API搜索
RouteService mRouteService = (RouteService)ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.RouteSingleServiceID);//取得算路服务(RouteService)\nRouteConsisAdditionService mConsisRouteService = (RouteConsisAdditionService)mRouteService.GetRouteConsisAdditionService();\n...\nRouteOption routeOption = RouteOption.create();//生成算路条件(RouteOption)\n...\n//做成行程点信息\nPOIInfo startInfo = new POIInfo();\nPOIInfo endInfo = new POIInfo();\npoiForRequest = POIForRequest.create();\npoiForRequest.addPoint(PointType.PointTypeStart, startInfo);//起点\npoiForRequest.addPoint(PointType.PointTypeEnd, endInfo);//终点\n// 获取最新的定位信息,重新更新以下算路信息\nLocInfo info = new LocInfo();\npoiForRequest.setDirection(info.matchRoadCourse);\npoiForRequest.setReliability(info.courseAcc);\npoiForRequest.setAngleType(info.startDirType);\npoiForRequest.setAngleGps(info.gpsDir);\npoiForRequest.setAngleComp(info.compassDir);\npoiForRequest.setSpeed(info.speed);\npoiForRequest.setLinkType(info.matchInfo[0].linkType);\npoiForRequest.setFormWay(info.matchInfo[0].formway);\npoiForRequest.setSigType(info.startPosType);\npoiForRequest.setFittingDir(info.fittingCourse);\npoiForRequest.setMatchingDir(info.roadDir);\npoiForRequest.setFittingCredit(info.fittingCourseAcc);\npoiForRequest.setPrecision(info.posAcc);\n...\n\nrouteOption.setPOIForRequest(poiForRequest);//设置算路行程点\nrouteOption.setRouteStrategy(RouteStrategy.RequestRouteTypeBest);//速度优先(推荐道路)(在线无效,离线有效)\nrouteOption.setConstrainCode(RouteConstrainCode.RouteFreewayStrategy | 0x100); //算路时考虑高速优先,并带上离线标志位\nrouteOption.setRouteType(RouteType.RouteTypeCommon);//INIT\nrouteOption.setOddFunction(True, True); //开启ODD请求,开启ODD请求和一次算路结果合并\n...\n// 设置多屏一致性服务相关的必要操作\nrouteOption.SetOfflineReqCustomIdentityId("offline1"); // 每一次算路设置的标识字符串必须不同\nGDataTime time = new GDataTime(); // 设置正确的系统时间\nmConsisRouteService.setRoutePlanTime(time);\n...\nmRouteService.requestRoute(routeOption);//算路请求
RouteService mRouteService = (RouteService)ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.RouteSingleServiceID);//取得算路服务(RouteService)\n...\n//接收到离线算路参数,不做修改,直接算路\nIRouteConsisAdditionObserver.onSyncRouteOption(routeOption);\n...\nmRouteService.requestRoute(routeOption);//算路请求