IDL/Direct Graphics

DG 체계에서 지도와 이미지 중첩 표출 [1]

이상우_idl 2023. 9. 1. 14:06
728x90
반응형

지도와 이미지 데이터를 중첩하여 표출하는 방법에 관해서는 제가 이 블로그에서 여러 차례 소개한 바 있습니다. 물론 주로 NG(New Graphics) 체계를 기준으로 관련 예제와 함께 소개를 했었는데요. DG(Direct Graphics) 체계에서의 방법에 관해서는 제대로 소개를 한 적이 없었던 것 같습니다. 그래서 DG 체계에서 지도와 이미지를 중첩 표출하는 방법에 관하여 이번 기회에 본격적으로 소개를 해보고자 합니다. 먼저 DG 체계에서 지도를 표출하는 방식에 관하여 간략하게 언급을 하고 진행하는 것이 좋을 것 같습니다. DG 체계에서 지도의 표출과 관련된 기능들을 보면 MAP_SET, MAP_CONTINENTS, MAP_GRID, MAP_PROJ_INIT 등이 있습니다. 그런데 이러한 기능들을 활용하여 지도를 표출하는 작업의 방식을 보면 다음과 같이 두가지 종류 방법들로 나눌 수 있는데, 각 방법마다 주로 사용되는 기능들의 목록이 서로 다릅니다.

 

< 방법 1 >

MAP_SET 프로시저

MAP_CONTINENTS 프로시저

MAP_GRID 프로시저

 

< 방법 2 >

MAP_PROJ_INIT 함수

PLOT 프로시저

MAP_CONTINENTS 프로시저

MAP_GRID 프로시저

 

통상적으로는 방법 1이 주로 사용되긴 합니다만 경우에 따라서는 방법 2를 사용해야 할 수도 있습니다. 두 방법 사이의 차이는 구현될 지도의 기본적인 좌표 체계의 차이라고 보면 됩니다. 즉 방법 1의 경우는 경도/위도 좌표 체계이고 방법 2의 경우는 거리 좌표 체계라고 보면 됩니다. 사실 그냥 지도만 달랑 표출할 경우에는 방법 1과 2 중 어느 쪽으로 가도 상관은 없습니다. 하지만 지도 위에 2차원 데이터를 중첩해야 할 경우에는 그 데이터의 격자 체계에 따라서 반드시 한 쪽을 선택해야 할 수도 있습니다. 향후에 제가 소개할 내용은 일단 방법 1 위주로 시작하겠지만 방법 2도 언젠가는 언급이 될 예정입니다. 그러면 먼저 지도부터 표출해봅시다. 방법 1에 의하여 LCC 투영법의 지도를 표출하는 과정은 대략 다음과 같습니다.

 

DEVICE, DECOMPOSED=0
WINDOW, XSIZE=600, YSIZE=600
!P.BACKGROUND = 255
limit = [25, 115, 45, 135]
MAP_SET, 35, 125, /CONIC, LIMIT=limit, STANDARD_PARALLELS=[30, 60], $
  XMARGIN=[4, 4], YMARGIN=[2, 2]
MAP_CONTINENTS, /HIRES, /COASTS, COLOR=0
MAP_GRID, BOX_AXES=0.1, COLOR=0, LONDEL=5, LATDEL=5

 

여기서 가장 먼저 사용된 MAP_SET 프로시저는 DG 체계에서 지도를 표출할 때 기본적인 체계를 구축하는 역할을 하는데 주로 지도의 투영법 및 경위도 범위 등을 설정하는 역할을 합니다. 물론 MAP_SET 명령만으로는 지도의 표출이 완결되지는 않으며 MAP_CONTINENTS, MAP_GRID 등의 프로시저들을 추가적으로 사용하는 것이 반드시 필요합니다. 어쨌든 여기서는 LCC 투영법의 지도를 표출하였는데 경도 방향으로는 +115~+135이고 위도 방향으로는 +25~+45의 범위가 되도록 설정하였습니다. 이어서 MAP_CONTINENTS 프로시저를 사용하여 대륙경계선이 표시되도록 하고, MAP_GRID 프로시저를 사용하여 경위도 격자선 및 박스형 윤곽도 표시되도록 하였습니다. 표출 결과는 다음과 같습니다.

 

 

아무래도 LCC 투영법이라는 특성상 경위도 격자선이 전반적으로 부채꼴과 같은 형태를 띄게 됩니다. 이제 가상의 2차원 데이터를 생성하고 이 데이터를 지도 위에 중첩 표출하는 과정으로 가보겠습니다. 먼저 가상의 2차원 데이터는 다음과 같이 생성합니다.

 

tmp = RANDOMU(1, 100, 100)
FOR j = 0, 4 DO tmp = SMOOTH(tmp, 9, /EDGE_TRUNCATE)
data = CONGRID(tmp, 500, 500, /INTERP)*100
HELP, data
PRINT, MIN(data), MAX(data)

 

이 데이터는 500x500의 구조를 가지며 값의 범위는 대략 43~55 정도입니다. 그 모습은 34번 컬러테이블로 보면 다음과 같습니다.

 

 

그러면 이 데이터가 경도 방향으로 +115~+135 그리고 위도 방향으로 +25~+45의 범위에 걸쳐 분포한다고 가정하고, 지도상에 중첩 표출해보도록 하겠습니다. 가장 먼저 MAP_SET 프로시저를 사용하여 기본적인 지도 셋업을 해주는 것까지는 앞선 예제와 동일합니다.

 

DEVICE, DECOMPOSED=0
WINDOW, XSIZE=600, YSIZE=600
!P.BACKGROUND = 255
limit = [25, 115, 45, 135]
MAP_SET, 35, 125, /CONIC, LIMIT=limit, STANDARD_PARALLELS=[30, 60], $
  XMARGIN=[4, 4], YMARGIN=[2, 2]

 

그런데 이번에는 MAP_CONTINENTS나 MAP_GRID가 바로 사용하지 않고, 다음과 같이 MAP_IMAGE 함수를 먼저 사용해야 합니다.

 

result = MAP_IMAGE(data, stx, sty, COMPRESS=1, /BILINEAR, $
  LATMIN=25, LONMIN=115, LATMAX=45, LONMAX=135, MISSING=-9999)
HELP, result
PRINT, MIN(result), MAX(result)

 

여기서 사용된 MAP_IMAGE 함수는 중첩할 데이터의 이미지를 지도의 투영법에 맞춰서 변형(Warp)하는 역할을 합니다. 즉 원래의 이미지는 그냥 사각형의 모습이겠지만 지도상에서는 일정한 경위도 범위에 맞춰져야 하는데, 제대로 맞춰지려면 이미지의 형태 자체가 마치 뒤틀린 것처럼 변형되어야 하기 때문입니다. 그리고 지도가 표출된 그림의 크기와 딱 맞아떨어지는 형태가 되는 것도 중요합니다. 그렇다보니 이 결과로 얻어진 result라는 배열은 원본 데이터와는 다른 526x538의 배열 구조를 갖게 됩니다. 또한 여기서 MISSING 키워드를 주목해야 하는데요. 이것은 이미지를 이와 같이 비틀어서 변형하게 되면 데이터값이 존재하지 않는 짜투리 공간이 발생하게 되는데, 이 부분에 대하여 어떤 값을 부여할 것인지를 결정하는 역할을 합니다. 여기서는 일단 임의로 -9999라는 값이 부여되도록 하였는데, 이러한 처리로 인하여 나중에 뭔가 후폭풍이 있을 예정입니다. 어떤 후폭풍인지는 잠시후 표출 그림에서 확인해봅시다. 일단 이미지를 중첩하여 표출하는 과정은 다음과 같습니다.

 

LOADCT, 34
TVSCL, result, stx, sty
LOADCT, 0

 

여기서는 34번 컬러테이블을 불러와서 활용하였습니다. 그리고 TVSCL 명령을 사용하여 이미지를 표출하는데 이 때 stx, sty라는 변수들이 함께 사용되고 있는 것을 주목해야 합니다. 이것은 앞서 MAP_IMAGE 함수에 의하여 변형 생성된 이미지의 좌측 하단 꼭지점의 위치 좌표를 픽셀 단위로 지정한 것입니다. 통상적으로는 이 값들에 대한 설정은 생략하는 경우가 많은데 그 경우에는 디폴트로 (0, 0)으로 가정됩니다. 즉 이미지가 표출될 그래픽창의 맨 좌측 하단부터 이미지가 표출되는 것이 디폴트이며 통상적으로는 그렇게 하는 것이 자연스럽습니다. 하지만 여기서는 변형 이미지가 지도상에 정확히 맞춰서 표출되어야 하는데, 그 위치 좌표를 앞서 MAP_IMAGE 함수의 실행을 통하여 돌려받아서 여기서 활용한 것입니다. 이제 바로 이어서는 대륙경계선 및 경위도 격자선을 표시하기 위한 과정을 진행합니다.

 

MAP_CONTINENTS, /HIRES, /COASTS, COLOR=0
MAP_GRID, BOX_AXES=0.1, COLOR=0, LONDEL=5, LATDEL=5

 

여기서 전반적인 작업의 흐름을 되짚어보면 MAP_SET, MAP_IMAGE, TVSCL, MAP_CONTINENTS, MAP_GRID의 순서로 이어지는 것을 볼 수 있는데요. 특히 TVSCL 명령에 의한 이미지의 표출 이후에 MAP_CONTINENTS, MAP_GRID를 사용한 것을 주목해야 합니다. 굳이 이렇게 하는 이유는 이미지 표출을 먼저 해야 대륙경계선과 격자선이 이미지에 뒤덮이는 상황을 막을 수 있기 때문입니다. 이제 표출 결과를 보면 다음과 같습니다.

 

 

그런데 뭔가 좀 잘못된 것 같죠? 앞서 원본 데이터만 이미지 형태로 봤던 모습과는 상당히 다릅니다. 지도의 투영법에 맞춰서 변형은 제대로 된 것 같지만, 내부적으로 값의 고저 차이가 거의 느껴지지 않을 정도입니다. 또한 이미지 데이터의 경위도 범위 바깥 부분의 색상도 왜 저렇게 처리된 것일까요? 사실은 이 과정에 있어서는 추가적인 손질이 더 필요합니다. 그러면 과연 이러한 이슈를 어떻게 해결해야 할 것인가에 대해서는 다음 회차 게시물에서 알아보도록 하겠습니다.

반응형