IDL/New Graphics

NG 체계에서 지도상에 이미지를 중첩할 때 격자가 어긋나는 현상에 관하여

이상우_idl 2017. 10. 27. 20:30
728x90
반응형

NG 체계에서 지도를 표출하고 그 위에 이미지의 형태로 데이터를 중첩 표출하는 방법에 관해서는 제가 예전에 소개를 해드린 바 있습니다. 기본적인 흐름은 MAP 함수를 이용하여 바탕 지도를 표출하고 이어서 IMAGE 함수를 사용하여 그 위에 격자 데이터를 중첩하는 방식인데요. 이 내용이 설명된 게시물들은 아래 링크를 참조하시면 됩니다.

 

http://blog.daum.net/swrush/303

 

http://blog.daum.net/swrush/304

 

그런데 오늘 제가 언급하고자 하는 것은, 이러한 이미지 중첩 과정에 있어서 한가지 주의해야 할 사항에 관한 것입니다. 일종의 버그라고 볼 수 있는 현상이 있는데, 어떤 식으로 나타나는지 그리고 어떤 식으로 해결하면 되는가에 대하여 소개해보기로 하겠습니다. 이 현상은 중첩하고자 하는 2차원 데이터의 격자 갯수가 적은 경우에 두드러지게 나타납니다. 먼저 예제에서 사용하기 위하여 다음과 같이 8x6의 격자 구조를 갖는 가상의 2차원 데이터를 생성해 보았습니다.

 

nx = 8

ny = 6

data = HANNING(nx, ny)*30+5+RANDOMN(-1, nx, ny)

HELP, data

PRINT, MIN(data), MAX(data)

 

이제 간단한 지도를 그리고 그 위에 이 2차원 격자 데이터를 중첩 표출하는 과정을 다음과 같이 진행해 봅시다. 이 과정에 대한 자세한 설명은 위의 링크의 게시물들의 내용으로 대체하기로 하고 여기서는 생략하겠습니다.

 

limit = [10, 110, 60, 170]

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

m = MAP('Geographic', LIMIT=limit, MARGIN=0.1, CLIP=0, /CURRENT)

im = IMAGE(data, RGB_TABLE=73, GRID_UNITS=2, /OVERPLOT, $

  IMAGE_LOCATION=[120, 20], IMAGE_DIMENSION=[40, 30])

mc = MAPCONTINENTS(THICK=2)

mg = m.MapGrid

mg.LABEL_POSITION = 0

mg.GRID_LONGITUDE = 10

mg.GRID_LATITUDE = 10

 

여기서는 경도 범위가 +110~+170도이고 위도 범위가 +10~+70도인 지도를 먼저 표출하였습니다. 그리고 2차원 데이터가 커버하는 영역의 범위가 경도로는 +120~+160도 그리고 위도로는 +20~+60도인 경우를 가정하였습니다. 그 결과는 다음 그림과 같습니다.

 

 

 

혹시 이 그림의 문제점이 무엇인지 보이십니까? 중첩 표출된 이미지의 모습을 보면 사각형의 격자들이 확연히 눈에 띄는데요. 격자들의 갯수를 가로 및 세로 방향으로 세어보시기 바랍니다. 그러면 가로 방향으로는 7개 그리고 세로 방향으로는 5개만 나타나 있는 것이 보이실 겁니다. 원래 데이터는 8x6의 형태였음을 감안한다면, 마치 가로 및 세로 방향으로 각각 한 줄씩 없어진 것처럼 보입니다. 안타깝게도이것은 실제로 존재하는 현상이며 버그라고 보는 것이 맞습니다. 한 마디로 요약한다면 NG 체계에서 지도 상에 이미지를 중첩 표출할 때 이미지 데이터 배열의 각 차원별로 처음에 해당되는 행과 열이 반영되지 않는 문제입니다. 사실 표출되는 2차원 데이터의 격자 갯수가 큰 경우에는 심각한 문제가 아닐 수도 있습니다. 예를 들어 800x600 정도의 격자 구조라면야 그 결과 그림에서 큰 문제를 발견하기는 힘들겠지요. 하지만 데이터의 격자 갯수와는 상관없이, 엄연히 존재하는 문제라는 것은 부인할 수 없습니다.

 

그렇다면 해결책은 무엇일까요? 두가지 방향을 생각해볼 수 있습니다. 첫번째는 IDL 본사인 Harris에서 이 문제를 수정해줄 때까지 기다리는 것인데, 사실 좀 막연합니다. 언제 수정이 될지에 대한 정확한 예측은 매우 어렵습니다. 따라서 대안을 생각해봐야 할 것 같은데, 제가 나름대로 제안해드리는 대안은 이렇습니다. 어차피 반영되지 않을 행과 열을 하나씩 인위적으로 추가하는 방법입니다. 도식적으로 설명을 해본다면, 다음 그림과 같이 원래 데이터가 다음과 같이 8x6인 경우에는 실제 표출은 빨간색 사각형으로 표시된 7x5에 해당되는 부분만 그 대상이 됩니다.

 

 

 

따라서 다음 그림과 같이 이 배열에 인위적으로 행과 열을 하나씩 붙여버리는 방법입니다. 그리고 이렇게 새로 추가된 행과 열에는 모두 NaN값이 들어가도록 합니다. 이렇게 하면 NaN값들로만 구성된 부분은 어차피 나중에 표출이 안될 것이기 때문에, 실제로는 원래 의도했던 대로 8x6의 형태로 중첩 표출이 되도록 하는 약간은 꼼수스러운 방법이긴 합니다.

 

 

 

그렇다면 이와 같이 인위적으로 행과 열을 추가하려면 어떻게 해야 할까요? 약간의 테크닉을 써서 다음과 같은 내용을 추가적으로 사용하면 됩니다. 이렇게 하면 중첩 대상이 되는 2차원 배열인 data는 원래 처음에는 8x6이었지만 이 과정을 거치면 9x7이 됩니다.

 

data_tmp = data

data = MAKE_ARRAY(nx+1, ny+1, VALUE=!values.f_nan)

data[11] = TEMPORARY(data_tmp)

 

이러한 과정만 중간에 추가한 후, 지도 표출 및 중첩 과정은 그대로 사용하면 됩니다. 그 결과는 다음 그림과 같습니다.

 

 

 

보시다시피 비로소 우리가 원래 의도했고 원했던 결과 그림을 얻었습니다. 물론 제가 위에 소개한 꼼수(?)가 최선의 방법이 아닐 수도 있으므로 여러분들 각자 나름의 방법을 사용해보셔도 좋을 것 같습니다. 제 개인적인 생각으로는, 격자 갯수가 어느 정도 큰 데이터일 경우에는 굳이 이러한 방법을 사용하지 않고 표출해도 무방하리라 봅니다. 그리고 격자 갯수가 좀 적은 데이터일 경우에는 이러한 문제점이 존재한다는 것을 감안하고 위의 방법 또는 나름의 다른 방법을 적용하는 것이 좋겠지요. 저도 사실 IDL을 애용하는 유저로서 이러한 내용을 블로그에 소개하는 것이 약간 껄끄럽기도 하지만, IDL도 사람이 만든 프로그래밍 언어이기 때문에 버그나 문제점들이 분명 존재할 수 있다는 점을 한번 생각해보게 되는 계기도 된 것 같습니다.

반응형