2014-11-05 4 views
-1

나는 Java & Android에 상당히 익숙하며 코드에 몇 가지 문제가 있습니다.Android GPS 정확도 거리 측정

location1.distanceTo(location2) 방법은 고도 변화를 고려하여 거리를 계산합니까?

다른 문제는 내가 장치를 움직이지는 않지만 측정 거리가 변경된다는 것입니다. 이것은 내가 가지고있는 코드입니다 : 내가 정확성의 문제 또는 네트워크 공급자 수신기없이 지속 언급하고 싶습니다

public class GpsCalculator{ 
public Activity activity; 
private LocationManager locationManager = null; 
private Location previousLocation = null; 
private double totalDistance = 0D; 
private Context context; 
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 1 meter 
private static final long MIN_TIME_BW_UPDATES = 1000; // 1 second 
TextView distance_tracker; 

public GpsCalculator(TextView dt) { 
    distance_tracker = dt; 
} 


public void run(Context act){ 
    context = act; 
    // Get the location manager 
    locationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE); 

    // Add new listeners with the given params 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener); // Network location 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener); // Gps location 
} 

public void stop(){ 
    locationManager.removeUpdates(locationListener); 
} 
DecimalFormat df = new DecimalFormat("#"); 
private LocationListener locationListener = new LocationListener(){ 
    @Override 
    public void onLocationChanged(Location newLocation){ 
     if (previousLocation != null){ 
      GpsCalculator.this.totalDistance += previousLocation.distanceTo(newLocation); 
     } 

     // Update stored location 
     GpsCalculator.this.previousLocation = newLocation; 

     CharSequence text = Double.toString(totalDistance); 
     int duration = Toast.LENGTH_SHORT; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 

     distance_tracker.setText(df.format(totalDistance)+ " m"); 
    } 

    @Override 
    public void onProviderDisabled(String provider) {} 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
}; } 

.

결론

코드는 정확하지만 GPS 데이터의 정확도가 아닙니다. 나는 Carsten의 대답에 대한 의견에서 이것을 이해했다.

답변

1

위치 객체는 고도 정보도 포함하기 때문에 고도가 고려됩니다.

위치가 업데이트간에 변경됩니까? 나는 그것이 귀하의 경우에 매 초마다 업데이트되기 때문에 그렇게 생각할 것입니다.

+0

그러면 코드를 어떻게 최적화해야합니까? 그렇다면 내가 움직이지 않으면 거리가 변하지 않을 것입니다. –

+0

GPS 제공 업체를 계속 사용하고 MIN_DISTANCE_CHANGE_FOR_UPDATES을 높이고 MIN_TIME_BW_UPDATES도 늘리십시오. 사이에있는 다른 소스의 업데이트를 얻을 수도 있으므로 최종 업데이트와 새 업데이트 사이의 거리가 사용자의 목적에 충분히 큰지 자신을 확인해 볼 가치가 있습니다. – Carsten

+0

GPS 위성의 정확도가 1 미터가 아니라는 것을 상기시켜 주셔서 감사합니다. 나는 야외 활동을 위해 그것을하고있다. 그래서 나는 자전거를 가져갈 것이고, 조금 탈 것이다. –