2016-09-15 3 views
1

Я создаю приложение для Android, которое показывает местоположение шины на карте с помощью mapbox sdk. Я хочу повернуть маркер на основе местоположения, как это делает приложение Uber. Как я мог достичь этого?Маркерное направление в MapBox android

Код:

IconFactory iconFactory = IconFactory.getInstance(navigationActivity.this); 
    Drawable iconDrawable = ContextCompat.getDrawable(navigationActivity.this, R.drawable.bus); 
    Icon icon = iconFactory.fromDrawable(iconDrawable); 
    map.clear(); 
    CameraPosition position = new CameraPosition.Builder() 
      .target(new LatLng(lat,lon)) // Sets the new camera position 
      .zoom(16) // 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); 
    final Marker marker = map.addMarker(new MarkerOptions() 
      .position(new LatLng(lat,lon)) 
      .title("You!") 
      .snippet("YOu are Currently here.")); 
    marker.setIcon(icon); 
+1

Вы не упоминаете, что проблема вы столкнулись! У вас уже есть функции подшипника и наклона, реализованные в коде – Stallion

+2

Да, когда карта будет загружена, она будет анимироваться и вращаться. Но когда другое место попадает на другую горизонтальную дорогу, значок шины будет идти по этой дороге, но в вертикальном направлении, изображение маркера ... мне нужно, чтобы выровнять по горизонтали @Stallion –

ответ

3

Вот an example, который делает только то, что ваш прошу за исключение вместо автобуса, он отслеживает Международную космическую станцию ​​в режиме реального времени. Вычисление заголовка выполняется с помощью Turf и SDK Mapbox Android Services, но если вам нужен только этот единственный метод, вы можете просто скопировать этот метод из библиотеки. Вот важный код из примера я упоминал выше:

// Make sure you are using marker views so you can update the rotation. 
marker.setRotation((float) computeHeading(marker.getPosition(), position)); 

... 

public static double computeHeading(LatLng from, LatLng to) { 
// Compute bearing/heading using Turf and return the value. 
    return TurfMeasurement.bearing(
     Position.fromCoordinates(from.getLongitude(), from.getLatitude()), 
     Position.fromCoordinates(to.getLongitude(), to.getLatitude()) 
    ); 
} 

Вы также можете использовать этот метод, который я ранее использовал раньше Turf:

// Returns the heading from one LatLng to another LatLng. Headings are. Expressed in degrees 
// clockwise from North within the range [-180,180). The math for this method came from 
// http://williams.best.vwh.net/avform.htm#Crs I only converted it to Java. 
public static double computeHeading(LatLng from, LatLng to) { 
    double fromLat = Math.toRadians(from.getLatitude()); 
    double fromLng = Math.toRadians(from.getLongitude()); 
    double toLat = Math.toRadians(to.getLatitude()); 
    double toLng = Math.toRadians(to.getLongitude()); 
    double dLng = toLng - fromLng; 
    double heading = Math.atan2(Math.sin(dLng) * Math.cos(toLat), 
      Math.cos(fromLat) * Math.sin(toLat) - Math.sin(fromLat) * Math.cos(toLat) * Math.cos(dLng)); 
    return (Math.toDegrees(heading) >= -180 && Math.toDegrees(heading) < 180) ? 
      Math.toDegrees(heading) : ((((Math.toDegrees(heading) + 180) % 360) + 360) % 360 + -180); 
} 
+2

Я пробовал вторую функцию по-прежнему его не указывает на направление. –

+2

Эй, моя ошибка, И от, и до того, как я получил то же самое сердце. Теперь это работает .. Но я еще одна проблема, с которой я сейчас сталкиваюсь сейчас, - это каждый раз, когда маркер меняет его с маркера, вращается, даже если он в том же направлении. –

+0

Этого не должно быть, вращающегося каждый раз. Единственная проблема с приведенным выше кодом - это всегда вращать маркер по часовой стрелке, даже если вращение против часовой стрелки будет короче. Исправить это будет проверка if, чтобы определить, в каком направлении повернуть. – cammace

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