2011-01-11 1 views
23

http://www.movable-type.co.uk/scripts/latlong.html에 제공된 코드 스 니펫을 java로 변환하려고합니다. 하지만 나는 사이트의 결과와 같은 결과를 얻지 못하고있다. 자신의 위도와 경도가 dLon이 올바른지 여부 상태인가 어떤가 나는 확실하지 않다 두 위도와 경도의 중간 점

midPoint(12.870672,77.658964,12.974831,77.60935); 
    public static void midPoint(double lat1,double lon1,double lat2,double lon2) 
    { 
    double dLon = Math.toRadians(lon2-lon1); 
     double Bx = Math.cos(lat2) * Math.cos(dLon); 
     double By = Math.cos(lat2) * Math.sin(dLon); 
     double lat3 = Math.atan2(Math.sin(lat1)+Math.sin(lat2),Math.sqrt((Math.cos(lat1)+Bx)*(Math.cos(lat1)+Bx) + By*By)); 
     double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 
     System.out.print(lat3 +" " + lon3); 
    } 

을 부여하는 경우 다음 두 점 사이의 중간 점을 찾아 내 코드입니다. 그러니 제발 알아 내도록 도와주세요. 추신 : 중점의 위도와 경도를 알아야합니다

답변

62

라디안으로 변환해야합니다. 다음으로 변경 :

public static void midPoint(double lat1,double lon1,double lat2,double lon2){ 

    double dLon = Math.toRadians(lon2 - lon1); 

    //convert to radians 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 
    lon1 = Math.toRadians(lon1); 

    double Bx = Math.cos(lat2) * Math.cos(dLon); 
    double By = Math.cos(lat2) * Math.sin(dLon); 
    double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By)); 
    double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 

    //print out in degrees 
    System.out.println(Math.toDegrees(lat3) + " " + Math.toDegrees(lon3)); 
} 
+0

감사 당신의 도움을 위해 :-) – Allwyn

+0

수식을 보내 주셔서 감사합니다. ! –

+0

안녕하세요 @ 도판 나는 도움이 필요합니다. http://stackoverflow.com/questions/11758582/find-if-the-current-location-is-along-a-straight-line-drawn-between-two-points – RVG

1

다른 수식에 사용 된 위도와 경도 값을 라디안으로 변환해야합니다. 코드에서 ~ 3/5 페이지 아래로 볼 수 있습니다. 단서는 코사인 거리 식의 구형 법의 말에 주어졌다 :

(편의상 내가 라디안에서 변환을 표시하지 않습니다, 여기 이후의 모든 코드 조각에 있습니다, 전체 버전은 아래 참조).

-1

내 마지막 직장은 내가 추적 모듈을 만들어 나는 두 좌표 사이의 거리를 계산하는 공식을 사용하고 있었다.

//Location lat and lon 
double locLat = -23.548333; 
double locLon = -46.636111; 

//Destination lat and lon 
double dstLat = -22.902778; 
double dstLon = -43.206667; 

double arcoAB = 90 - (dstLat); 
double arcoAC = 90 - (locLat); 

double difLon = locLon - (dstLon); 

double cosA = Math.cos(Math.toRadians(arcoAC)) * Math.cos(Math.toRadians(arcoAB)) + Math.sin(Math.toRadians(arcoAC)) * Math.sin(Math.toRadians(arcoAB)) * Math.cos(Math.toRadians(difLon)); 
double acosCosA = Math.toDegrees(Math.acos(cosA)); 

double raio = 2 * Math.PI * 6371; 
double distance = (raio * acosCosA)/360; 

return distance; //Distance in KM, convert to anything else (miles, meters..) if you need.. 

당신은 2

아에 의해 거리를 분할 중간 지점을 얻을 수 있습니다, 이것은 또 다른 공식은 너무 작동합니다

double dLat = Math.toRadians(dstLat - locLat); 
double dLon = Math.toRadians(dstLon - locLon); 

double a = Math.sin(dLat/2) * Math.sin(dLat/2) 
      + Math.cos(Math.toRadians(locLat)) * Math.cos(Math.toRadians(dstLat)) 
      * Math.sin(dLon/2) * Math.sin(dLon/2); 
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
double d = 6371 * c; 

return d; //Distance in KM 
+1

하지만 위도와 경도를 찾아야합니다. 중간 지점. 그렇게하는 방법? – Allwyn

+0

@scooby 같은 해결책을 찾았습니까? – JgdGuy