IDL/Mapping

Map 표출시 외곽 테두리선의 처리 방법 (HORIZON_LINESTYLE 속성)

이상우_IDL 2018. 6. 25. 15:08
728x90

오늘은 IDL에서 지도를 표출하는 작업을 하는데 있어서, 지도의 외곽선에 대한 처리 방법에 관하여 언급해 볼까 합니다. 특히 경위도 격자선을 실선이 아닌 형태(dotted line, dashed line 등)로 표시해야 할 경우 이 문제가 약간 난감한 경우가 실제로 있습니다. 예제를 통하여 살펴보기 위하여 다음과 같이 NG 체계의 MAP 함수를 사용하여 지도를 표출하는 일반적인 경우를 먼저 봅시다.


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

m = MAP('Geographic', LIMIT=[20, 110, 60, 150], $

  FILL_COLOR='light blue', ASPECT_RATIO=0, $

  MARGIN=[0.08, 0.10, 0.05, 0.05], CLIP=0, /CURRENT)

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

m.MapGrid.LABEL_POSITION = 0

m.MapGrid.GRID_LONGITUDE = 5

m.MapGrid.GRID_LATITUDE = 5

m.MapGrid.FONT_SIZE = 11

m.Linestyle = 1


여기서는 한반도 주변 영역을 표시하기 위하여 경도 범위는 110E~150E로 하고 위도 범위는 20N~60N으로 하였습니다. 그리고 경위도 격자선 간격은 모두 5도가 되도록 하였고, 격자선은 점선(dotted line)으로 표시되도록 하였습니다. 일단 이 과정을 통하여 표출된 그림은 다음과 같습니다.



그런데 이 그림을 보면 지도의 외곽선 역시 내부 격자선과 마찬가지로 점선의 형태로 되어 있습니다. 그러면 외곽선만 다른 형태로 표시할 수는 없을까요? 물론 가능합니다. 일단 MAP 함수에서 지원되는 BOX_AXES라는 키워드를 사용하는 방법이 있습니다.예전에 많이 사용되던 DG 체계의 MAP_GRID 프로시저에서도 동명의 키워드가 지원되었는데 그 역할은 여기서도 동일합니다. 위의 예제 코드에서는 다음과 같은 내용을 추가하면 됩니다.


m.BOX_AXES = 1


이렇게 하면 다음과 같은 그림을 얻을 수 있습니다.



이 정도면 나름 나쁘지는 않습니다. 하지만 이런 방식 말고 외곽선을 아예 실선의 형태로 더 깔끔하게 다듬을 수는 없을까요? 당연히 방법이 있습니다. 다음과 같이 HORIZON_LINESTYLE이라는 키워드를 사용하면 됩니다. 다만 이 때, 바로 앞서 BOX_AXES 속성을 설정했던 내용은 지우거나 주석 처리를 하여 실행되지 않도록 해야 합니다.


;m.BOX_AXES = 1

m.HORIZON_LINESTYLE = 0


이렇게 하면 다음과 같이 외곽선만 실선으로 처리된 그림을 얻을 수 있습니다.



이와 같이 "HORIZON_"이란 문구로 시작하는 키워드들이 몇 개 있습니다. 이번에는 다음과 같이 HORIZON_THICK 속성을 추가적으로 사용하여 외곽선만 좀 더 두껍게 처리하는 것도 가능합니다.


m.HORIZON_THICK = 2



또는 다음과 같이 HORIZON_COLOR 속성을 사용하여 외곽선만 별도의 색상으로 처리하는 것도 가능합니다.


m.HORIZON_COLOR = 'crimson'



어쨌든 이와 같은 방식으로 지도 외곽선의 형태를 자유롭게 제어할 수 있습니다. 지도의 투영법이 달라도 적용 방식은 같습니다. 예를 들어 다음과 같이 LCC(Lambert Conformal Conic) 투영법을 사용하여 지도를 표출할 경우에도 동일한 방식의 표출이 가능합니다.


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

m = MAP('Lambert Conformal Conic', LIMIT=[20, 110, 60, 150], $

  STANDARD_PAR1=30, STANDARD_PAR2=60, $

  FILL_COLOR='light blue', ASPECT_RATIO=0, $

  HORIZON_LINESTYLE=0, HORIZON_THICK=2, $

  MARGIN=[0.10, 0.12, 0.05, 0.05], CLIP=0, /CURRENT)

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

m.MapGrid.LABEL_POSITION = 0

m.MapGrid.GRID_LONGITUDE = 5

m.MapGrid.GRID_LATITUDE = 5

m.MapGrid.FONT_SIZE = 11

m.LINESTYLE = 1


참고로 여기서는 HORIZON_LINESTLYE 및 HORIZON_THICK 속성을 처음부터 MAP 함수 안에 명시하였습니다. NG 체계의 그래픽 함수에서는 속성들에 대한 설정을 지금과 같이 함수 사용시에 하던가 아니면 앞선 예제에서와 같이 함수 사용 이후 별도로 설정하는 것이 모두 가능합니다. 어쨌든 이 결과는 다음 그림과 같습니다.



앞서 언급했듯이 이러한 방법은 지도 투영법에 관계없이 적용 가능합니다. 다음과 같이 Polar Stereographic 투영법을 사용하여 극지방 영역의 지도를 표출할 경우에도 마찬가지입니다.


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

m = MAP('Polar Stereographic', $

  FILL_COLOR='Light Blue', $

  CENTER_LATITUDE=90, $

  LIMIT=[60, -180, 90, 180], $

  HORIZON_LINESTYLE=0, HORIZON_THICK=2, $

  ASPECT_RATIO=0, MARGIN=0.1, $

  FONT_SIZE=11, CLIP=0, /CURRENT)

mc = MAPCONTINENTS(FILL_COLOR='Gold')

m.MapGrid.LINESTYLE = 1

m['Longitudes'].LABEL_POSITION = 0



그리고 다음과 같이 Interrupted Goode 투영법을 사용할 경우도 마찬가지입니다.


win = WINDOW(DIMENSIONS=[1000, 500], /NO_TOOLBAR)

m = MAP('Interrupted Goode', FILL_COLOR='light blue', $

  HORIZON_COLOR='black', HORIZON_THICK=2, $

  ASPECT_RATIO=0, MARGIN=0.02, /CURRENT)

mc = MAPCONTINENTS(FILL_COLOR='gold')

m.MapGrid.GRID_LONGITUDE = 15

m.MapGrid.GRID_LATITUDE = 15

m.MapGrid.FONT_SIZE = 10

m.LINESTYLE = 1



따라서 NG 체계에서 지도를 표출할 때 외곽선에 대한 처리를 해야 할 경우 "HORIZON_"으로 시작하는 속성들을 사용하면 이와 같이 간단하게 제어가 가능하다는 점을 참고하시면 좋을 것 같습니다.

LIST