IDL/Mapping

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

이상우_idl 2015. 5. 7. 14:27
728x90
반응형

우리가 지도를 그리는 작업을 하는데 있어서, 지도만 그려놓고 끝나는 경우들보다는 그 위에 뭔가 추가적인 자료들을 중첩해야 하는 경우들이 더 많습니다. 물론 그 추가적인 자료라는 것이 간단한 문자, 기호, 도형 등과 같은 경우도 있지만, 더 나아가면 2차원 자료가 되어야 하는 경우도 상당히 자주 나옵니다. 어떤 지역에 대하여 다양한 방식의 탐사 및 관측 작업들을 수행하고, 그렇게 얻어진 2차원 데이터를 그 지역 지도와 중첩하여 표출하는 작업의 필요성이 매우 커지고 있는 시대이기도 합니다. 그래서 이와 같이 특정 지역의 지도를 그리고 2차원 데이터를 중첩하여 표출하는 방법에 관하여 설명해보기로 하겠습니다.


지도상의 특정 지역에 대하여 얻어진 2차원 격자 자료들은 대개 경도 및 위도 기반의 격자 구조를 갖는 경우가 많습니다. 예를 들어 다음과 같이 400X400의 화소 크기를 갖는 2차원 격자 자료가 있다고 가정해보겠습니다.


data = HANNING(400, 400)


여기서는 HANNING이라는 IDL의 내장함수를 사용하였으며, 이렇게 만들어진 data라는 2차원 배열은 내부적으로 0~1의 범위를 갖는 원소값들을 갖게 됩니다. 이 자료를 그냥 통상적인 2차원 이미지의 형태로 표출해보기 위하여 다음과 같은 예제 코드를 작성해보았습니다.  2차원 자료의 크기와 같은 그래픽창을 띄워 여백없이 꽉 차게 이미지로 표출하되 74번 컬러테이블을 사용해보았습니다. 특히 IMAGE라는 함수가 사용되었다는 점을 주목할 필요가 있습니다. IMAGE 함수는 NG(New Graphics) 체계에서 이미지 표출을 위해 사용하는 그래픽 함수로서, DG(Direct Graphics)의 TV/TVSCL과 유사한 기능을 수행합니다. 어쨌든 이 예제 코드를 실행하여 얻은 결과는 다음 그림과 같습니다.


sz = SIZE(data, /DIM)

w = WINDOW(DIMENSIONS=sz)

i = IMAGE(data, MARGIN=0, RGB_TABLE=74, /CURRENT)



이번에는 data가 지리적인 특정 영역에 대하여 얻어진 2차원 자료라고 가정해보겠습니다. 그 영역의 범위는 경도상으로 동경 120~130도이고 위도상으로는 북위 30~45도에 해당되는 한반도 및 그 주변에 걸쳐있다고 가정해봅시다. 그러면 이러한 경위도 범위를 갖는 지도를 그린 다음 그 위에 data를 이미지의 형태로 중첩하면 됩니다. 이러한 작업을 위하여 다음과 같은 예제 코드를 작성해 보았습니다.


win = WINDOW(DIMENSIONS=[600, 600])

m = MAP('Geographic', LIMIT=[30, 120, 45, 135], $

  ASPECT_RATIO=0, MARGIN=0.08, /CURRENT)

im = IMAGE(data, RGB_TABLE=74, IMAGE_DIMENSIONS=[15, 15], $

  IMAGE_LOCATION=[120, 30], GRID_UNITS=2, /OVERPLOT)

mc = MAPCONTINENTS('GSHHS_i_L1.shp', THICK=2)


먼저 적절한 크기의 그래픽창을 띄운 다음 MAP 함수를 사용하여 지도를 그리는 과정으로 시작됩니다. 투영법은 가장 간단한 Geographic을 사용하였고, 경위도의 범위를 LIMIT 속성에 부여하였습니다. 하지만 그 다음 순서가 지금까지의 예제들과는 악간 차이가 있는데, 바로 IMAGE 함수를 사용한 이미지 표출 과정이 여기서 등장합니다. 그 뒤에 MAPCONTINENTS 함수를 사용하여 해안경계선을 그리게 됩니다. 즉, 이미지를 표출한 후 해안경계선을 그려야 합니다. 순서가 반대가 될 경우에는 그려진 해안경계선을 이미지가 덮어버리기 때문입니다.


여기서는 IMAGE 함수의 사용법에 주목해야 합니다. 특히 IMAGE_DIMENSIONS, IMAGE_LOCATION, GRID_UNITS와 같은 속성들에 대한 이해가 필요합니다. 먼저 IMAGE_DIMENSIONS는 2차원 이미지가 커버해야 할 영역의 가로 및 세로 크기를 경도 및 위도 단위로 나타낸 것입니다. 앞서 이미 언급했던 영역의 경위도 범위를 보면 그 크기는 가로 및 세로 모두 15도임을 확인할 수 있으므로 [15, 15]라는 값을 부여하면 됩니다. 그리고 IMAGE_LOCATION 속성은 이미지의 좌측하단이 위치해야 할 지점을 나타내는 경위도 좌표입니다. 경도 및 위도의 시작점이므로 [120, 30]이라는 값을 부여하면 됩니다. 그리고 GRID_UNITS라는 속성에 2라는 값이 부여되어 있는데, 이것은 앞서 언급된 IMAGE_로 시작되는 속성들에 부여되는 값들이 도(Degree) 단위임을 뜻합니다. 이어서 사용된 MAPCONTINENTS 함수에서는 앞서 그림 26에서 사용되었던 대륙경계선 자료가 사용되었습니다. 이러한 과정이 바로 지도를 그리고 특정 경위도 범위를 커버하는 이미지를 중첩하는 기본적인 방법입니다. 그리고 추가적으로 다음과 같은 과정들을 수행하여 지도 좌표선 및 기타 설정들을 마무리해 보았습니다.


mg = m.MapGrid

mg.Linestyle = 2

mg.LABEL_POSITION = 0

mg.Font_Size = 12

mg.Clip = 0


여기서는 문자 폰트의 크기를 12로 설정하였습니다. 이 설정을 따로 하지 않을 경우 디폴트 크기가 9이기 때문에 좀 작은 느낌이 있어서 이와 같이 설정하였습니다. 그리고 Clip이란 속성을 0으로 설정하는 것은 MAPCONTINENTS로 그려진 대륙 경계선이 격자선 관련 문자들을 약간 가리는 경우가 발생할 경우 해결책으로 사용하면 좋은 팁이므로 알아두면 좋습니다. 이제 지금까지의 과정들을 모두 실행하면 그 결과는 다음 그림과 같이 얻어집니다.



이러한 방식의 중첩은 지도의 경위도 범위와 이미지의 경위도 범위가 서로 달라도 가능합니다. 즉 예를 들어 지금 사용중인 이미지의 경위도 범위가 120~135, 30~45인 상태인데, 배경 지도 자체를 115~140, 25~50과 같이 더 큰 경위도 범위를 갖도록 그릴 수도 있습니다. 이런 경우에는 이미지는 지도상의 해당 경위도 범위에만 걸쳐서 나타나게 됩니다. 위의 예제 코드에서 MAP 함수가 사용된 부분만 다음과 같이 경위도 범위를 변경하여 그려보면 됩니다. 그 결과는 다음 그림과 같습니다.


m = MAP('Geographic', LIMIT=[25, 115, 50, 140], $

  ASPECT_RATIO=0, MARGIN=0.08, /CURRENT)



다음 회에서는 투영법이 다른 지도상의 중첩 및 컬러바 삽입에 관하여 알아보기로 하겠습니다.

반응형