2013-05-10 3 views
1

나는 이것이 사소한 것이라고 생각했을 것입니다. 그러나 여기 하루가 끝나면 뇌가 죽었습니다.2 점 사이의 거리를 알아 내고 속도를 알아 내십시오.

미터 거리가 멀어지면 마일이 깨져서 속도가 깨지는 것 같습니다. 도움을 주시면 감사하겠습니다.

public static double distFromInMiles(double lat1, double lng1, double lat2, double lng2) 
    { 
     double earthRadius = 3959; 
     double dLat = Math.toRadians(lat2-lat1); 
     double dLng = Math.toRadians(lng2-lng1); 
     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
        Math.sin(dLng/2) * Math.sin(dLng/2); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     double dist = earthRadius * c; 

     return dist; 
    } 

    public static double distFromInMeters(double lat1, double lng1, double lat2, double lng2) 
    { 
     double earthRadius = 6378137; 
     double dLat = Math.toRadians(lat2-lat1); 
     double dLng = Math.toRadians(lng2-lng1); 
     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
        Math.sin(dLng/2) * Math.sin(dLng/2); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     double dist = earthRadius * c; 

     return dist; 
    } 

    public static double distFromInKiloMeters(double lat1, double lng1, double lat2, double lng2) 
    { 
     double earthRadius = 6371; 
     double dLat = Math.toRadians(lat2-lat1); 
     double dLng = Math.toRadians(lng2-lng1); 
     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
        Math.sin(dLng/2) * Math.sin(dLng/2); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     double dist = earthRadius * c; 

     return dist; 
    } 


    protected void checkDistanceFromPOI(LatLng latLng) 
    { 

     long thistime = System.currentTimeMillis(); 
     long deltatime = lasttime - thistime; 

     double hours = (double)deltatime/((double)1000.0 * (double)60.0 * (double)60.0); 

     String s; 
     double distFromInMeters = LocationGPSServices.distFromInMeters(lastLocationPoint.latitude, lastLocationPoint.longitude, latLng.latitude, latLng.longitude); 
     double distFromInMiles = LocationGPSServices.distFromInMiles(lastLocationPoint.latitude, lastLocationPoint.longitude, latLng.latitude, latLng.longitude); 
     double speed = distFromInMiles/hours; 
     double speed2 = distFromInMeters/hours; 

     s = "*****************distance from last point \n" 
       + " lat/lng 1 = " + lastLocationPoint.toString() + "\n" 
       + " lat/lng 2 = "+ latLng.toString() + "\n" 
       + " in meters = " + distFromInMeters + "} \n in miles = " + distFromInMiles + " }\n " 
       + " elapsed time = " + deltatime + "secs \n" 
       + " speed = " + speed2 + "meters per hour \n" 
       + " speed = " + speed + "miles per hour"; 
     Toast.makeText(getActivity(), s, Toast.LENGTH_SHORT).show(); 
     Writer.appendText(s, "gps.txt", getActivity()); 
     lasttime = thistime; 

    } 
+1

왜 Location.distanceBetween에서 빌드를 사용하지 않습니까? –

+0

와우, xD가 존재한다는 것을 몰랐다. 나는 그것에 대해 어려움을 겪고 있었다. 대답을하고 아프다. – WIllJBD

+1

Location.distanceBetween이 마음에 들지 않는다면 항상 distFromInMeters() * 1609.344D를 사용할 수 있습니다. –

답변

0

당신은 또한 당신이 위치 클래스의 getSpeed() 방법을 사용할 수 있습니다 정적 메소드

Location.distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results) 

를 사용할 수 있습니다.

관련 문제