首页 > 解决方案 > Mapbox(Android)中两点之间的路由

问题描述

我正在使用 MapBox 在两点之间创建一条路线。我已经有两点的 LatLng 并且已经在源点和目标点成功添加了标记,但问题是,我无法在它们之间创建路线。这是代码。我不知道我缺少什么,但是我遵循了一个教程,但是在那个教程中,Tutor 正在创建当前位置和在地图上单击的位置之间的路线,并且他正在 onMapClicked 方法中做一些事情,因为我没有使用这种方法,因为有定制点。相反,我在 onMapReady 方法中做一些事情,而不是所有过程都是相同的。

package com.devaj.googlemaps;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.devaj.googlemaps.models.TDD;
import com.mapbox.api.directions.v5.models.DirectionsResponse;
import com.mapbox.api.directions.v5.models.DirectionsRoute;
import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.maps.Style;
import com.mapbox.services.android.navigation.ui.v5.route.NavigationMapRoute;
import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;

public class NavigationActivity extends AppCompatActivity implements OnMapReadyCallback{

    public static final String TAG = "NavigationActivity";
    private MapView mapView;
    private TDD tdd;
    private Point originPosition, dstPosition;
    private Double originLat, originLng, dstLat, dstLng;
    private LatLng originLatLng, dstLatLng;
    private MapboxMap map;
    private NavigationMapRoute navigationMapRoute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Mapbox.getInstance(this, getString(R.string.access_token));
        setContentView(R.layout.activity_navigation);
        MapBox(savedInstanceState);
    }

    @Override
    public void onMapReady(@NonNull MapboxMap mapboxMap) {
        map = mapboxMap;
        originPosition = Point.fromLngLat(originLat, originLng);
        dstPosition = Point.fromLngLat(dstLat, dstLng);

        MarkerOptions options = new MarkerOptions();
        options.title("Source");
        options.position(originLatLng);

        MarkerOptions options1 = new MarkerOptions();
        options1.title("Destination");
        options1.position(dstLatLng);

        mapboxMap.addMarker(options);
        mapboxMap.addMarker(options1);

        mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {
            @Override
            public void onStyleLoaded(@NonNull Style style) {
                navigationMapRoute = new NavigationMapRoute(null, mapView, map, R.style.NavigationMapRoute);
                getRoute(originPosition, dstPosition);
            }
        });


    }

    private void MapBox(Bundle savedInstanceState)
    {
        Intent i = getIntent();
        tdd = (TDD) i.getSerializableExtra("tdd");

        originLat = Double.parseDouble(tdd.getmSrcLat());
        originLng = Double.parseDouble(tdd.getmSrcLng());
        dstLat = Double.parseDouble(tdd.getmDstLat());
        dstLng = Double.parseDouble(tdd.getmDstLng());

        originLatLng = new LatLng(originLat, originLng);
        dstLatLng = new LatLng(dstLat, dstLng);

        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(this);
    }

    private void getRoute(Point origin, Point destination)
    {

//        CameraPosition position = new CameraPosition.Builder()
//                .target(originLatLng) // Sets the new camera position
//                .zoom(17) // Sets the zoom
//                .bearing(180) // Rotate the camera
//                .tilt(30) // Set the camera tilt
//                .build(); // Creates a CameraPosition from the builder
//
//        map.animateCamera(CameraUpdateFactory
//                .newCameraPosition(position), 7000);


        NavigationRoute.builder(NavigationActivity.this)
                .accessToken(Mapbox.getAccessToken())
                .origin(origin)
                .destination(destination)
                .build()
                .getRoute(new Callback<DirectionsResponse>() {
                    @Override
                    public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
                        if (response.body() == null)
                        {
                            Usable.logMessage(TAG, "No routes found, Check User and Access Token..");
                            return;
                        } else if (response.body().routes().size() == 0)
                        {
                            Usable.logMessage(TAG, "No routes found..");
                            return;
                        }


                        DirectionsRoute currentRoute = response.body().routes().get(0);
                        navigationMapRoute.addRoute(currentRoute);
                    }

                    @Override
                    public void onFailure(Call<DirectionsResponse> call, Throwable t) {
                        Log.e(TAG, "Error: "+ t.getMessage());
                    }
                });

    }

    @Override
    protected void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

}

标签: androidmapboxmapbox-android

解决方案


每当您使用Point.fromLngLat().

例如,dstPosition = Point.fromLngLat(dstLat, dstLng);是错误的顺序。

当您尝试上面发布的代码时,您的 logcat 中是否有日志消息?搜索Mbgl。是否为response.body()空?路线大小 == 0 吗?基本上,如果您在说I am unable to create a route between them.

顺便说一句,如果您想获得两点之间的路线,则不必使用 Mapbox Navigation SDK for Android Mapbox Java SDK 可以做到这一点。

另外,我会将这些onMapReady()东西移到onStyleLoaded()回调中。

@Override
  public void onMapReady(@NonNull MapboxMap mapboxMap) {
    mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {
      @Override
      public void onStyleLoaded(@NonNull Style style) {
        map = mapboxMap;
        originPosition = Point.fromLngLat(originLng, originLat);
        dstPosition = Point.fromLngLat(dstLng, dstLat);

        MarkerOptions options = new MarkerOptions();
        options.title("Source");
        options.position(originLatLng);

        MarkerOptions options1 = new MarkerOptions();
        options1.title("Destination");
        options1.position(dstLatLng);

        mapboxMap.addMarker(options);
        mapboxMap.addMarker(options1);

        navigationMapRoute = new NavigationMapRoute(null, mapView, map, R.style.NavigationMapRoute);
        getRoute(originPosition, dstPosition);
      }
    });
  }

推荐阅读