如何在Mapbox Android导航SDK中强制偏离路线时执行掉头?
问题描述
开发基于MapBox SDK的逐向导航App时,遇到以下问题:用户偏离路线后,SDK自动重路由不会考虑掉头回到原路线,需要实现重路由时强制执行掉头操作的逻辑。已尝试.bearings选项、.continueStraight和.enableRefresh方法,但均未生效。
初始路线计算代码如下:
mapboxNavigation.requestRoutes( RouteOptions.builder() .applyDefaultNavigationOptions(DirectionsCriteria.PROFILE_WALKING)//TODO DirectionsCriteria.PROFILE_CYCLING .coordinatesList(listOf(originPoint, testPoint1, testPoint2, testPoint3, testPoint4, destination)) .waypointIndicesList(listOf(0, 5)) //TODO .build(),
可行解决方案
1. 自定义OffRouteObserver接管重路由逻辑
先关闭SDK默认的自动重路由,再通过自定义观察者监听偏离路线事件,手动构造包含掉头要求的路线请求:
// 关闭默认重路由,避免与自定义逻辑冲突 mapboxNavigation.setIsReRouteEnabled(false) // 注册自定义偏离路线观察者 mapboxNavigation.registerOffRouteObserver(object : OffRouteObserver { override fun onOffRoute(offRoute: OffRoute) { // 获取当前用户位置,无位置则终止逻辑 val currentLocation = mapboxNavigation.getLastKnownLocation() ?: return val currentPoint = Point.fromLngLat(currentLocation.longitude, currentLocation.latitude) // 获取原路线的最近匹配段,确定掉头后要回到的路径点 val routeProgress = mapboxNavigation.getRouteProgress() ?: return val targetRoutePoint = routeProgress.currentRoute()?.routeOptions()?.coordinates()?.get( routeProgress.currentLegProgress()?.currentStepIndex() ?: 0 ) ?: return // 构造强制允许掉头的重路由参数 val reRouteOptions = RouteOptions.builder() .applyDefaultNavigationOptions(DirectionsCriteria.PROFILE_WALKING) // 路线起点为当前位置,终点为原路线的最近匹配点 .coordinatesList(listOf(currentPoint, targetRoutePoint)) // 明确开启掉头允许(步行模式默认可能限制掉头) .allowedUTurns(true) // 设置起点朝向为当前方向的反方向,引导SDK优先计算掉头路径 .bearings(listOf(Bearing(currentLocation.bearing - 180, 45))) .build() // 发起自定义重路由请求 mapboxNavigation.requestRoutes(reRouteOptions) } })
2. 针对重路由场景配置关键参数
之前的尝试未生效,大概率是参数未在重路由请求中正确配置,需确保以下参数在重路由时设置:
.allowedUTurns(true):明确开启掉头权限,部分出行模式默认限制该操作.bearings(...):设置起点朝向约束,强制SDK优先计算反向掉头的路径- 禁用
.continueStraight(true):该参数会引导SDK尽量直行,与掉头需求完全冲突
3. 结合导航状态监听确保逻辑触发
通过监听NavigationState变化,在进入OFF_ROUTE状态时触发自定义重路由,避免遗漏偏离事件:
mapboxNavigation.registerNavigationStateObserver(object : NavigationStateObserver { override fun onNavigationStateChanged(state: NavigationState) { if (state == NavigationState.OFF_ROUTE) { // 调用自定义重路由逻辑(复用上述OffRouteObserver中的请求代码) triggerCustomReRoute() } } })
内容的提问来源于stack exchange,提问作者theMule
相关产品推荐
相关产品推荐

