IDL/Mapping

IDL 8.0에서 Conic 도법 지도 및 2차원 자료 중첩 표출

이상우_idl 2011. 4. 11. 19:48
728x90
반응형

IDL 8.0에서 새로 도입된 그래픽 함수들을 이용하여 지도를 표출하고 그 위에 이미지나 등위선(Contour)을 중첩하여 표출하는 방법을 살펴보고자 합니다. 이러한 방식의 표출은 물론 기존의 Direct Graphics 기반으로도 가능하지만, 8.0 버전의 그래픽 함수들을 사용하면 좀 더 깔끔한 모습의 그림을 얻을 수 있습니다. 이를 위하여 작성된 예제 코드의 내용을 순차적으로 설명하겠습니다. 이 예제 코드는 아래 링크에 첨부되어있으니 필요하신 분들은 받으셔서 각자 목적에 맞게 수정하여 사용하시면 됩니다.


다운로드 링크 : 여기를 눌러주세요


먼저 WINDOW 함수를 이용하여 가로 및 세로로 600X600의 화소 크기를 갖는 윈도우를 띄웁니다.


win = WINDOW(WINDOW_TITLE='Conic Map with Data', DIMENSIONS=[600, 600])


이제 지도를 그리기 위하여 먼저 MAP 함수를 사용하여 지도의 도법을 셋업합니다. 여기서는 Lambert Conformal Conic 도법 지도를 그리되, 경도의 범위는 120~135도이고 위도의 범위는 30~45도가 되도록 하였습니다. 그리고 이 도법의 지도를 그릴 때 필요한 제반 인자들이 관련 키워드들을 통하여 함께 설정됩니다.


limit = [30, 120, 45, 135]

mapdraw = MAP('Lambert Conformal Conic', CENTER_LONGITUDE=126, CENTER_LATITUDE=38, STANDARD_PAR1=30, $

  STANDARD_PAR2=60, LIMIT=limit, /CURRENT)


여기까지만 실행이 되어도 지도 자체는 그려지지만 다음 그림과 같이 아직 완전히 우리 마음에 들만한 상태는 아닙니다.



따라서 다음과 같이 지도의 위경도 격자 설정과 관련된 정보를 갖고 있는 MAPGRID라는 객체를 추출하여 몇몇 속성들을 목적에 맞게 수정합니다. 여기서는 위도의 간격을 1도로 조정하고, 위경도 값들의 표시위치를 가장자리로 옮기고, 격자의 선은 점선으로, 그리고 위경도 값들의 폰트 사이즈를 좀 키웠습니다. 그러면 다음 그림과 같이 변화된 모습을 볼 수 있습니다.


grid = mapdraw.MAPGRID

grid.GRID_LATITUDE = 1

grid.LABEL_POSITION = 0

grid.LINESTYLE = 1

grid.FONT_SIZE = 12



이제는 대륙 및 해안선을 그려주기 위하여 다음과 같이 MAPCONTINENTS라는 함수를 사용합니다. 그러면 다음 그림과 같이 지도가 그려집니다.


mapc = MAPCONTINENTS()



그런데 뭔가 좀 허전합니다. 해안선이 너무 단순하죠. 우리가 기존에 사용했던 MAP_CONTINENTS 프로시저에서는 /HIRES라는 키워드가 있어서 이걸 사용하면 좀 더 복잡한 해안선을 그릴 수 있었습니다. 하지만 MAPCONTINENTS 함수에서는 아쉽게도 아직은 이 기능이 지원이 안됩니다. 따라서 외부 shape 파일을 사용할 수 밖에 없습니다. 여기서는 GSHHS 해안선 자료들 중 중간 해상도에 해당되는 shape 파일을 이용하고자 합니다. 이를 위하여 필요한 파일들은 앞서 소개된 링크에서 받을 수 있는 첨부파일에 함께 들어있으니, 예제 코드와 같은 폴더에 넣고 사용하면 됩니다. 이 shape 파일을 이용하기 위하여 다음과 같이 수정합니다. 그러면 다음 그림과 같이 좀 더 세밀한 지도를 그릴 수 있습니다.


mapc = MAPCONTINENTS('GSHHS_i_L1.shp')



여기까지 하면 지도는 다 그린 셈입니다. 물론 MAP, MAPCONTINENTS 함수에 관한 IDL 도움말을 찾아보면 여러가지 세부속성들이 많지만, 여기서는 굳이 사용하지는 않겠습니다. 이제 이 지도상에 2차원 자료를 이미지의 형태로 중첩하여 표출해보려고 합니다. 이를 위하여 예제 2차원 자료를 다음과 같이 제가 임의로 200X200의 격자크기를 갖도록 만들었습니다.


data = 255 * HANNING(200, 200)


이러한 2차원 자료가 분포하는 격자가 위경도 기반인 경우도 있고 m단위의 거리 기반인 경우도 있습니다. 여기서는 후자의 경우를 다루도록 하겠습니다. 제 경험상으로는 기상 모델자료들이 이런 식으로 Lambert Conformal Conic 도법의 기반에서 m단위의 일정 거리에 해당되는 격자들에 대하여 산출되는 경우가 많습니다. 여기서는 제가 임의로 경도가 121도이고 위도가 31도인 지점이 기준점이 되고, 격자의 크기는 가로 및 세로 모두 6000m인 경우로 가정해보겠습니다. 그러면 먼저 다음과 같이 기준점의 위경도 좌표를 Cartesian 좌표로 환산합니다.


mapstr = MAP_PROJ_INIT('Lambert Conformal Conic', CENTER_LONGITUDE=126, CENTER_LATITUDE=38, $

  STANDARD_PAR1=30, STANDARD_PAR2=60, LIMIT=limit)


여기서 MAP_PROJ_INIT라는 함수를 썼는데, 안에 들어간 내용은 앞서 지도의 도법을 설정할 때의 내용과 같습니다. 다만 이 도법에 근거한 map structure를 얻기 위한 과정일 뿐입니다. 이를 이용하여 이제 다음과 같이 좌표를 환산합니다.


coord = MAP_PROJ_FORWARD(121, 31, MAP_STRUCTURE=mapstr)


이 환산좌표는 바로 다음에 나오는 IMAGE 함수에서 이미지의 좌측하단의 좌표를 설정하기 위하여 사용됩니다.


dx = 6000

dy = 6000

sz = SIZE(data, /DIM)

img = IMAGE(data, GRID_UNITS=1, IMAGE_LOCATION=coord, IMAGE_DIMENSIONS=[sz[0]*dx, sz[1]*dy], $

  RGB_TABLE=20, /OVERPLOT)

img.TRANSPARENCY = 0.3

img.ORDER, /SEND_BACKWARD


여기서는 IMAGE_LOCATION이라는 속성에 바로 앞서 환산한 Cartesian 좌표를 부여하였습니다. 그리고 IMAGE_DIMENSIONS라는 속성은 이미지가 차지하는 크기를 역시 Cartesian 기반으로 부여한 것입니다. 여기서 GRID_UNITS라는 속성에 1이란 값이 부여되어 있는데, 이는 m단위로 좌표를 설정한다는 의미입니다. 참고로 이 값이 2이면 위경도 단위로 설정한다는 의미가 됩니다. 그리고 RGB_TABLE이란 속성에는 사용하고자 하는 컬러테이블의 번호를 부여합니다. 그리고 맨 뒤의 /OVERPLOT이라는 키워드가 반드시 있어서 지도상에 원하는 위치에 제대로 중첩되어 표출됩니다. 그리고 IMAGE 함수로 생성된 이미지 객체에 대하여 투명도를 조절하기 위하여 TRANSPARENCY라는 속성의 값을 0.3으로 설정하였습니다. 그러면 중첩된 이미지에 투명도를 부여함으로써 이미지가 커버하는 지도의 부분이 완전히 가려지지않도록 하는 효과를 줍니다. 그리고 이 이미지에 해당되는 레이어를 한단계 뒤로 보내는 과정도 필요하다는 점을 유념해야 합니다. 이와 같은 과정을 거치면 다음과 같은 그림을 얻게 됩니다.



이번에는 동일한 2차원 자료에 대한 등위선(Contour)를 중첩해보겠습니다. 앞서 이미지를 중첩할 때 이미지 격자의 위치를 설정했던 것처럼, 등위선을 그릴 때에도 격자의 위치를 설정해줘야 합니다. 따라서 다음과 같이 가로 및 세로 방향의 격자 위치들에 해당되는 벡터를 만들어주고, 이를 CONTOUR 함수에서 사용합니다.


xx = FINDGEN(sz[0]) * dx + coord[0]

yy = FINDGEN(sz[1]) * dy + coord[1]

con = CONTOUR(data, xx, yy, GRID_UNITS=1, C_VALUE=[MIN(data, 50, 100, 150, 200], C_LABEL_SHOW=1, $

  C_LABEL_INTERVAL=0.8, COLOR='Blue', /OVERPLOT)


여기서 사용된 CONTOUR 함수의 내용을 보면, C_VALUE라는 속성은 2차원 배열의 어떤 값들에 대하여 등위선을 그릴 것인지를 정해주는 역할을 합니다. 여기서 사용된 data라는 2차원 자료는 최소값이 0이고 최대값은 255라는 점을 참조하면 됩니다. 그리고 나머지 속성들은 이 CONTOUR 함수에 대한 도움말을 보면 나와있으니 그 내용을 참조하시기 바랍니다. 어쨌든 이 과정까지 거치면 다음과 같이 등위선까지 중첩된 그림을 얻을 수 있습니다.



이렇게 그려진 그림을 저장하려면, 이 그림이 그려진 인터페이스상에 플로피 디스크 모양의 그림이 그려진 버튼을 누르면 됩니다. 그러면 PNG, JPG 등 다양한 포맷들로 이 그림을 저장할 수 있습니다. 지금 이 게시물에 나온 그림들도 다 이 방법을 이용하여 PNG 형식으로 저장된 것들입니다.


이와 같이 IDL 8.0에서 새로 도입된 그래픽 함수들을 잘 활용하면 좀 더 괜찮은 퀄리티의 그래픽을 얻을 수 있습니다. 이 기능들이 아직 처음 도입된 단계라서 몇몇 불완전한 부분 또는 버그들도 좀 있습니다만, 차기 버전에서는 어느 정도 개선된 모습을 보여줄 것이므로 앞으로도 계속 기대가 되는 기능이기도 합니다.

draw_conic_map.pro
0.0MB
draw_conic_map.pro
0.0MB
반응형