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
相关产品推荐
相关产品推荐

