관리 메뉴

nalaolla

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

ORACLE

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

날아올라↗↗ 2015. 12. 20. 18:30
728x90
반응형

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

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



1.java 함수


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.오라클 함수

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


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;
/

728x90
반응형

'ORACLE' 카테고리의 다른 글

hr스키마 테스트  (0) 2015.12.21
데이터 병합  (0) 2015.12.21
25가지 효율적인 sql작성법  (0) 2015.12.20
오라클 함수 - ROLLUP, CUBE, GROUPING  (0) 2015.12.20
오라클(ORACLE) 날짜 레코드 만들기 CONNECT BY  (0) 2015.12.20