Haversine Oracle geoLocation

agnusdei·2023년 7월 5일
0
ROUND(6371000.0*ACOS( TRUNC((SIN((3.141592/180)*B.LA_VAL)*SIN((3.141592/180)* #y#))
+(COS((3.141592/180)*B.LA_VAL)*COS((3.141592/180)* #y# )*COS((3.141592/180)*(B.LO_VAL-#x#))),10))/1000,6)*1000 
AS DISTNACE

WHERE DISTNACE < #dis#

해당 코드는 주어진 위도(B.LA_VAL)와 경도(B.LO_VAL)를 사용하여 지정한 좌표(#x#, #y#)와의 거리(DISTANCE)를 계산하는 쿼리를 나타냅니다. 계산된 거리가 지정한 거리(#dis#)보다 작은 경우 조건을 충족합니다.

코드 분석:

  1. ACOS(TRUNC((SIN((3.141592/180)*B.LA_VAL)*SIN((3.141592/180)* #y#)) + (COS((3.141592/180)*B.LA_VAL)*COS((3.141592/180)* #y# )*COS((3.141592/180)*(B.LO_VAL-#x#))),10))

    • 위도와 경도를 사용하여 두 지점 사이의 거리를 구하는 Haversine 공식을 적용합니다.
    • SIN((3.141592/180)*B.LA_VAL)SIN((3.141592/180)* #y#)는 위도에 대한 삼각함수를 계산합니다.
    • COS((3.141592/180)*B.LA_VAL)COS((3.141592/180)* #y#)는 위도에 대한 삼각함수를 계산합니다.
    • COS((3.141592/180)*(B.LO_VAL-#x#))는 경도에 대한 삼각함수를 계산합니다.
    • 이들 값을 조합하여 두 지점 사이의 거리에 대한 삼각함수를 계산합니다.
    • TRUNC(..., 10)은 결과를 소수점 아래 10자리까지 자릅니다.
  2. ROUND(6371000.0 * ..., 6) * 1000

    • 위에서 계산한 거리에 지구의 반지름(6371000.0)을 곱하여 실제 거리(미터 단위)로 변환합니다.
    • ROUND(..., 6)은 결과를 소수점 아래 6자리까지 반올림합니다.
    • * 1000을 통해 결과를 킬로미터 단위로 변환합니다.
  3. AS DISTANCE

    • 계산된 거리 값을 DISTANCE라는 별칭으로 지정합니다.
  4. WHERE DISTANCE < #dis#

    • 계산된 거리(DISTANCE)가 지정한 거리(#dis#)보다 작은 경우 조건을 충족합니다.

이 코드는 위도와 경도를 사용하여 지정한 좌표와의 거리를 계산하고, 그 거리가 지정한 거리보다 작은 경우에 대한 조건을 필터링하는 데 사용될 수 있습니다.

0개의 댓글