우리가 각도(Angle)의 값을 나타낼 때 십진수 단위(Decimal)로 나타내는 방식과 도/분/초 단위(DMS)로 나타내는 방식이 공존합니다. 예를 들어서 십진수 단위의 각도 값이 27.5도인 경우 이 각도는 도/분/초 단위로는 27도 30분 00초가 됩니다. 그리고 이러한 단위 사이를 상호변환해야 하는 경우들이 종종 있습니다. IDL에서도 이러한 변환 기능을 담당하는 함수가 지원되는데 바로 EOS_EH_CONVANG 함수입니다. IDL 도움말에서 이 함수에 관한 내용을 찾아보면 기본적인 문법은 다음과 같습니다.
Result = EOS_EH_CONVANG(inAngle, code)
여기서 inAng는 투입되는 각도이고 code는 변환 작업의 종류를 나타내는 코드번호입니다. 총 6종의 변환 기능들이 지원되며 세부적으로는 다음과 같습니다. 즉 각각의 코드 번호에 해당되는 작업 내용입니다.
0 = Radians to Degrees
1 = Degrees to Radians
2 = DMS to Degrees
3 = Degrees to DMS
4 = Radians to DMS
5 = DMS to Radians
이들 중에서 코드번호 3번과 2번의 변환에 주목을 해보겠습니다. 먼저 십진수 단위의 값을 도/분/초 단위의 값으로 변환해봅시다. 앞서 언급했던 예제의 변환을 이 함수를 사용하여 수행하고 그 결과를 출력해보면 다음과 같습니다.
IDL> r = EOS_EH_CONVANG(27.5, 3)
IDL> HELP, r
R DOUBLE = 27030000.
IDL> PRINT, r
27030000.
일단 이러한 작업은 십진수 단위를 DMS 단위로 변환하는 작업이기 때문에 코드번호 3에 해당됩니다. 또한 여기서는 결과가 산출되는 형식에 주목해야 하는데요. IDL 도움말에 의하면 십진수 단위의 각도를 DMS 단위로 변환할 경우 그 결과는 DDDMMMSSS.SS의 형태를 갖는 2배 정밀도 실수형 값으로 전달됩니다. 즉 변환된 도/분/초 값들을 그대로 이어붙여서 조합된 실수의 형태로 전달됩니다. 따라서 위의 결과를 해독하면 27도 30분 00초가 됩니다. 십진수 단위의 다른 각도 값으로도 테스트를 해보면 다음과 같습니다.
IDL> r = EOS_EH_CONVANG(74.23, 3)
IDL> HELP, r
R DOUBLE = 74013048.
IDL> PRINT, r
74013048.
이와 같이 74.23도는 74도 13분 48초로 변환됩니다. 또 다른 예제를 보면 다음과 같습니다.
IDL> r = EOS_EH_CONVANG(-51.92, 3)
IDL> HELP, r
R DOUBLE = -51055012.
IDL> PRINT, r
-51055012.
이와 같이 -51.92도는 -51도 55분 12초로 변환됩니다. 다만 이와 같이 변환된 결과값은 그대로 사용하기에는 약간 애매합니다. 경우에 따라서는 도/분/초 각각의 값을 추출하는 것이 더 유용할 수도 있습니다. 이러한 작업을 위해서는 결과값인 r에 대하여 문자형으로의 변환을 해준 다음에 도/분/초에 해당되는 각 위치별로 값을 추출하는 것이 좋을 것 같습니다. 만약 초에 해당되는 값을 소수점 아래가 세째 자리까지인 실수형 값으로 얻고, 도 및 분은 정수형 값으로 얻는다고 하면 대략 다음과 같은 과정으로 처리하면 됩니다.
IDL> str = STRING(r, FORMAT='(D13.3)')
IDL> PRINT, str
-51055011.993
IDL> dd = FIX(STRMID(str, 0, 3))
IDL> mm = FIX(STRMID(str, 3, 3))
IDL> ss = FLOAT(STRMID(str, 6, 7))
IDL> PRINT, dd, mm, ss
-51 55 11.9930
이와 같이 도/분/초에 해당되는 각 숫자들이 dd, mm, ss라는 변수로 전달되었습니다. 맨 처음의 예제도 동일한 방식으로 처리해보면 다음과 같습니다.
IDL> r = EOS_EH_CONVANG(27.5, 3)
IDL> str = STRING(r, FORMAT='(D13.3)')
IDL> dd = FIX(STRMID(str, 0, 3))
IDL> mm = FIX(STRMID(str, 3, 3))
IDL> ss = FLOAT(STRMID(str, 6, 7))
IDL> PRINT, dd, mm, ss
27 30 0.00000
이번에는 반대 방향의 변환 즉 도/분/초 단위의 값을 십진수 단위로 변환을 해봅시다. 예를 들어 55도 41분 26초라는 값을 십진수 단위로 변환한 결과를 얻으려면 다음과 같이 처리해야 합니다.
IDL> r = EOS_EH_CONVANG(55041026.33d, 2)
IDL> PRINT, r
55.690647
일단 이러한 작업은 DMS 단위를 십진수 단위로 변환하는 작업이기 때문에 코드번호 2에 해당됩니다. 그리고 도/분/초 단위의 입력값은 앞서 언급했던 DDDMMMSSS.SS와 같은 형태로 주어져야 합니다. 그리고 반드시 2배 정밀도 실수형의 값으로 주어져야 한다는 것도 함께 유의해야 합니다.
일반적으로 지도(Map)상의 경도 및 위도의 값이 이와 같은 형태로 주어지는 경우가 자주 있습니다. 예를 들어 서울의 경도 및 위도 좌표값이 각각 126도 58분 41초 및 37도 34분 00초로 알려져있는데, 이러한 값들을 십진수 단위로 변환한다면 다음과 같이 처리하면 됩니다.
IDL> lon = EOS_EH_CONVANG(126058041.0d, 2)
IDL> PRINT, lon
126.97806
IDL> lat = EOS_EH_CONVANG(37034000.0d, 2)
IDL> PRINT, lat
37.566667
따라서 EOS_EH_CONVANG 함수를 사용하여 각도를 변환하는 방법은 대략 위와 같습니다. 전반적으로 보면 분명히 기능상의 편리함이 있지만 DMS 형태의 값을 정의하는 방식의 특이함으로 인한 약간의 불편함도 공존한다는 점을 함께 감안하는 것이 좋을 것 같습니다.
이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > Math' 카테고리의 다른 글
불규칙 간격의 1차원 데이터의 내삽 (0) | 2024.08.26 |
---|---|
TS_FCAST 함수 소개 (0) | 2024.08.21 |
플랑크(Planck) 복사량 법칙의 가시화 (1) | 2024.06.20 |
VALUE_LOCATE 함수 소개 (0) | 2024.06.07 |
증가 및 감소 연산자 (Increment and Decrement Operator) (1) | 2023.11.20 |