오늘은 IDL에서 지도를 그리는데 있어서 Satellite이라는 투영법을 사용하는 방법을 소개하고자 합니다. 이 투영법은 기존의 다른 투영법들과는 약간 성격이 다른 독특한 방법이라고 볼 수 있는데, 너무 거창하게 생각할 것 없이 마치 내가 인공위성에 탑승하여 지구를 바라보는 듯한 관점이라고 봐도 무방합니다. 물론 그 인공위성이 지구상에서 어느 위치의 상공에 있는가, 어떤 각도 및 방향으로 바라보는가 등에 대한 세부 설정이 필요합니다. IDL에서 이 투영법을 사용하여 지도를 그리기 위해서는 MAP_SET이라는 프로시저를 사용해야 합니다. 그런데 이 MAP_SET 프로시저는 DG(Direct Graphics) 체계에서 지도를 그리는 기능을 담당하며 꽤 오래전부터 지원되어 왔던 기능입니다. 제가 확인해 본 바로는 NG(New Graphics) 체계의 MAP 함수에서는 이 Satellite 투영법이 아직은 지원되지 않습니다. 따라서 오늘은 모처럼 DG 체계에서 작업을 해보게 되었습니다.
바로 예제 코드로 들어가 보겠습니다. 여기서는 북위 40도, 동경 130 지점의 상공에 인공위성이 떠있다고 가정해 보았습니다. 이 상공에서 지구를 바로 수직으로 내려다보는 상황을 생각하면 됩니다.
WINDOW, XSIZE=400, YSIZE=400, RETAIN=2
DEVICE, DECOMPOSED=0
!P.BACKGROUND=255
MAP_SET, 40, 130, COLOR=0, /SATELLITE, SAT_P=[2.2, 0, 0], /HORIZON
MAP_CONTINENTS, /COASTS, /HIRES, COLOR=0
MAP_GRID, LATDEL=10, LONDEL=10, COLOR=0, /LABEL
이 예제 코드에서는 특히 MAP_SET 프로시저의 사용법에 주목하시기 바랍니다. 여기서는 우선 /SATELLITE 키워드가 사용되어야 합니다. 그리고 또 필요한 것이 SAT_P 키워드인데, 이 키워드에는 세 개의 값들로 구성된 배열이 지정되어야 합니다. IDL 도움말에서 관련 내용을 찾아보면 다음과 같이 설명이 되어 있습니다.
- P is the distance of the point of perspective (camera) from the center of the globe, expressed in units of the radius of the globe.
- Omega is the downward tilt of the camera, in degrees from the new horizontal. If both Gamma and Omega are 0, a Vertical Perspective projection results.
- Gamma is the angle, expressed in degrees clockwise from north, of the rotation of the projection plane. This parameter is equivalent to the Rot argument to the MAP_SET procedure.
첫번째 값은 위성의 높이에 해당되는데, 정확히는 지구 중심으로부터의 거리를 지구 반경의 단위로 나타낸 값입니다. 위 예제 코드에서는 2.2라는 값을 사용하였는데, 이것은 위성이 지구 중심으로부터 지구 반경의 2.2배에 해당되는 거리만큼 떨어져 있는 상태에 해당됩니다. 다시 말하면 위성이 지표면으로부터는 1.2 지구반경 만큼의 고도 상공에 떠있는 상태라고 보면 되겠습니다. 그리고 후속으로 사용된 MAP_CONTINENTS, MAP_GRID 등은 각각 대륙경계선, 경위도 격자선을 그리는 역할을 합니다. 이렇게 얻은 그림은 다음과 같습니다.
만약 2.2라는 값을 좀 낮추면 지표면에 좀 더 다가간 상황이 됩니다. 이 값을 1.5로 변경했을 경우에는 다음과 같은 그림을 얻게 됩니다. 그 차이는 눈으로도 확실히 구분이 가능합니다.
SAP_P 키워드에 주어지는 두번째 값은 위성에서 지표면을 바라보는 경사 각도에 해당되는데, 수직으로 내려다보는 경우가 0도이고 거기서 시선을 올리면 (+)로 그리고 내리면 (-)로 변합니다. 위의 예제 코드에서 SAT_P 키워드의 값만 다음과 같이 변경해보면 그 결과는 다음 그림과 같습니다.
MAP_SET, 40, 130, COLOR=0, /SATELLITE, SAT_P=[0, 20, 0], /HORIZON
여기서는 20이라는 값을 사용하였는데요. 이 20이라는 값을 -20으로 바꿀 경우에는 다음 그림과 같이 바뀝니다. 두 그림의 차이를 보면, 이 두번째 값의 의미를 이해하는데 별 어려움은 없을 것입니다.
SAT_P 키워드에 주어지는 세번째 값은 시선 방향을 회전시키는 각도에 해당되는데, (+)이면 시계 방향이고 (-)이면 반시계 방향입니다. 역시 위 예제 코드에서 SAT_P 키워드의 값만 다음과 같이 변경해보면 그 결과는 다음 그림과 같습니다.
MAP_SET, 40, 130, COLOR=0, /SATELLITE, SAT_P=[0, 0, 30], /HORIZON
그리고 비교를 위하여 30을 -30으로 바꾸면 그 결과는 다음 그림과 같습니다.
따라서 SAT_P 키워드의 값을 다양하게 변경해보면 여러가지 다양한 상황들을 가정하여 지도를 그려볼 수 있습니다. 다만 이와 같이 가정된 위성의 높이나 시선 방향 등에 따라서는 지도 표출이 제대로 되지 않는 경우도 나올 수 있습니다. 예를 들어 SAT_P 키워드의 값을 다음과 같이 줄 수도 있는데요.
WINDOW, XSIZE=400, YSIZE=400, RETAIN=2
DEVICE, DECOMPOSED=0
!P.BACKGROUND=255
MAP_SET, 40, 130, COLOR=0, /SATELLITE, SAT_P=[1.5, 50, -30], /HORIZON
MAP_CONTINENTS, /COASTS, /HIRES, COLOR=0
MAP_GRID, LATDEL=5, LONDEL=5, COLOR=0, /LABEL
이렇게 하면 다음과 같이 이상한 그림이 그려지기도 합니다.
사실 이와 같은 경우에는 MAP_SET 프로시저에서 LIMIT 키워드를 추가로 사용함으로써, 지도가 커버해야 할 경위도 범위를 좀 더 세부적으로 조정하는 작업이 필요할 수도 있습니다.
WINDOW, XSIZE=400, YSIZE=400, RETAIN=2
DEVICE, DECOMPOSED=0
!P.BACKGROUND=255
limit = [40, 110, 50, 130, 40, 150, 30, 120]
MAP_SET, 40, 130, COLOR=0, /SATELLITE, SAT_P=[1.5, 50, -30], /HORIZON, $
LIMIT=limit
MAP_CONTINENTS, /COASTS, /HIRES, COLOR=0
MAP_GRID, LATDEL=5, LONDEL=5, COLOR=0, /LABEL
여기서 LIMIT 키워드에는 총 8개의 값들로 구성된 배열이 부여되어 있습니다. 원래 LIMIT 키워드는 지도를 그릴 때 경도 및 위도의 범위를 제한하는 역할을 하며, 기본적으로는 4개의 값들(위도 하한, 경도 하한, 위도 상한, 경도 상한)만 줄 수도 있습니다. 하지만 도움말에서 이 키워드에 관한 설명을 보면 다음과 같이 되어 있는데요.
As a four-element vector, LIMIT has the form [Latmin, Lonmin, Latmax, Lonmax] that specifies the boundaries of the region to be mapped. (Latmin, Lonmin) and (Latmax, Lonmax) are the latitudes and longitudes of two points diagonal from each other on the region’s boundary.
For more complex regions or projections, the eight-element vector, LIMIT has the form: [Lat0, Lon0, Lat1, Lon1, Lat2, Lon2, Lat3, Lon3]. These four latitude/longitude pairs describe, respectively, four points on the left, top, right, and bottom edges of the map extent.
이와 같이 어떤 경우에는 8개의 값들로 구성된 배열이 필요할 수도 있습니다. 지금이 이러한 경우에 해당됩니다. 이와 같은 내용의 예제 코드를 실행하면 다음과 같은 그림을 얻게 됩니다. 이 정도면 나름 괜찮은 결과를 얻었다고 볼 수 있습니다.
그런데 만약 우리가 위에서 계속 했던 대로, 다음과 같이 단순히 4개의 값들로만으로 LIMIT 키워드를 설정하게 되면 그 결과는 다음 그림과 같습니다.
limit = [30, 120, 50, 140]
WINDOW, XSIZE=400, YSIZE=400, RETAIN=2
DEVICE, DECOMPOSED=0
!P.BACKGROUND=255
MAP_SET, 40, 130, COLOR=0, /SATELLITE, SAT_P=[1.5, 50, -30], /HORIZON, $
LIMIT=limit
MAP_CONTINENTS, /COASTS, /HIRES, COLOR=0
MAP_GRID, LATDEL=5, LONDEL=5, COLOR=0, /LABEL
특히 경위도 격자선이 그려지는 범위가 우리의 희망과는 달리 지나치게 제한되는 경우가 생길 수 있습니다. 따라서 지도를 그리는데 있어서 투영법의 종류에 따라서는 LIMIT 키워드를 사용한 경위도 범위 설정을 4개 또는 8개 중 어떤 방식으로 할 것이냐를 세부적으로 따져봐야 할 수도 있습니다. 사실 이런 요소들 때문에 아무래도 지도를 그리는 작업이 항상 만만치않게 느껴지는 것은 사실입니다.
그리고 한가지만 더 언급을 한다면, MAP_SET 프로시저에서 계속 사용되고 있는 /HORIZON이라는 키워드가 있는데요. 이 키워드를 사용하지 않고도 그림을 그려보시기 바랍니다. 그러면 이 키워드의 역할이 무엇인지 확인이 가능할 것입니다. 이 테스트는 맨 처음에 시도했던 것과 같이 거리가 충분히 떨어져 있어서 지구 구체의 윤곽이 다 나오는 경우에 대하여 시도해보는 것을 권장합니다.
그러면 Satellite 투영법에 관한 설명은 이 정도로 마치겠습니다.
'IDL > Mapping' 카테고리의 다른 글
ESRI Shapefile의 활용 및 해독에 관하여 (Part 2) (2) | 2018.03.27 |
---|---|
ESRI Shapefile의 활용 및 해독에 관하여 (Part 1) (0) | 2018.03.24 |
Lambert Conformal Conic 투영법 지도의 또 다른 표출 방법 (6) | 2016.08.11 |
LL_ARC_DISTANCE 함수의 사용법 (0) | 2015.08.28 |
지도 이미지를 3차원 구체(Sphere) 폴리곤상에 입히기 [2] (0) | 2015.07.02 |