IDL/Mapping

대륙 또는 해양의 마스킹(Masking) [1]

이상우_IDL 2023. 1. 31. 13:26
728x90

IDL에서 지도를 표출하고 그 위에 2차원 데이터를 중첩하여 표출하는 방법 및 예제들은 제가 이 블로그를 통하여 여러 차례 소개해드린 바 있습니다(관련 링크). 그런데 오늘 소개하고자하는 내용은 이와 같이 중첩 표출을 하면서 대륙 또는 해양에 해당되는 부분만 보이도록 하는 방법에 관한 것입니다. 예를 들면 지도상에 2차원 데이터를 등위선(Contour)의 형태로 중첩표출을 하되, 왼쪽은 대륙을 가리고 해양 부분만 보이도록 처리하는 경우 또는 반대로 해양을 가리고 대륙 부분만 보이도록 처리한 경우입니다. 물론 등위선 대신 이미지가 될 수도 있을 것입니다. 어쨌든 실제로 이와 같은 표출을 하고싶은 경우가 분명히 있습니다. 그래서 이번 기회에 그 방법을 소개해보고자 합니다. 소개할 순서는 다음과 같습니다.

 

1) 지도와 2차원 데이터의 중첩 표출을 하면서, 2차원 데이터가 해양 부분에서만 보이고 대륙 부분에서는 안보이도록 하는 방법

2) 지도와 2차원 데이터의 중첩 표출을 하면서, 2차원 데이터가 대륙 부분에서만 보이고 해양 부분에서는 안보이도록 하는 방법

 

다만 미리 말씀을 드리자면 1)은 꽤 쉽지만 2)는 좀 복잡합니다. 왜 그런지에 관해서는 나중에 설명을 하겠습니다. 어쨌든 위와 같은 순서로 2회에 걸쳐서 소개해보도록 하겠습니다. 그러면 오늘은 첫 순서로 1)의 방법을 예제와 함께 살펴봅시다. 일단 기본이 되는 지도와 2차원 데이터의 준비 및 표출 과정은 다음과 같습니다.

 

lon = [115:145:0.1]
lat = [30:50:0.1]
data = HANNING(301, 201)*100
ct = COLORTABLE(74, /REVERSE)
minv = 0
maxv = 100
win = WINDOW(DIMENSIONS=[800, 600], /NO_TOOLBAR)
m = MAP('geographic', LIMIT=[30, 115, 50, 145], MARGIN=0.1, FONT_SIZE=11, /CURRENT)
cn = CONTOUR(data, lon, lat, /FILL, GRID_UNITS=2, RGB_TABLE=ct, $
  MIN_VALUE= minv, MAX_VALUE=maxv, N_LEVELS=10, /OVERPLOT)
cno = CONTOUR(data, lon, lat, GRID_UNITS=2, N_LEVELS=10, COLOR='black', $
  C_LABEL_SHOW=0, C_THICK=2, /OVERPLOT)
m.MapGrid.LABEL_POSITION = 0
mc = MAPCONTINENTS(/HIRES)

 

이와 같이 바탕 지도를 표출한 후 가상의 2차원 데이터를 등위선(Contour)의 형태로 중첩하여 표출하는 예제입니다. 다만 여기서는 CONTOUR 함수를 두번에 걸쳐 사용하였는데, 첫번째 등위선인 cn은 색상만 채워진 형태이고 두번째 등위선인 cno는 라인만 표시되는 형태입니다. 표출 결과 그림은 다음과 같습니다.

 

 

그러면 이와 같은 표출을 하면서 2차원 데이터가 대륙에서만 안보이고 해양에서만 보이도록 처리하는 방법을 봅시다. 매우 간단합니다. 위의 예제 코드에서 MAPCONTINENTS 함수가 사용된 부분만 다음과 같이 변경하면 됩니다.

 

mc = MAPCONTINENTS(/HIRES, FILL_COLOR='white')

 

즉 이와 같이 MAPCONTINENTS 함수로 대륙경계선을 표시하면서 FILL_COLOR 속성을 사용하여 대륙 부분이 흰색으로 채워지도록 처리하는 것입니다. 결과는 다음 그림과 같습니다.

 

 

이 그림을 보면 대륙 부분만 가리는 처리가 잘 되었음을 확인할 수 있습니다. 어쨌든 기본적인 핵심은 MAPCONTINENTS 함수를 사용하여 대륙경계선을 표시할 때 FILL_COLOR 속성을 사용하여 대륙 부분이 색상으로 채워지도록 하는 것입니다. 그리고 이 방법 자체는 별로 복잡할 것이 없고 꽤 간단하기도 합니다.

 

그러면 다음 회차에서는 2)의 방법을 소개해보기로 하겠습니다.

LIST