IDL/New Graphics

3차원 공간상에서 지도와 타 그래픽 요소의 중첩 표출 [2]

이상우_idl 2023. 3. 13. 13:40
728x90
반응형

지난 회차에 이어서 오늘은 두번째 순서로서 3차원 그래픽 공간에서 지도를 바닥에 깔고 그 위에 이미지(Image) 또는 등위선(Contour)을 중첩 표출하는 예제를 소개해보고자 합니다.

 

먼저 예제 데이터는 한반도 및 주변 영역에 대하여 일정한 경도 및 위도에 걸쳐 분포하는 2차원 격자 데이터를 가정해보았습니다. 이러한 가상 데이터를 정의하고 생성하는 과정은 다음과 같습니다.

 

data = HANNING(400, 400)*100

add = FLTARR(400, 400)

add[200, 200] = HANNING(200, 200)*50

data = data+add

lons = 120+FINDGEN(400)*0.05

lats = 30+FINDGEN(400)*0.05

 

이와 같이 경도 120~140도 및 위도 30~50도의 범위에 분포하는 400x400의 구조를 갖는 2차원 배열 데이터를 가정하였습니다. 그 다음에는 XYZ축으로 구성되는 3차원적인 데이터 공간을 생성해야 합니다. 이 과정은 다음과 같이 처리해보았습니다.

 

xx = INDGEN(10)

yy = INDGEN(10)

zz = INDGEN(10)

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

p = PLOT3D(xx, yy, zz, /NODATA, $

  XRANGE=[120,140], YRANGE=[30,50], ZRANGE=[0,1000], $

  XMINOR=0, YMINOR=0, XTICKLEN=0, YTICKLEN=0, $

  XSHOWTEXT=0, YSHOWTEXT=0, /CURRENT)

 

여기서는 PLOT3D 함수를 사용하여 XYZ 공간을 생성하였는데 이를 위하여 xx, yy, zz라는 배열들을 생성하였습니다. 물론 이 배열들은 PLOT3D 함수에 투입하기 위하여 임시로 생성한 것일 뿐이므로 PLOT3D 함수에서는 /NODATA 키워드를 사용함으로써 이 데이터가 실제로는 표시되지 않도록 하였습니다. Z축의 범위는 임의적으로 0~1000으로 가정하였습니다. 그리고 바닥의 X Y축에는 눈금이나 라벨 문자들이 표시되지 않도록 처리하였는데, 나중에 지도를 이 XY 평면에 표시하게 될 것을 염두에 둔 것입니다. 이제 그 다음에는 지도를 XY 평면상에 표시하는 작업이 이어져야 합니다. 그 과정은 다음과 같이 처리하면 됩니다.

 

mg = MAPGRID(LONGITUDE_MIN=120, LONGITUDE_MAX=140, $

  LATITUDE_MIN=30, LATITUDE_MAX=50, $

  COLOR='black', LABEL_POSITION=0, LINESTYLE=1)

m = MAP('Geographic', LIMIT=[30, 120, 50, 140], /OVERPLOT)

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

 

지난 회차 게시물에서도 이미 언급했듯이 여기서도 MAPGRID 함수를 먼저 사용하고 그 후에 MAP, MAPCONTINENTS 함수들이 등장하는 순서임을 유의해야 합니다. 여기까지의 과정에 의한 표출 결과는 다음 그림과 같습니다.

 

 

이제 이미지를 중첩하는 과정으로 이어지면 됩니다. 그 과정은 다음과 같습니다.

 

im = IMAGE(data, lons, lats, RGB_TABLE=34, MIN_VALUE=0, MAX_VALUE=100, $

  CLIP=0, /OVERPLOT, ZVALUE=500)

 

여기서는 IMAGE 함수를 사용하면서 ZVALUE 키워드를 사용하여 이미지 평면이 위치할 Z좌표값을 적절히 설정한 것만 유념하면 됩니다. 여기까지의 과정에 의하여 지도와 이미지를 3차원 공간 내에서 함께 표시한 표출 결과를 보면 다음 그림과 같습니다.

 

 

이번에는 동일한 2차원 데이터를 등위선(Contour)의 형태로 지도와 함께 3차원 공간 내에서 표출해봅시다. 일단 앞서 제시된 내용에서 XY 평면에 지도를 표시하는 과정까지는 동일합니다. 다만 2차원 데이터의 표출에 있어서 IMAGE 함수 대신 CONTOUR 함수를 사용한다는 것만 다를 뿐입니다. 그 과정은 다음과 같습니다.

 

cn = CONTOUR(data, lons, lats, RGB_TABLE=34, /FILL, $

  MIN_VALUE=0, MAX_VALUE=100, CLIP=0, /OVERPLOT, ZVALUE=500)

cno = CONTOUR(data, lons, lats, COLOR='black', C_THICK=2, $

  MIN_VALUE=0, MAX_VALUE=100, /OVERPLOT, ZVALUE=501)

 

여기서는 색상이 채워진 등위선(Filled Contour)의 형태로 표출하고자 하였으며, 이를 위하여 먼저 색상이 채워진 형태의 등위선(cn)을 먼저 표출하고 바로 이어서 선으로만 구성된 형태의 등위선(cno)을 중첩하는 방식으로 처리하였습니다. 다만 여기서는 ZVALUE 키워드의 값을 cn은 500이고 cno는 501로 설정하였는데, 이렇게 해야 나중에 중첩될 선 형태의 등위선의 가독성이 더 좋아지기 때문입니다. 이 과정에 의한 표출 결과는 다음 그림과 같습니다.

 

 

그리고 만약 필요하다면 2차원 데이터에 대한 이미지 및 등위선을 모두 함께 표출하는 것도 가능합니다. 즉 다음과 같이 IMAGE 함수 및 CONTOUR 함수를 모두 사용하면서 각각의 ZVALUE 키워드의 값을 적절히 조정하여 표시 위치만 서로 다르게 해주면 됩니다.

 

im = IMAGE(data, lons, lats, RGB_TABLE=34, $
  MIN_VALUE=0, MAX_VALUE=100, $
  CLIP=0, /OVERPLOT, ZVALUE=500)
cn = CONTOUR(data, lons, lats, RGB_TABLE=34, $
  MIN_VALUE=0, MAX_VALUE=100, /FILL, $
  CLIP=0, /OVERPLOT, ZVALUE=999)
cno = CONTOUR(data, lons, lats, COLOR='black', C_THICK=2, $
  MIN_VALUE=0, MAX_VALUE=100, /OVERPLOT, ZVALUE=1000)

 

이렇게 해보면 결과는 다음 그림과 같습니다.

 

 

따라서 XYZ축으로 구성된 3차원 공간 내에서 지도를 바닥에 깔고 그 위에 2차원 데이터를 이미지(Image) 또는 등위선(Contour)의 형태로 함께 표출하는 작업은 대략 이러한 방식으로 처리하면 됩니다. 그리고 지난 회차 및 이번 회차에서 소개된 예제들을 보면 지도를 표출하기 위하여 MAP 함수를 사용할 때 항상 'Geographic' 투영법으로 설정하여 XY 방향으로 직교하는 격자선 형태를 갖도록 하였습니다. 그러면 'Geographic' 외에 다른 투영법들(Mercator, LCC 등)로도 가능할 것인가가 궁금할 수도 있을 것 같습니다. 다만 제가 테스트해본 바로는 이러한 작업에 한해서는 다른 투영법을 설정하게 되면 정상적으로 표출되지는 않는 것으로 확인됩니다. 즉 3차원 공간 내에서 바닥에 깔리는 지도를 표출할 경우에는 앞서 소개된 방법에 의하여 'Geographic' 방식으로 설정해야 지도가 정상적으로 표출되고 Z축 높이 설정도 제대로 작동한다는 것을 염두에 두시면 될 것 같습니다.

반응형