You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mapbox Navigation Android添加途经点:如何在同一路程中添加所有点?

实现Mapbox Navigation Android一次性添加所有途经点的方案

没问题,我来给你梳理几个可行的实现思路,核心是一次性构建包含所有途经点的完整路线请求,而不是逐个追加到末尾。Mapbox Navigation的导航会话是基于Route对象的,只要你能生成包含所有途经点的Route,就能直接替换当前的导航路线。

思路1:直接构建包含所有途经点的RouteOptions

这是最直接的方法,步骤如下:

  • 收集所有点位并排序:把你的起点、所有需要添加的途经点、终点按导航顺序整理成一个List<Point>。比如:

    // 假设你已经有了起点、途经点列表、终点
    Point startPoint = Point.fromLngLat(startLng, startLat);
    List<Point> waypoints = Arrays.asList(
        Point.fromLngLat(way1Lng, way1Lat),
        Point.fromLngLat(way2Lng, way2Lat)
    );
    Point endPoint = Point.fromLngLat(endLng, endLat);
    
    // 组合成完整的点位序列:起点 → 途经点1 → 途经点2 → 终点
    List<Point> fullRoutePoints = new ArrayList<>();
    fullRoutePoints.add(startPoint);
    fullRoutePoints.addAll(waypoints);
    fullRoutePoints.add(endPoint);
    
  • 构建包含所有途经点的RouteOptions:用RouteOptions.Builder来配置,注意用addWaypoints()批量添加中间的途经点(除了起点和终点):

    RouteOptions routeOptions = RouteOptions.builder()
        .origin(fullRoutePoints.get(0))
        .destination(fullRoutePoints.get(fullRoutePoints.size() - 1))
        // 添加中间的所有途经点
        .addWaypoints(fullRoutePoints.subList(1, fullRoutePoints.size() - 1))
        .accessToken(getString(R.string.mapbox_access_token))
        .build();
    
  • 请求新路线并更新导航:通过NavigationRoute请求路线,成功后替换当前的导航路线(无论是否已经开始导航):

    NavigationRoute.builder(this)
        .routeOptions(routeOptions)
        .build()
        .getRoute(new Callback<RouteResponse>() {
            @Override
            public void onResponse(Call<RouteResponse> call, Response<RouteResponse> response) {
                if (response.body() != null && !response.body().routes().isEmpty()) {
                    Route newFullRoute = response.body().routes().get(0);
                    
                    // 如果已经在导航中,直接更新当前路线
                    if (navigationMapRoute != null) {
                        navigationMapRoute.updateRoute(newFullRoute);
                    } 
                    // 如果还没启动导航,用新路线启动
                    else {
                        NavigationLauncherOptions options = NavigationLauncherOptions.builder()
                            .route(newFullRoute)
                            .shouldSimulateRoute(false)
                            .build();
                        NavigationLauncher.startNavigation(YourActivity.this, options);
                    }
                }
            }
    
            @Override
            public void onFailure(Call<RouteResponse> call, Throwable throwable) {
                // 处理路线请求失败的情况,比如弹Toast提示
                Toast.makeText(YourActivity.this, "路线请求失败", Toast.LENGTH_SHORT).show();
            }
        });
    

思路2:如果需要优化途经点顺序(比如最短路径)

如果你不确定途经点的最优顺序,可以用Mapbox的Optimization API来生成最优路径,再用优化后的点位构建RouteOptions:

  • 构建OptimizationOptions,传入所有点位(包括起点和终点),设置优化目标(比如最短时间):

    OptimizationOptions optimizationOptions = OptimizationOptions.builder()
        .coordinates(fullRoutePoints)
        .profile(DirectionsCriteria.PROFILE_DRIVING)
        .accessToken(getString(R.string.mapbox_access_token))
        .build();
    
  • 请求优化后的路线,拿到优化后的点位顺序,再用这个顺序构建RouteOptions,之后的步骤和思路1一致。

注意事项

  • 途经点数量限制:Mapbox的不同计划对途经点数量有上限,免费计划一般最多支持25个途经点,超出会导致请求失败,记得根据你的需求调整。
  • 导航状态处理:如果在导航过程中替换路线,Mapbox Navigation会自动切换到新路线,继续引导,不需要重启导航。

内容的提问来源于stack exchange,提问作者Thomas Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:24:20