본문 바로가기

Study/Oracle

[oracle] 거리 계산 function

CREATE OR REPLACE FUNCTION SCOTT.calc_distance(

 pLat1 NUMBER,

 pLon1 NUMBER,

 pLat2 NUMBER,

 pLon2 NUMBER)

 RETURN NUMBER

IS

 

-- r is the spherical radius of earth in Kilometers(R은 킬로미터의 지구의 구면 반지름입니다)

cSpherRad CONSTANT NUMBER := 6367;

                                                                        -- The spherical radius of earth in miles is 3956(지구의 구면 반경 3956 마일입니다)

a        NUMBER;

vLat     NUMBER;

vLat1Rad NUMBER;

vLat2Rad NUMBER;

vLon     NUMBER;

vLon1Rad NUMBER;

vLon2Rad NUMBER;

 

BEGIN

  /*

  Most computers require the arguments of trigonometric functions to be

  expressed in radians. To convert lon1, lat1 and lon2,lat2 from

  degrees,minutes, seconds to radians, first convert them to decimal

  degrees. To convert decimal degrees to radians, multiply the number

  of degrees by pi/180 = 0.017453293 radians/degrees.

 

 대부분의 컴퓨터는 삼각 함수의 인자가 될 것을 라디안으로 표현하는 것을 요구합니다.

 도, 분, 초 라디안으로부터 lon1, lat1 및 lon2, lat2을 변환하려면 먼저 그들 진수 도로 변환합니다.

 라디안의 진수 학위를 변환하려면 pi/180 = 0.017453293 라디안 / 도씩 도의 수를 모두 곱하면됩니다.

  */

 

  vLat1Rad := pLat1 * 0.017453293;

  vLat2Rad := pLat2 * 0.017453293;

  vLon1Rad := pLon1 * 0.017453293;

  vLon2Rad := pLon2 * 0.017453293;

 

  vLon := vLon2Rad - vLon1Rad;

  vLat := vLat2Rad - vLat1Rad;

 

  a := POWER(SIN(vLat/2),2) + COS(vLat1Rad) * COS(vLat2Rad) *

  POWER(SIN(vLon/2),2);

 

  /*

  The intermediate result c is the great circle distance in radians.

  Inverse trigonometric functions return results expressed in radians.

  To express c in decimal degrees, multiply the number of radians by

   180/pi = 57.295780 degrees/radian.

  The great circle distance d will be in the same units as r.

 중간 결과 C는 라디안의 큰 동그라미 거리입니다.

 역 삼각 함수는 라디안으로 표현 결과를 반환합니다.

 소수 도의 온도에서 C를 표현하려면 180/pi = 57.295780도 / 방사부하여 라디안의 수를 곱하면됩니다.

 큰 원형의 거리 d는 R과 같은 단위가 될 것입니다.

  */

 

  RETURN ROUND(cSpherRad * 2 * ATAN2(SQRT(a), SQRT(1-a)),2);

EXCEPTION

  WHEN OTHERS THEN

    RETURN 999;

END calc_distance;

/