IDL/Mapping

IDL에서 지도의 표출 및 활용법에 관하여 [10]

이상우_idl 2015. 4. 20. 20:56
728x90
반응형

앞서 서울과 베이징 두 도시의 위치를 표시했던 것과 비슷한 방식으로 이번에는 서울과 LA 두 도시의 위치를 표시하고, 서울을 출발하여 LA로 운행하는 비행기의 항로 궤적을 선의 형태로 표시하고자 합니다. 이 가상의 항로의 궤적은 단순히 두 지점을 잇는 직선이 아니고, 궤적을 이루는 여러 지점들이 있어서 이 좌표 정보들이 합쳐진 형태입니다. 이를 위하여 먼저 지도를 그리고 서울과 LA의 위치를 지도상에 모두 표시해봅시다. 경위도 범위가 좀 커질 것 같아서 Geographic 투영법을 사용하여 그려보기로 합니다. 앞서 이미 설명되었던 다양한 방법들을 동원하여 다음과 같은 예제코드를 작성할 수 있습니다.


win = WINDOW(DIMENSIONS=[800, 500])

m = MAP('Geographic', LIMIT=[0, 110, 80, 250], $

  FILL_COLOR='cyan', ASPECT_RATIO=0, MARGIN=0.08, /CURRENT)

mc = MAPCONTINENTS(FILL_COLOR='Gold', THICK=2)

mg = m.MapGrid

mg.Linestyle = 2

mg.LABEL_POSITION = 0

sym1 = SYMBOL(126.97, 37.57, 'circle', /DATA, SYM_SIZE=0.8, $

  SYM_COLOR='black', /SYM_FILLED, SYM_FILL_COLOR='crimson')

tx1 = TEXT(126.97, 38.60, 'Seoul', /DATA, FONT_NAME='Courier', $

  FONT_STYLE='bold', FONT_SIZE=10, FONT_COLOR='blue', $

  ALIGNMENT=0.5,/FILL_BACKGROUND, FILL_COLOR='white')

sym2 = SYMBOL(-118.25, 34.05, 'circle', /DATA, SYM_SIZE=0.8, $

  SYM_COLOR='black', /SYM_FILLED, SYM_FILL_COLOR='crimson')

tx2 = TEXT(-118.25, 35.10, 'LA', /DATA, FONT_NAME='Courier', $

  FONT_STYLE='bold', FONT_SIZE=10, FONT_COLOR='blue', $

  ALIGNMENT=0.5,/FILL_BACKGROUND, FILL_COLOR='white')

RESTORE, 'path_coords.sav'

line = POLYLINE(path_lons, path_lats, /DATA, $

  COLOR='crimson', THICK=2)


여기서는 가상의 항로 궤적에 해당되는 가상의 데이터가 사용되었습니다. 이 궤적을 구성하는 31개의 지점 포인트들 각각에 대한 경도 및 위도 값들로 이루어진 path_lons, path_lats라는 배열로서, 이 두 배열들은 ’path_coords.sav’ 라는 파일의 내용을 RESTORE 명령으로 복원하였습니다 (이 파일도 아래에 첨부되어 있습니다). 이렇게 복원된 배열들을 POLYLINE 함수의 인자로 사용하여 모든 지점들을 연결하는 하나의 선을 그릴 수 있습니다. 그리고 위 예제코드의 전반부에서는 서울 및 LA의 위치에 원형 심볼 및 문자를 표시하였는데, 특히 폰트와 관련된 각종 속성들을 사용하여 문자 표출을 약간 다른 느낌으로 해보았습니다. 이와 같이 그려본 결과는 다음 그림과 같습니다.


path_coords.sav



그리고 지도의 투영법을 바꿔서 그릴 경우에는 그 투영법에 맞게 선을 그려줍니다. 앞서 여러번 사용했던 Lambert Conformal Conic 도법으로 그려본다면, 앞선 예제코드에서 MAP 함수가 사용되었던 내용만 다음과 같이 바꿔주면 됩니다. 그리고 이렇게 투영법만 바꿨을 경우에는 다음 그림과 같은 결과를 얻게 됩니다.


m = MAP('Lambert Conformal Conic', LIMIT=[0, 110, 80, 250], $

  STANDARD_PAR1=30, STANDARD_PAR2=60, $

  FILL_COLOR='cyan', ASPECT_RATIO=0, MARGIN=0.08, /CURRENT)



이와 같이 어떤 궤적을 구성하는 포인트들의 좌표값들을 모두 알고 있다면, 이를 이용하여 지도상에서 자유롭게 선을 표현할 수 있습니다. 이번에는 그림 22와 같은 그림을 기반으로 하되, 마치 항공기가 실제로 이 궤적을 따라 움직이는 것과 같은 느낌을 주는 동영상을 Animation GIF의 형태로 만들어보겠습니다. 다음은 이러한 작업을 위하여 작성된 코드로서, 앞서 그림 22를 얻기 위하여 작성되었던 예제코드의 뒷부분에 바로 이어서 실행되어야 합니다.


wfile = 'test_map_draw.gif'

sym = SYMBOL(path_lons[0], path_lats[0], 'star', /SYM_FILLED, $

  SYM_FILL_COLOR='magenta', SYM_COLOR='black', SYM_SIZE=2, /DATA)

FOR j = 1, N_ELEMENTS(path_lons)-1 DO BEGIN

  lons_seg = path_lons[0:j]

  lats_seg = path_lats[0:j]

  line.SetData, lons_seg, lats_seg

  sym.setData, path_lons[j], path_lats[j]

  IF fig_sav THEN BEGIN

    cap = win.CopyWindow(RESOLUTION=96)

    tmp = COLOR_QUAN(cap, 1, red, green, blue)

    WRITE_GIF, wfile, tmp, red, green, blue, /MULTIPLE, $

      delay=10, repeat_count=5

  ENDIF

ENDFOR

IF fig_sav THEN WRITE_GIF, wfile, /CLOSE


여기서는 항공기를 나타내는 별표 기호를 SYMBOL 함수를 사용하여 구현하고, 항로의 궤적을 따라서 그 위치가 계속 변하도록 하였습니다. 위치의 변동은 반복문내에서 기호(sym) 및 선의 궤적(line)의 속성을 setData 메서드를 사용하여 순차적으로 변경하는 방식으로 구현되었습니다. 그러면서 각 반복회차마다의 화면을 CopyWindow 메서드를 사용하여 캡쳐하고, 이 내용을 COLOR_QUAN 함수를 사용하여 8비트 캡쳐 이미지의 형태로 얻은 다음 WRITE_GIF 명령으로 개별 프레임 이미지로 붙여나가는 과정들이 반복문내에 포함되도록 하였습니다. 이와 같이 구현된 Animation GIF 파일은 웹브라우저상에서 보는 것이 가장 효과적입니다. 이 파일은 다음과 같이 웹브라우저상에서 에니메이션의 형태로 볼 수 있도록 하였습니다.


http://www.spweather.com/~lee/test_map_draw.gif



path_coords.sav
0.0MB
반응형