지난 회차 게시물들(링크1, 링크2)에서는 Yale Bright Star Catalogue(예일 밝은 별 목록, YBSC) 목록자료를 공식 웹페이지에서 제공되는 바이너리 파일로 받아서 파일 내에 수록된 데이터를 IDL에서 배열로 읽어들이는 작업을 진행하였습니다. 그래서 5종의 항목들(일련번호, RA, Dec, Spectral type, V magnitude) 각각에 해당되는 cnums, ra_degs, dec_degs, types, vmags 배열들을 획득하였고 이들을 .sav 파일에 저장해두는 과정까지 완료된 상태입니다. 이제 오늘은 이 데이터를 사용한 표출 작업을 진행해볼텐데, 별들의 좌표 데이터(RA, Dec)를 이용하여 별들을 맵(Map) 상에 표시하는 방식으로 작업을 진행보고자 합니다.
참고로 천체들의 위치는 천구 좌표계(Celestial Coordinate System)에서 RA(Right Ascension) 및 Dec(Declination)으로 구성된 좌표로 표시하는데, 이것은 지구 중심의 좌표계이고 지구상의 경도(Longitude) 및 위도(Latitude)를 하늘로 확장한 개념이라고 보면 됩니다. 따라서 표출의 방식 자체는 일반적인 지도(Map)의 표출 방식과 유사합니다. 따라서 지금부터 진행할 표출 작업은 기본적으로는 IDL의 지도 표시 기능을 사용하면서 세부적으로는 천체 지도의 특성에 맞는 추가적인 손질을 더하는 방식으로 진행할 것입니다. 그러면 지난 회차에서 저장했던 .sav 파일을 불러오는 것부터 시작해봅시다.
RESTORE, 'data/BSC5_idl.sav'
HELP, cnums, ra_degs, dec_degs, vmags, types
그러면 .sav 파일 내에 저장되어 있던 5종의 배열들을 IDL로 바로 가져오게 됩니다. HELP에 의하여 출력된 내용을 보면 확인할 수 있습니다.
CNUMS INT = Array[9110]
RA_DEGS DOUBLE = Array[9110]
DEC_DEGS DOUBLE = Array[9110]
VMAGS FLOAT = Array[9110]
TYPES STRING = Array[9110]
이와 같이 각각 9110개의 값들로 구성된 배열입니다. 따라서 이후의 표출 작업에서는 이 9110개의 별들을 지도상에 표시하게 됩니다. 다만 여기서 데이터를 한번 필터링하는 과정이 필요합니다. 왜냐하면 9110개의 별들 중에서는 비정상적인 값을 갖는 데이터가 일부 섞여있기 때문입니다. 예를 들면 Spectral type 데이터에 해당되는 배열 types의 값은 정상적인 경우에는 'B1', 'M3' 등과 같은 문자값이지만 그냥 ' ' 즉 두 칸의 공백인 비정상적인 경우들도 있습니다. 이러한 비정상적인 경우에 해당되는 별들은 나머지 데이터 값들(RA, Dec 등)도 그냥 0으로 되어 있습니다. 따라서 이와 같은 비정상적인 경우들은 한번 걸러내고 정상적인 경우들만으로 추려내는 작업이 필요합니다. 이러한 선별 과정은 다음과 같이 처리하면 됩니다.
ww = WHERE(types NE ' ', count)
PRINT, count
cnums = cnums[ww]
ra_degs = ra_degs[ww]
dec_degs = dec_degs[ww]
vmags = vmags[ww]
types = types[ww]
HELP, cnums, ra_degs, dec_degs, vmags, types
여기서는 WHERE 함수를 사용하여 배열 types의 값이 ' '이 아닌 정상적인 경우들만 따로 선별하고 그러한 경우들이 총 몇 개인지에 대한 정보를 변수 count로 얻었습니다. 선별의 결과를 확인하기 위하여 PRINT 및 HELP로 출력해본 내용을 보면 다음과 같습니다.
9096
CNUMS INT = Array[9096]
RA_DEGS DOUBLE = Array[9096]
DEC_DEGS DOUBLE = Array[9096]
VMAGS FLOAT = Array[9096]
TYPES STRING = Array[9096]
이 내용을 보면 전체 9110개의 데이터 중 정상적인 경우들을 실제로는 9096개인 것으로 확인됩니다. 즉 14개는 비정상적인 경우에 해당된다는 의미입니다. 따라서 이와 같이 정상적인 값들로만 구성되도록 필터링된 배열 데이터를 사용하여 이후의 과정으로 진행하면 됩니다. 그러면 본격적으로 표출 과정으로 가봅시다. 9096개의 모든 별들이 표시된 지도를 표출하기 위해서는 그래픽창을 띄우고 바탕지도를 표시해야 합니다. 지도를 표시하는 방식은 여러가지가 있겠지만, 여기서는 데이터의 특성을 고려하여 Mollweide 투영법의 지도를 사용해보겠습니다. 이 과정은 다음과 같이 처리합니다.
win = WINDOW(DIMENSIONS=[1000, 500], /NO_TOOLBAR)
m = MAP('Mollweide', MARGIN=0.05, /CURRENT)
m['Latitudes'].LABEL_POSITION = 0
이와 같이 MAP 함수에서 투영법을 'Mollweide'로 지정하면 됩니다. 그리고 지도의 특성상 위도에 해당되는 라벨 문자들이 바깥쪽에 위치하도록 하였습니다. 표출된 그림을 보면 다음과 같습니다.

이러한 지도 위에 별들이 표시되도록 해보고자 하는데, 사실 이 지도는 지리적인 용도로 사용되는 지도이며 천체를 표시하는 용도로는 적합하지 않은 부분이 있습니다. 바로 좌표 값들을 나타내는 라벨 문자들인데요. 지리적인 용도이다보니 경도 및 위도에 해당되는 값들로 표시되어 있습니다. 즉 경도의 경우 동경(E) 및 서경(W)으로 구분되어 표시되어 있고, 위도의 경우 북위(N) 및 남위(S)로 표시되어 있습니다. 하지만 천체 지도의 경우에는 RA는 시간(Hour) 단위이고 Dec은 통상적으로 도(Degree) 단위로 표시하면서 (+) 및 (-) 기호를 붙이기도 합니다. 따라서 좌표값들의 표시 방식에 대하여 천체 지도라는 특성에 맞는 추가적인 손질이 필요합니다. 이러한 처리를 위해서는 경도 및 위도 라벨 문자들이 표시되는 형식을 제어하는 LABEL_FORMAT 속성에 대하여 별도의 함수형 프로그램을 지정하여 라벨 문자들의 표시 형식을 세부적으로 직접 정의해줘야 합니다. 사실 이 과정이 약간 복잡할 수 있는데, 일단 이러한 목적으로 작성해본 함수형 프로그램의 내용은 다음과 같습니다.
FUNCTION MapGrid_Labels_BSC5, orientation, location, fractional, defaultlabel
IF (location EQ 0) THEN $
RETURN, orientation ? '0!eO' : '0H'
IF orientation EQ 1 AND location MOD 1 THEN fmt_str_lat = '(F0.1)' $
ELSE fmt_str_lat = '(I0)'
hour = (location GE 0 ? location : location+360) / 15
IF hour MOD 1 THEN fmt_str_lon = '(F0.1)' ELSE fmt_str_lon = '(I0)'
label = orientation ? STRING(location, FORMAT=fmt_str_lat) : $
STRING(hour, FORMAT=fmt_str_lon)
suffix = orientation ? '!eO' : 'H'
prefix = orientation ? ((location LT 0) ? '' : '+') : $
((location LT 0) ? '' : '')
RETURN, label+suffix
END
이러한 내용의 함수형 프로그램을 .pro 파일로 저장하고 이 파일을 현재 작업 디렉토리에 넣어두고 사용하면 됩니다. 이 프로그램 파일은 아래에도 첨부해둡니다. 이 프로그램의 내용에 관한 세부적인 설명은 여기서는 생략하기로 합니다.
이제 위도 및 경도 라벨 문자들이 표시되는 형식이 위의 함수형 프로그램에 의하여 제어되도록 하기 위하여 다음과 같은 내용을 추가로 실행합니다.
m.MapGrid.LABEL_FORMAT = 'MapGrid_Labels_BSC5'
m['Longitudes'].LABEL_ANGLE = 0
m.MapGrid.FONT_SIZE = 11
여기서는 지도 개체인 m의 좌표격자 개체인 MapGrid의 LABEL_FORMAT 속성에 대하여 앞서 정의한 함수형 프로그램을 지정함으로써, 라벨 문자들이 경도 및 위도 대신 RA 및 Dec 값들로 변환되어 적절한 형식으로 표시되도록 한 것입니다. 그리고 경도 라벨 문자들(여기서는 RA)의 방향 각도를 0으로 설정함으로써 디폴트인 수직 방향 대신 수평 방향으로 문자들이 표시되도록 하였습니다. 위의 내용까지 추가로 실행하면 그 결과는 다음 그림과 같습니다.

이 그림을 보면 이제는 나름대로 천체 지도라는 특성에 맞도록 RA 및 Dec 값의 라벨 문자들이 표시된 것 같습니다. 그러면 이제 별들을 이 지도상에 점들의 형태로 표시해보고자 합니다. 이러한 작업은 SCATTERPLOT 함수를 사용하여 처리하면 적절할 것 같으므로 그 과정을 다음과 같이 처리해봅시다.
sp = SCATTERPLOT(ra_degs, dec_degs, SYMBOL='circle', SYM_SIZE=0.2, $
/SYM_FILLED, /OVERPLOT)
여기서는 SCATTERPLOT 함수에 ra_degs 및 dec_degs 배열을 좌표 데이터로 투입하여 별들이 해당 위치에 표시되도록 한 것입니다. 그리고 각각의 별들은 적당한 크기의 원형 점으로 표시되도록 해보았습니다. 이러한 내용을 추가로 실행하면 결과는 다음 그림과 같습니다.

일단 이 그림을 보면 별들이 잘 표시된 것으로 보입니다. 다만 이 그림을 보면 RA 값 라벨 문자들이 별들 사이에 파묻혀서 잘 안보이는데, 다음과 같이 이 라벨 문자들에 한하여 몇가지 색상 관련 설정들을 추가해보면 어떨까 합니다.
m['Longitudes'].LABEL_FILL_BACKGROUND = 1
m['Longitudes'].LABEL_FILL_COLOR = 'yellow'
m['Longitudes'].LABEL_COLOR = 'red'
이러한 과정까지 추가로 실행된 결과는 다음 그림과 같습니다.

일단 이 정도면 나름대로 YBSC의 별들이 천체 지도상에 잘 표시된 것 같습니다. 참고로 이미 서두에서 언급했던 YBSC 공식 웹페이지에서도 이와 같이 카탈로그의 별들을 모두 표시한 천체 지도를 볼 수 있습니다. 공식 웹페이지에 게재되어있는 그림은 다음과 같습니다.

다만 두 그림을 비교해보면 서로 다르게 보이는데, 구체적으로는 RA 값이 증가하는 방향이 서로 반대입니다. 왜냐하면 우리가 IDL에서 표출한 지도에서는 RA가 왼쪽에서 오른쪽 방향으로 증가하는데, 공식 웹페이지의 그림에서는 그 방향이 반대이기 때문입니다. 이러한 차이를 감안하고 비교해보면, 우리가 IDL에서 표출한 그림에서도 별들의 위치가 올바르게 표시되었음을 확인할 수 있습니다. 사실 천체 지도의 경우 RA 값이 증가하는 방향이 오른쪽 방향이 되도록 하는 경우가 많지만, 그 반대 방향이 되도록 표시하는 경우도 있습니다.
어쨌든 YBSC 자료를 읽고 여기에 수록된 별들을 천체 지도상에 표출해보는 작업은 대략 이와 같은 과정으로 진행해볼 수 있습니다. 이제 다음 회차에서는 표출 작업에 대한 추가적인 내용을 좀 더 살펴보면서 마무리하도록 하겠습니다.
이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > Programming' 카테고리의 다른 글
Yale Bright Star Catalogue 데이터를 읽고 처리하기 [4] (1) | 2025.04.08 |
---|---|
Yale Bright Star Catalogue 데이터를 읽고 처리하기 [2] (0) | 2025.03.27 |
Yale Bright Star Catalogue 데이터를 읽고 처리하기 [1] (0) | 2025.03.25 |
기상청 ASOS 자료의 공간 분포 표출 [3] (0) | 2025.02.04 |
기상청 ASOS 자료의 공간 분포 표출 [2] (2) | 2025.01.27 |