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;
/
'Study > Oracle' 카테고리의 다른 글
[oracle] 버스 노선 추가 (0) | 2019.05.21 |
---|---|
[oracle] 테이블 복사, PROCEDURE & FUNCTION 실행 (0) | 2019.05.21 |
[oracle] 엔터값 사라지게 하는 query 문 (0) | 2019.05.21 |
[Oracle] SQL LOADER , 테이블 중복 데이터 체크 (0) | 2019.05.20 |
[Oracle] 파일 읽고 쓰기 (0) | 2019.05.20 |