2017-01-21 29 views
1

Привет, я делал приложение для расчета расстояния и скорости движения. Все функции получения скорости и расстояния работают нормально, однако во время тестирования я увидел ошибку, в которой расстояние начинает измеряться, только если скорость составляет 19 км/ч. +Ошибка вычисления расстояния android

Может кто-нибудь понять, почему это может что происходит?

Благодаря

//initialize location listener 
    locationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      getSpeed(location); 
      getDistance(location); 
     } 

     @Override 
     public void onStatusChanged(String s, int i, Bundle bundle) { 

     } 

     @Override 
     public void onProviderEnabled(String s) { 

     } 

     @Override 
     public void onProviderDisabled(String s) { 
     } 

     //get the speed from the given location updates 
     public void getSpeed(Location location) { 
      currentSpeed = (location.getSpeed() * 3600/1000); 
      String convertedSpeed = String.format("%.2f", currentSpeed); 
      speedTxt.setText(convertedSpeed + "Km/h"); 
     } 

     private void getDistance(Location location) { 

      //to capture current location and keep as starting position of person 
      if (pLat == 500.0 && pLng == 500.0){ 
       pLat = location.getLatitude(); 
       pLng = location.getLongitude(); 
      } 

      if (cLat == 500.0 && cLng == 500.0){ 
       cLat = location.getLatitude(); 
       cLng=location.getLongitude(); 
      } 

      //to check is the person has changed location 
      if (pLat != cLat && pLng != cLng) { 
       pLat = cLat; 
       pLng = cLng; 
      } 

      //update the current location 
      cLat = location.getLatitude(); 
      cLng = location.getLongitude(); 

      //call the calculation method 
      distance += getDistanceBetweenGeoPoints(cLat, cLng, pLat, pLng); 
      String convertedDistance = String.format("%.2f", distance); 
      distanceTxt.setText(" " + convertedDistance); 
     } 

     public double getDistanceBetweenGeoPoints(Double cLat, Double cLng, Double pLat, Double pLng) { 
      // CALCULATE DISTANCE BETWEEN TWO POINTS 
      double earthRadius = 6367; //meters 
      double dLat = Math.toRadians(cLat - pLat); 
      double dLng = Math.toRadians(cLng - pLng); 
      double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(Math.toRadians(cLat)) * Math.cos(Math.toRadians(pLat)) * 
          Math.sin(dLng/2) * Math.sin(dLng/2); 
      double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
      double dist = (double) (earthRadius * c); 
      dist = Math.round(dist * 100)/100.0; 

      return dist; 
     } 
    }; 

ответ

1

Ваша функция getDistanceBetweenGeoPoints собирается вернуться ровно 0 для небольших различий в месте из-за этой линии:

dist = Math.round(dist * 100)/100.0; 

Try округления общее расстояние только для отображения в GetDistance ():

//call the calculation method 
distance += getDistanceBetweenGeoPoints(cLat, cLng, pLat, pLng); 
String convertedDistance = String.format("%.2f", Math.round(dist * 100)/100.0); 
distanceTxt.setText(" " + convertedDistance); 
+0

Спасибо за ответ, я попробую :) – MariusBrave

+0

Да, это сработало, спасибо большое @Sam – MariusBrave

0
private void getDistance(Location location) { 

    //to capture current location and keep as starting position of person 
    if (pLat == 500.0 && pLng == 500.0) { 
     pLat = location.getLatitude(); 
     pLng = location.getLongitude(); 
    } 

    if (cLat == 500.0 && cLng == 500.0) { 
     cLat = location.getLatitude(); 
     cLng = location.getLongitude(); 
    } 

    //to check is the person has changed location 
    if (pLat != cLat && pLng != cLng) { 
     pLat = cLat; 
     pLng = cLng; 
    } 

    //update the current location 
    cLat = location.getLatitude(); 
    cLng = location.getLongitude(); 

    //call the calculation method 
    distance += getDistanceBetweenGeoPoints(cLat, cLng, pLat, pLng); 
    //String convertedDistance = String.format("%.2f", distance); 
    String convertedDistance = String.format("%.2f", Math.round(distance * 100)/100.0); 
    distanceTxt.setText(" " + convertedDistance); 
} 

public double getDistanceBetweenGeoPoints(Double cLat, Double cLng, Double pLat, Double pLng) { 
    // CALCULATE DISTANCE BETWEEN TWO POINTS 
    double earthRadius = 6367; //meters 
    double dLat = Math.toRadians(cLat - pLat); 
    double dLng = Math.toRadians(cLng - pLng); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(Math.toRadians(cLat)) * Math.cos(Math.toRadians(pLat)) * 
        Math.sin(dLng/2) * Math.sin(dLng/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    double dist = (double) (earthRadius * c); 
    //dist = Math.round(dist * 100)/100.0; 

    return dist; 
}