2015-07-21 3 views
0

Мне нужно сделать MapView от osmdroid, как в навигаторе. Водитель едет по автомобилю по маршруту, который был взят с сервера. Карта должна быть повернута для него, поскольку маршрут всегда находился перед его точкой на карте. Проблема в том, что я не могу получить прямой угол для каждого вращения. Иногда это работает, иногда нет. И как определить поворот будет, например, на 1 метр? Может быть, это какая-то библиотека или классы в osmdroid, которые могут помочь мне решить эти проблемы?Поверните MapView в osmdroid по маршруту

ответ

0

Я нашел решение. Этот метод вычисляет меня правильно, чтобы повернуть мою карту. Я сократил маршрут до прямых. Когда текущее местоположение находится рядом с следующей строкой, я вызываю этот метод

public double rotateToNextCheckPoint() { 
    int lineId = OfferPreference.getInstance().getCurrentLineId(); 
    if (rotates != null && lineId >= 0 && road.mRouteHigh.size() > 0) { 
     if (lineId < (rotates.size() - 1)) { 
      GeoPoint nextPoint = rotates.get(lineId).getLast(); 
      GeoPoint currPoint = rotates.get(lineId).getFirst(); 

      if (nextPoint == null || currPoint == null) { 
       return 0; 
      } 

      double lat1 = Math.toRadians(currPoint.getLatitude()); 
      double lon1 = Math.toRadians(currPoint.getLongitude()); 
      double lat2 = Math.toRadians(nextPoint.getLatitude()); 
      double lon2 = Math.toRadians(nextPoint.getLongitude()); 

      double cos1 = Math.cos(lat1); 
      double cos2 = Math.cos(lat2); 
      double sin1 = Math.sin(lat1); 
      double sin2 = Math.sin(lat2); 

      double delta = lon2 - lon1; 
      double deltaCos = Math.cos(delta); 
      double deltaSin = Math.sin(delta); 

      double x = (cos1 * sin2) - (sin1 * cos2 * deltaCos); 
      double y = deltaSin * cos2; 
      double z = Math.toDegrees(Math.atan((-y/x))); 
      if (x < 0) { 
       z += 180; 
      } 
      double z2 = (z + 180) % 360 - 180; 
      z2 = -Math.toRadians(z2); 

      double angleRad = z2 - (Math.PI * 2 * Math.floor(z2/(2 * Math.PI))); 
      double angle = Math.toDegrees(angleRad); 
      rotationGestureOverlay.onRotate(-(float) angle, false); 
      return angle; 
     } 
    } 
    return 0; 
} 
0

Я думаю, что лучшее, что вы собираетесь сделать, это ориентировать карту на основе компаса и/или gps. Для этого Osmdroid не имеет ничего встроенного.

Когда вы получаете маршрут с сервера, можете ли вы рассчитать, на какой ноге вы находитесь? Если это так, вы должны выяснить, когда нужно поворачивать карту.