2017-01-19 2 views
0

Я использую 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

Любая помощь очень ценится, спасибо!

EDIT (В отношении возможного дублирующего вопроса - Google direction route from current location to known location) Я считаю, что мой вопрос по-разному.

  1. Я больше озабочен на получение местоположения значка пользователя накладкой, а не фактическое местонахождение (вопрос точности)

  2. Я не заинтересован в том, чтобы поворот к повороту направления (как те, от API направления)

  3. Я использую Mapbox, а не карты google (не слишком уверен, но могут быть некоторые отличия).

Тем не менее этот вопрос, кажется, не ответил на мой вопрос

+0

Возможный дубликат маршрута направления Google от текущего местоположения до известного местоположения (http://stackoverflow.com/questions/32810495/google-directi on-route-from-current-location-to-known-location) –

+0

Я полагаю, что мой вопрос различается по нескольким причинам: 1. Я больше беспокоюсь о том, чтобы определить местоположение наложения пользовательского значка, а не фактическое местоположение (точность выпуска) 2. Я не заинтересован в том, чтобы поворот к повороту направления (как те из API направлений) 3. Я использую MapBox вместо карт Google (не слишком уверен, но там могут быть некоторые различия). Тем не менее этот вопрос, похоже, не отвечает на мой вопрос. – SCTaylor

+0

Это причина написания ** Возможный дубликат ** –

ответ

0

Согласно документации вам нужно только реализовать этот метод проходящего вашего CurrentLocation (происхождение) и назначение

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/

+0

Спасибо за ответ. Я взглянул на API-интерфейсы, но я чувствую, что это слишком сложно для моих нужд. Мне просто нужно нарисовать прямую линию (как ворона) между моим местоположением и статической точкой. Я искал решение, нарисовав простую аннотацию строки. Он почти работает совершенно точно неточно при близком увеличении, как показано на рисунке. Я считаю, что это должно быть возможно без дополнительных вызовов API для навигации api. – SCTaylor

+0

, то вы реализуете drawRoute только любой маршрут? сообщите мне, если вам все еще нужна помощь –

Смежные вопросы