IDL/Mapping

LL_ARC_DISTANCE 함수의 사용법

이상우_idl 2015. 8. 28. 16:04
728x90
반응형

오늘은 LL_ARC_DISTANCE라는 내장함수에 관하여 소개해볼까 합니다. 이 함수의 역할은 지도상의 어떤 경위도 좌표를 갖는 지점으로부터 특정 방위각 방향으로 특정 거리만큼 떨어진 지점의 경위도 좌표를 찾아주는 것입니다. 사실 이와 유사한 느낌의 역할을 하는 MAP_2POINTS라는 함수도 있는데, 이 함수는 경위도 좌표를 아는 두 지점 사이의 거리와 방위각을 구하는데 사용됩니다. 그러나 LL_ARC_DISTANCE는 하나의 지점으로부터 방위각 및 거리를 주고 그만큼 떨어진 지점을 구하는데 사용된다는 차이가 있습니다. 이 함수의 통상적인 사용법은 다음과 같습니다.

 

result = LL_ARC_DISTANCE([lon, lat], dist, az, /DEGREES)

 

여기서 lon, lat는 기준 지점의 경도 및 위도 좌표값이고, dist는 거리, az는 방위각입니다. 그리고  /DEGREES는 경위도 및 방위각을 도(degree) 단위로 나타내기 위하여 사용 가능한 키워드입니다. 이 키워드를 사용하지 않을 경우에는 라디안(radian) 단위로 표시해야 합니다. 방위각은 북쪽이 기준이며 시계 방향으로 증가하는 방식입니다. 따라서 북, 동, 남, 서 방향이 0, 90, 180, 270도가 됩니다. 그리고 거리의 경우는 Arc Distance로 표기해야 합니다. 즉 지구의 대원을 따라가는 궤적상의 원호가 되어야 하기 때문에, km 단위의 거리를 지구 반경 값으로 나눠주면 됩니다. 지구의 반경은 잘 알려진 6378km와 같은 값을 사용해도 되고, IDL 자체에 내장된 !const.r_earth를 사용해도 됩니다. 예를 들어, 동경 110.0도, 북위 50.0도인 지점으로부터 남쪽으로 100km 떨어진 지점의 위치를 구하고자 한다면 다음과 같이 사용하면 됩니다.

 

IDL> result = LL_ARC_DISTANCE([110.0, 50.0], 100./6378., 180, /DEGREES)
IDL> PRINT, result
      110.000      49.1017

남쪽 방향이므로 경도는 그대로이고 위도값만 그만큼 감소한 것을 볼 수 있습니다. 이번에는 동쪽 방향으로 가보겠습니다. 다음과 같이 동쪽으로 100km 떨어진 지점의 위치를 구해봅시다.

 

IDL> result = LL_ARC_DISTANCE([110.0, 50.0], 100./6378., 90, /DEGREES)
IDL> PRINT, result
      111.397      49.9916

 

그러면 역시 결과값이 나오는데, 경도의 값이 늘어난 것은 당연하지만 위도의 값을 보면 미세한 변화가 보입니다. 즉, 동쪽으로 간다고 해도 위도의 값이 고정되지는 않습니다. 그 이유는, 이 함수는 위도가 동일한 원 궤적을 따라는 것이 아니고 무조건 대원(Great Circle)을 따라가기 때문입니다. 다음 두 그림은 이 문제에 관한 이해를 돕기 위하여 제가 그려본 것으로, 첫번째 그림은 기준 지점으로부터 남쪽 방향으로 100km씩 떨어진 지점들을 차례로 표시한 것이고, 두번째 그림은 동쪽 방향으로 100km씩 떨어진 지점들을 차례로 표시한 것입니다.

 

따라서 LL_ARC_DISTANCE를 사용하여 지점 좌표를 구할 경우, 특히 중위도 영역의 지점으로부터 동쪽이나 서쪽 방향으로 떨어진 지점의 좌표를 구할 경우에는 이런 부분을 유의할 필요가 있습니다. 위의 두 그림을 얻기 위하여 사용한 예제 코드는 아래에 첨부합니다. 제가 전에 이 블로그에서 연재했던 지도 관련 게시물에서 사용했던 방법론들을 약간 응용한 버전이라고 보면 됩니다.

 

limit = [0, 100, 60, 160]; 지도 범위

lon = 110.0; 기준 지점 경도
lat = 50.0; 기준 지점 위도
re = !const.R_EARTH/1000; 지구 반경
incr = 100.0; 거리(km)
np = 30; 산출할 지점들의 갯수
win = WINDOW(DIMENSIONS=[800, 800])
m = MAP('Geographic', LIMIT=limit, FILL_COLOR='Light Blue', $
  ASPECT_RATIO=0, MARGIN=0.08, /CURRENT)
mc = MAPCONTINENTS(FILL_COLOR='Gold', THICK=2)
mg = m.MapGrid
mg.Linestyle = 2
mg.LABEL_POSITION = 0
sym = SYMBOL(lon, lat, 'circle', /DATA, $
  SYM_COLOR='black', /SYM_FILLED, SYM_FILL_COLOR='crimson')
FOR i = 1, np DO BEGIN
  crd = LL_ARC_DISTANCE([lon, lat], incr*i/re, 90, /DEGREES)
  ;PRINT, crd
  sym = SYMBOL(crd[0], crd[1], 'circle', /DATA, $
    SYM_COLOR='black', /SYM_FILLED, SYM_FILL_COLOR='crimson')
ENDFOR

반응형