IDL/Direct Graphics

LCC 투영법 기반의 지도 외곽 및 격자선 처리 (DG 체계)

이상우_idl 2023. 8. 22. 15:03
728x90
반응형

IDL에서 LCC(Lambert Conformal Conic) 투영법 기반의 지도를 표출하는데 있어서 외곽 부분을 직사각형의 형태로 처리하는 방법에 관한 게시물을 얼마전에 올린 바 있습니다. 여기서는 INSERT_GRID_LABELS_IN_LCC_MAP_NG라는 별도의 프로그램을 추가적으로 사용하여 예를 들면 다음과 같은 표출 결과를 얻을 수 있었습니다.

 

 

그런데 여기서 제시한 방법은 NG(New Graphics) 체계 기반으로 지도를 LCC 투영법으로 표출할 경우에 대한 것이었는데요. 그렇다면 DG(Direct Graphics) 체계에서는 어떨까요? 사실 DG 체계에서 LCC 투영법의 지도를 표출할 경우에도 외곽 부분이 부채꼴과 같은 형태를 띄는 것이 기본이긴 하지만, DG 체계에서도 위의 그림과 같이 박스 형태의 외곽선 처리 및 격자선들에 대한 추가적인 처리도 가능합니다. 그러면 DG 체계에서 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, COLOR=0, LONDEL=5, LATDEL=5

 

아무래도 DG 체계라는 특성상 지도의 표출을 위해서는 MAP_SET, MAP_CONTINENTS, MAP_GRID 등의 프로시저들을 사용하게 됩니다. 일단 위와 같은 과정에 의하여 표출된 결과는 다음과 같습니다.

 

 

이 그림을 보면 부채꼴과 같은 형태로 경위도 격자선이 대륙경계선과 함께 표시되어 있습니다. 다만 이게 다일 뿐이고 지도 바깥쪽에 사각형의 윤곽선같은 것은 없습니다. 아무래도 허전한 느낌이 많이 드는데요. 사실 지도 바깥쪽에 사각형의 윤곽선을 표시할 수 있는 방법은 따로 있습니다. 위의 내용에서 MAP_GRID 명령에 BOX_AXES라는 키워드를 추가적으로 사용하는 방법인데요. 위의 내용에서 MAP_GRID 명령만 다음과 같이 변경해봅시다.

 

MAP_GRID, BOX_AXES=0.1, COLOR=0, LONDEL=5, LATDEL=5

 

이와 같이 BOX_AXES 키워드를 추가하여 다시 실행해보면 결과는 다음 그림과 같습니다.

 

 

여기서 사용된 BOX_AXES 키워드는 말 그대로 지도의 바깥쪽에 박스 형태의 윤곽선을 표시하라는 의미입니다. 그리고 키워드의 값을 여기서는 0.1로 설정했는데 이 값은 윤곽선의 두께입니다. 그런데 이렇게 0.1이라는 작은 값으로 설정한 것은 나름의 이유가 있습니다. 예를 들어 만약 0.1 대신 1이란 값을 사용할 경우에는 어떻게 될까요?

 

MAP_GRID, BOX_AXES=1, COLOR=0, LONDEL=5, LATDEL=5

 

이렇게 할 경우의 결과는 다음 그림과 같습니다.

 

 

이 그림을 보면 바깥쪽 박스형 윤곽선이 좀 두꺼워지는면서 흰색과 검정색이 번갈아 등장하는 방식으로 표시가 됩니다. 사실 이런 방식의 표출이 별로 맘에 안들 수도 있습니다. 그런 경우에는 먼저 했던 것처럼 0.1과 같은 작은 값으로 설정하여 그냥 선만 나타나게 하는 것이 더 나을 수도 있습니다. 일단 여기서는 지금부터는 0.1로 설정하기로 하겠습니다. 어쨌든 이 표출 결과를 보면 LCC 투영법의 지도를 그리고 바깥쪽에 직사각형의 윤곽선을 표시하는 것까지는 그런대로 구현이 된다는 것을 알 수 있습니다.

 

다만 이 그림을 잘 보면 약간 거슬릴만한 부분이 있는데요. 박스 안쪽을 보면 경도/위도 격자선이 없는 빈 여백이 보입니다. 사실 이것은 경도 및 위도 범위가 제한된 LCC 투영법의 지도의 특성이긴 합니다. 즉 경도 및 위도 격자선도 딱 지정된 범위까지만 구현된 것인데요. 원칙적으로만 보면 이것은 큰 문제는 아니긴 하지만, 만약 경도 및 위도 범위가 큰 지도일 경우에는 이러한 여백이 더 커지게 되고 이것이 시각적으로는 좀 거슬릴 수도 있습니다. 제가 예전에 DG 체계에서 LCC 투영법의 지도를 표출하는 예제를 다뤘던 게시물을 올린 적이 있습니다. 그 게시물에서는 한반도 주변의 좀 더 넓은 영역을 커버하는 지도를 표시하였는데 여기서 표출했던 그림들을 보면 여백이 더 크게 나타나는 것을 볼 수 있습니다. 따라서 이러한 빈 여백에도 경도 및 위도 격자선들이 표시되도록 하고 싶을 수도 있을 것 같습니다. 물론 방법은 있습니다. 다만 이 방법을 사용하려면 지도를 표출하는 과정이 약간 달라져야 합니다. 바로 MAP_PROJ_INIT 함수를 사용하는 방식을 사용하는 것이 필요합니다.

 

원래 IDL의 DG 체계에서는 지도를 표출하는데 있어서 대략 두 종류의 방법이 존재합니다. 첫번째 방법은 앞서 예제에서 제시된 것과 같이 MAP_SET 프로시저를 사용하여 지도의 투영법, 경위도 범위 등등에 관한 기본적인 설정을 먼저 한 후에 MAP_CONTINENTS, MAP_GRID 프로시저들이 사용되는 방식입니다. 그런데 두번째 방법MAP_PROJ_INIT 함수를 사용하여 지도의 투영법, 경위도 범위 등등에 관한 기본적인 설정을 먼저 한 후에 PLOT 프로시저를 사용하여 밑그림을 그리고 그 다음에서야 MAP_CONTINENTS, MAP_GRID 프로시저들이 사용되는 방식입니다. 즉 지도의 특성을 정의하고 밑그림을 그리는데 있어서 MAP_SET만 사용하는 경우가 첫번째 방법이고 MAP_PROJ_INIT 및 PLOT을 사용하는 경우가 두번째 방법이라고 보면 됩니다. 그런데 DG 체계에서 LCC 투영법 지도를 표출하면서 박스 형태의 외곽선을 표시하고 그 안에서 경위도 격자선들이 여백없이 채워지도록 하려면 두번째 방법을 사용해야 한다는 것이 핵심입니다. 따라서 이 두번째 방법을 사용하여 우리의 목적을 달성해보도록 합시다. 일단 그 과정은 다음과 같이 시작합니다.

 

DEVICE, DECOMPOSED=0
WINDOW, XSIZE=600, YSIZE=600
!P.BACKGROUND = 255
limit = [25, 115, 45, 135]
m0 = MAP_PROJ_INIT('Lambert Conformal Conic', LIMIT=limit, $
  CENTER_LONGITUDE=125, CENTER_LATITUDE=35, $
  STANDARD_PAR1=30, STANDARD_PAR2=60)
PLOT, m0.uv_box[[0, 2]], m0.uv_box[[1, 3]], $
  XST=1, YST=1, XTICKLEN=1e-6, YTICKLEN=1e-6, $
  XTICKFORMAT='(A1)', YTICKFORMAT='(A1)', $
  XTITLE='LONGITUDE', YTITLE='LATITUDE', $
  XMARGIN=[5, 5], YMARGIN=[3, 3], COLOR=0, /NODATA

 

여기서 지도 표출 과정에 집중해본다면, 가장 먼저 MAP_PROJ_INIT 함수를 사용하여 지도의 투영법, 경위도 범위 등을 설정합니다. 그런데 바로 다음에는 PLOT 프로시저가 사용된 것이 보이는데, 여기서는 지도의 박스형 윤곽선을 표시하는 역할만 합니다. 일단 여기까지만 실행된 결과는 다음 그림과 같습니다.

 

 

물론 우리가 원하는 온전한 지도의 모습을 갖추기 위해서는 당연히 추가적인 작업이 더 필요합니다. 여기서 다음과 같은 과정을 추가해봅시다.

 

MAP_CONTINENTS, MAP_STRUCTURE=m0, COLOR=0, /HIRES, /COASTS
MAP_GRID, COLOR=0, LONDEL=5, LATDEL=5, MAP_STRUCTURE=m0

 

여기서 추가된 내용은 대륙 경계선 및 격자선을 표시하는 과정입니다. 여기서 주목해야 할 것은 MAP_CONTINENTS 및 MAP_GRID 명령 모두 MAP_STRUCTURE 키워드를 사용하고 있고 여기에 m0가 투입된 것입니다. 이 m0는 앞서 MAP_PROJ_INIT 함수를 실행하여 얻어진 것으로 지도의 각종 설정 정보를 담은 일종의 구조체(Structure)입니다. 만약 HELP 명령을 사용하여 m0에 관한 정보를 출력하도록 해보면 다음과 같은 내용이 표시될 것입니다.

 

** Structure !MAP, 23 tags, length=1160, data length=1160:
   PROJECTION      LONG                20
   SIMPLE          LONG                 4
   FILL_METHOD     LONG                 0
   UP_FLAGS        LONG                 0
   UP_NAME         STRING    'Lambert Conformal Conic'
   P0LON           DOUBLE           125.00000
   P0LAT           DOUBLE           35.000000
   U0              DOUBLE           2.1816616
   V0              DOUBLE          0.61086524
   SINO            DOUBLE          0.57357644
   COSO            DOUBLE          0.81915204
   ROTATION        DOUBLE           0.0000000
   SINR            DOUBLE           0.0000000
   COSR            DOUBLE           1.0000000
   A               DOUBLE           6378206.4
   E2              DOUBLE        0.0067686580
   UV              DOUBLE    Array[2]
   POLE            DOUBLE    Array[7]
   UV_BOX          DOUBLE    Array[4]
   LL_BOX          DOUBLE    Array[4]
   SEGMENT_LENGTH  DOUBLE           0.0000000
   P               DOUBLE    Array[16]
   PIPELINE        DOUBLE    Array[8, 12]

 

어쨌든 이러한 m0라는 구조체를 MAP_STRUCTURE 키워드에 부여하면 m0 안에 수록된 정보들을 바탕으로 대륙경계선 및 격자선이 표시됩니다. 추가된 내용까지 실행하여 얻은 표출 결과는 다음과 같습니다.

 

 

그런데 이 모습은 아직 우리가 원하던 결과는 아닙니다. 격자선이 없는 여백이 보이는 등 우리가 앞서 MAP_SET을 사용하는 방법으로 얻었던 결과와 별로 다르지 않습니다. 일단 MAP_PROJ_INIT 및 PLOT을 사용하는 두번째 방법에 의한 지도 표출의 기본적인 과정은 대략 이와 같습니다. 다만 우리가 원하는 바에 도달하기 위해서는 여기서 약간의 요령이 필요합니다. 이러한 요령을 반영하여 전체 과정을 다시 재구성해보면 다음과 같습니다.

 

DEVICE, DECOMPOSED=0
WINDOW, XSIZE=600, YSIZE=600
!P.BACKGROUND = 255
limit = [25, 115, 45, 135]
m0 = MAP_PROJ_INIT('Lambert Conformal Conic', LIMIT=limit, $
  CENTER_LONGITUDE=125, CENTER_LATITUDE=35, $
  STANDARD_PAR1=30, STANDARD_PAR2=60)
PLOT, m0.uv_box[[0, 2]], m0.uv_box[[1, 3]], $
  XST=1, YST=1, XTICKLEN=1e-6, YTICKLEN=1e-6, $
  XTICKFORMAT='(A1)', YTICKFORMAT='(A1)', $
  XTITLE='LONGITUDE', YTITLE='LATITUDE', $
  XMARGIN=[5, 5], YMARGIN=[3, 3], COLOR=0, /NODATA
m1 = MAP_PROJ_INIT('Lambert Conformal Conic', $
  LIMIT=[25-10, 115-20, 45+10, 135+20], $
  CENTER_LONGITUDE=125, CENTER_LATITUDE=35, $
  STANDARD_PAR1=30, STANDARD_PAR2=60)
MAP_CONTINENTS, MAP_STRUCTURE=m1, COLOR=0, /HIRES, /COASTS
MAP_GRID, COLOR=0, LONDEL=5, LATDEL=5, MAP_STRUCTURE=m1
MAP_GRID, COLOR=0, LONS=[115:135:5], LATS=[25:40:5], $

  BOX_AXES=0.1, /NO_GRID, MAP_STRUCTURE=m1

 

이 과정을 보면 약간 더 복잡해진 것이 눈에 띕니다. 특히 MAP_PROJ_INIT 함수를 한번 더 사용하여 m1이라는 새로운 지도 정보 구조체를 생성한 것에 주목해야 하는데요. 이 부분을 잘 보면 LIMIT 키워드에 부여된 경위도 범위가 원래보다 더 넓게 설정된 것이 보입니다. 이것은 여백을 채울 경위도 격자선들을 위한 설정이라고 보면 됩니다. 그래서 바로 뒤의 내용을 보면 MAP_CONTINENTS, MAP_GRID 프로시저에서 MAP_STRUCTURE 키워드에 m0 대신 m1이 부여된 것이 중요합니다. 그리고 MAP_GRID 프로시저가 여기서는 두번 연달아 사용되고 있는데, 이것은 경도 및 위도 숫자들이 표시되는 범위를 조절하기 위한 요령이라고 해두면 될 것 같습니다. 이 과정에 의한 표출 결과는 다음 그림과 같습니다.

 

 

아마 이 정도면 우리가 원했던 결과를 얻은 것 같습니다. 만약에 경도 및 위도 격자선을 더 촘촘하게 하고 싶다면 설정을 좀 다르게 해야 합니다. 이를 위해서는 MAP_GRID 프로시저가 두번 연달아 사용된 마지막 부분만 다음과 같이 변경해보는 것이 어떨까 합니다.

 

MAP_GRID, COLOR=0, LONS=[111:139:2], LATS=[25:47:2], MAP_STRUCTURE=m1
MAP_GRID, COLOR=0, LONS=[113:137:2], LATS=[25:43:2], BOX_AXES=0.1, $

  /NO_GRID, MAP_STRUCTURE=m1

 

여기서는 경도 및 위도 격자선들 및 라벨 문자들이 표시되어야 할 범위가 서로 다르고 그 설정도 좀 더 일관성있고 정확히 해주는 것이 필요하기 때문에, 두 개의 MAP_GRID 프로시저 모두 LONS, LATS 키워드를 사용하였습니다. 그 결과는 다음 그림과 같습니다.

 

 

즉 경도 및 위도 격자선이 표시되어야 할 범위와 경도 및 위도 숫자 라벨이 표시되어야 할 범위가 서로 다르기 때문에 각각의 설정을 따로 해준 것이고 그런 특성이 반영된 결과라고 보면 됩니다. 따라서 여러가지 경우들에 대하여 유저가 원하는 결과를 얻기 위해서는 아무래도 세심한 설정이 필요할 것입니다. 어쨌든 이러한 방법을 사용하여 DG 체계에서 LCC 투영법의 지도를 표출하는데 있어서 사각형의 외곽선을 표시하고 그 안의 경위도 격자선 및 라벨 문자들을 적절하게 표시하는 것이 충분히 가능하다는 것을 인지해두는 것이 중요하지 않을까 생각됩니다.

반응형