从我的位置绘制折线到标记

时间:2017-01-19 08:45:29

标签: android mapbox

我正在使用Mapbox(4.2.1)从我的位置到目标位置绘制一条线。我打算使用直线作为极其基本的导航辅助工具。因此,我正在重新绘制指南OnMyLocationChanged()。但是,当我的位置发生变化时,它会将线条绘制到我的新位置,但MyLocationView(用户图标)不会按照相应更新(参见下图)。

他们最终会再次结束会议,但需要一些时间。看起来这条线被绘制在精度半径内,但我更喜欢它是否能直接从用户图标中绘制线条。

是否有一种简单的方法可以在用户(地图上的实际图标)和用户移动时更新的位置之间画一条线?

我的OnMyLocationChanged是:

MapboxMap.OnMyLocationChangeListener listner = new MapboxMap.OnMyLocationChangeListener(){
        @Override
        public void onMyLocationChange(final @Nullable Location locationChanged) {
            //If we are not targeting anything or we are not tracking location
            if(target == null || !map.isMyLocationEnabled()) return;

            mapView.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(MapboxMap mapboxMap) {
                    //Log.i("LOC-MAPLINE", "Drawing from mapLoc call");

                    //Error if we don't have a location
                    if(!mapboxMap.isMyLocationEnabled() || locationChanged == null) return;

                    LatLng[] points = new LatLng[2];

                    final Location myLoc = locationChanged;

                    LatLng loc = new LatLng(myLoc.getLatitude(), myLoc.getLongitude());
                    LatLng dest = new LatLng(target.getLatitude(), target.getLongitude());
                    points[0] = loc;
                    points[1] = dest;

                    mapboxMap.removeAnnotations();

                    loadMarker(target);


                    PolylineOptions poly = new PolylineOptions()
                            .add(points)
                            .color(Color.parseColor("#3887be"))
                            .width(5);
                    line = mapboxMap.addPolyline(poly);
                }
            });
        }
    };

Line error

非常感谢任何帮助,谢谢!

编辑(关于可能重复的问题 - Google direction route from current location to known location) 我认为我的问题有所不同,原因有几个。

  1. 我更关心的是获取用户图标叠加的位置而不是实际位置(准确性问题)

  2. 我对转弯方向不感兴趣(就像方向API那样)

  3. 我使用的是Mapbox而不是谷歌地图(不太确定,但可能存在一些差异)。

  4. 然而,这个问题似乎没有回答我的问题

1 个答案:

答案 0 :(得分:0)

根据文档,您只需要实现此方法传递currentLocation(origin)和destination

private void getRoute(Position origin, Position destination) throws ServicesException {

    MapboxDirections client = new MapboxDirections.Builder()
      .setOrigin(origin)
      .setDestination(destination)
      .setProfile(DirectionsCriteria.PROFILE_CYCLING)
      .setAccessToken(MapboxAccountManager.getInstance().getAccessToken())
      .build();

    client.enqueueCall(new Callback<DirectionsResponse>() {
      @Override
      public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
        // You can get the generic HTTP info about the response
        Log.d(TAG, "Response code: " + response.code());
        if (response.body() == null) {
          Log.e(TAG, "No routes found, make sure you set the right user and access token.");
          return;
        } else if (response.body().getRoutes().size() < 1) {
          Log.e(TAG, "No routes found");
          return;
        }

        // Print some info about the route
        currentRoute = response.body().getRoutes().get(0);
        Log.d(TAG, "Distance: " + currentRoute.getDistance());
        Toast.makeText(
          DirectionsActivity.this,
          "Route is " + currentRoute.getDistance() + " meters long.",
          Toast.LENGTH_SHORT).show();

        // Draw the route on the map
        drawRoute(currentRoute);
      }

      @Override
      public void onFailure(Call<DirectionsResponse> call, Throwable throwable) {
        Log.e(TAG, "Error: " + throwable.getMessage());
        Toast.makeText(DirectionsActivity.this, "Error: " + throwable.getMessage(), Toast.LENGTH_SHORT).show();
      }
    });
  }

private void drawRoute(DirectionsRoute route) {
    // Convert LineString coordinates into LatLng[]
    LineString lineString = LineString.fromPolyline(route.getGeometry(), Constants.OSRM_PRECISION_V5);
    List<Position> coordinates = lineString.getCoordinates();
    LatLng[] points = new LatLng[coordinates.size()];
    for (int i = 0; i < coordinates.size(); i++) {
      points[i] = new LatLng(
        coordinates.get(i).getLatitude(),
        coordinates.get(i).getLongitude());
    }

    // Draw Points on MapView
    map.addPolyline(new PolylineOptions()
      .add(points)
      .color(Color.parseColor("#009688"))
      .width(5));
  }

参考https://www.mapbox.com/android-sdk/examples/directions/