You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Mapbox Android SDK的Kotlin导航应用:如何检测接近途经点

嘿,我来帮你搞定这个接近途经点提前提醒的需求!你已经完成了路线构建和导航启动的核心部分,接下来只需要利用Mapbox Navigation SDK提供的**Milestone(里程碑)**机制,就能轻松实现提前200米触发提示的功能。下面一步步给你拆解:

1. 自定义途经点接近检测里程碑

Mapbox的默认里程碑可能不满足你的自定义距离阈值,所以我们需要自己写一个Milestone类,用来判断当前位置是否距离下一个途经点小于等于200米:

class WaypointApproachMilestone(private val thresholdDistance: Double = 200.0) : RouteMilestone() {
    override fun isTriggered(routeProgress: RouteProgress): Boolean {
        // 先判断是否还有未到达的途经点(排除终点的情况)
        if (routeProgress.remainingWaypoints() <= 0) {
            return false
        }
        // 获取当前位置到下一个途经点的实时距离(单位:米)
        val distanceToNextWaypoint = routeProgress.nextWaypointDistance()
        // 当距离小于等于设定阈值时触发事件
        return distanceToNextWaypoint <= thresholdDistance
    }

    override fun getIdentifier(): String {
        // 返回唯一标识,方便后续在事件中区分是我们的自定义里程碑触发的
        return "waypoint_approach_milestone"
    }
}

2. 启动导航时绑定自定义里程碑

在构建NavigationLauncherOptions的时候,把我们的自定义里程碑添加进去,这样导航过程中SDK就会自动检测这个条件:

// 假设你已经通过NavigationRoute获取到了有效的routeResponse
val navigationLauncherOptions = NavigationLauncherOptions.builder()
    .directionsRoute(routeResponse.route())
    .shouldSimulateRoute(false) // 实际使用时可以根据需求设置是否模拟导航
    .navigationOptions(
        NavigationOptions.builder()
            // 添加我们自定义的途经点接近检测里程碑
            .addMilestone(WaypointApproachMilestone(200.0))
            .build()
    )
    .build()

// 启动导航
NavigationLauncher.startNavigation(this, navigationLauncherOptions)

3. 监听里程碑触发事件,弹出提示

接下来需要实现NavigationEventListener接口,监听里程碑触发的事件,当我们的自定义里程碑被触发时,就可以弹出提示、播放语音或者做其他操作:

class YourNavigationActivity : AppCompatActivity(), NavigationEventListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_navigation)
        
        // 注册导航事件监听
        MapboxNavigation.getInstance(this)?.addNavigationEventListener(this)
    }

    override fun onMilestoneEvent(event: MilestoneEvent) {
        // 判断是不是我们自定义的途经点接近里程碑触发的事件
        if (event.milestone.identifier == "waypoint_approach_milestone") {
            // 获取当前途经点的索引(可以用来关联途经点名称等信息)
            val currentWaypointIndex = event.routeProgress.currentLegProgress()?.legIndex() ?: 0
            // 弹出Toast提示
            Toast.makeText(
                this,
                "即将到达途经点 ${currentWaypointIndex + 1},剩余距离${event.routeProgress.nextWaypointDistance().toInt()}米",
                Toast.LENGTH_SHORT
            ).show()
            
            // 这里还可以扩展:比如播放语音提示、弹出自定义对话框等
        }
    }

    // NavigationEventListener的其他方法可以根据需求实现,不需要的话空实现即可
    override fun onNavigationRunning(isRunning: Boolean) {}
    override fun onRouteProgressChanged(routeProgress: RouteProgress) {}
    override fun onUserOffRoute(location: Location) {}
    override fun onArrival() {}
    override fun onCancelNavigation() {}
    override fun onNavigationFinished() {}
    override fun onNavigationFailed(error: Throwable) {}
}

一些额外的小提示

  • 如果你的途经点有名称,可以从routeResponse.route()?.waypoints()里获取对应索引的名称,让提示更友好
  • 要是需要语音提示,可以结合Mapbox的VoiceInstructionsPlayer或者Android系统的TTS来实现
  • 确保你的Mapbox Navigation SDK版本是v10及以上,Milestone机制在这些版本里支持得更完善

内容的提问来源于stack exchange,提问作者Sébastien STOLZ

火山引擎 最新活动