그곰의 생활

WGS-84 방식의 좌표값을 가지는 두 좌표의 거리를 구하는 함수 본문

Server-side/Lang

WGS-84 방식의 좌표값을 가지는 두 좌표의 거리를 구하는 함수

그곰 2012. 3. 29. 11:59


WGS-84 방식의 좌표값을 가지는 두 좌표의 거리를 구하는 함수이다.
지구를 가상의 구체로 인식하여 위도와 경도로 거리를 구하는 방식으로
반환 단위는 km로 반환된다.

헌데, java 함수와, 오라클 함수 프로시저로 반환된 값이 서로 다른데 뭐가 문제일까했더니
오라클 함수 프로시저에는 파이 값을 이용해서 계산되는 로직이 들어가 있다...
좌표 부분은 잘 몰라서 뭐가 맞는지는 모르겠지만 우선 아래 소스를 이용하면 도움이 많이 될것 같다.

1.java 함수

출처 : http://kiringun.egloos.com/1120861

private static double getDistance_arc(double sLat, double sLong, double dLat, double dLong){ 
        final int radius=6371009;

        double uLat=Math.toRadians(sLat-dLat);
        double uLong=Math.toRadians(sLong-dLong);
        double a = Math.sin(uLat/2) * Math.sin(uLat/2) + Math.cos(Math.toRadians(sLong)) * Math.cos(Math.toRadians(dLong)) * Math.sin(uLong/2) * Math.sin(uLong/2); 
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
        double distance = radius * c;

        return Double.parseDouble(String.format("%.3f", distance/1000));
    }


2.오라클 함수

출처 : http://www.shop-wiz.com/board/main/view/root/sql02/28/0/1

현재 좌표와 구글 좌표를 이용하여 거리 구하는 오라클 프로시저

CREATE OR REPLACE FUNCTION GOOGLE_DISTANCE (
  LAT1 FLOAT, 
  LNG1 FLOAT,
  LAT2 FLOAT,
  LNG2 FLOAT 
)

  RETURN FLOAT
 
IS

  fEARTH_R FLOAT := 6371000.0;
  fPIE FLOAT := 3.141592653589793;
  fRAD FLOAT := 0.0;
  radLAT1 FLOAT := 0.0;
  radLAT2 FLOAT := 0.0;
  radDIST FLOAT := 0.0;
  fDIST FLOAT := 0.0;

BEGIN

  fRAD := fPIE / 180;
  radLAT1 := fRAD * LAT1;
  radLAT2 := fRAD * LAT2;
  radDIST := fRAD * ( LNG1 - LNG2 );
  fDIST := SIN( radLAT1 ) * SIN( radLAT2 );
  fDIST := fDIST + COS( radLAT1 ) * COS( radLAT2 ) * COS( radDIST );
  RETURN ((fEARTH_R * ACOS( fDIST ))/1000);

END;
/

Comments