[플라네타리움 구현기] #1. HYG Database 처리

  1. 1. 목차
  2. 2. HYG 데이터베이스
  3. 3. 데이터 축소
    1. 3.1. About the HYG Database

목차

HYG 데이터베이스

밤하늘의 모든 별의 위치를 한번에 표현할 수 있는 수식은 사실상 없습니다. 즉, 밤하늘에 있는 별들의 위치는 랜덤에 가깝습니다. 따라서 밤하늘의 별들의 위치를 직접 측정한 정보(혹은 데이터베이스)가 필요합니다.

우리가 필요한 것들은 구글링 해보면 보통 나옵니다. 별의 위치를 저장한 데이터베이스중 아무거나 써도 상관없지만, 이 글에서는 HYG-database를 이용합니다.

이 데이터베이스를 꼭 써야하는 이유는 없습니다. 마음에 드는 데이터베이스를 사용하면 됩니다.

데이터 축소

이 HYG database 아카이브의 README에도 나와있듯이, 이 데이터베이스는 다른 3개의 데이터베이스에서 중요한 것들을 간추린 버전입니다.

About the HYG Database

The database is a subset of the data in three major catalogs: the Hipparcos Catalog,the Yale Bright Star Catalog (5th Edition), and the Gliese Catalog of Nearby Stars (3rd Edition). Each of these catalogs contains information useful to amateur astronomers:

  • The Hipparcos catalog is the largest collection of high-accuracy stellar positional data, particularly parallaxes, which makes it useful as a starting point for stellar distance data.
  • The Yale Bright Star Catalog contains basic data on essentially all naked-eye stars, including much information (such as the traditional Bayer Greek letters and Flamsteed numbers) missing from many other catalogs
  • The Gliese catalog is the most comprehensive catalog of nearby stars (those within 75 light years of the Sun). It contains many fainter stars not found in Hipparcos.

실제 데이터베이스는 csv의 형태로 되어있습니다.

1
2
3
4
5
id,hip,hd,hr,gl,bf,proper,ra,dec,dist,pmra,pmdec,rv,mag,absmag,spect,ci,x,y,z,vx,vy,vz,rarad,decrad,pmrarad,pmdecrad,bayer,flam,con,comp,comp_primary,base,lum,var,var_min,var_max
0,,,,,,Sol,0.000000,0.000000,0.0000,0.00,0.00,0.0,-26.700,4.850,G2V,0.656,0.000005,0.000000,0.000000,0.00000000,0.00000000,0.00000000,0,0,0,0,,,,1,0,,1,,,
1,1,224700,,,,,0.000060,1.089009,219.7802,-5.20,-1.88,0.0,9.100,2.390,F5,0.482,219.740502,0.003449,4.177065,0.00000004,-0.00000554,-0.00000200,0.000015693409775347223,0.01900678824815125,-0.000000025210311388888885,-0.000000009114497,,,Psc,1,1,,9.638290236239703,,,
2,2,224690,,,,,0.000283,-19.498840,47.9616,181.21,-0.93,0.0,9.270,5.866,K3V,0.999,45.210918,0.003365,-16.008996,-0.00000007,0.00004213,-0.00000020,0.00007396114511717882,-0.34031895245171123,0.0000008785308705347223,-0.000000004508767,,,Cet,1,2,,0.39228346253952057,,,
...

이 csv파일을 바로 사용하기에는 두가지 문제가 있습니다.

  • 용량이 너무 큽니다. 32MB나 되는 파일을 github에서 받아오는 시간은 0.7초 내외인데, 조금 더 로드 시간이 빠르면 좋을 것 같습니다.
  • 필요하지 않은 정보들이 많습니다. 7.9등급 외의 별과 사용하지 않을 정보(컬럼)이 너무 많습니다.

추가적으로 필자가 json 형태의 데이터를 선호하기 때문에 우리가 필요한 정보만 포함하여 새로운 json 파일을 생성하여 저장하겠습니다.

간단한 python 스크립트를 작성해서 위에 언급된 문제들을 해결해줍시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Data format
import csv, json

# Using argv
import sys

# argv check
if len(sys.argv) < 2:
mag_min = 7.9
else:
mag_min = float(sys.argv[1])

src = open("hygdata_v3.csv", "r")
rows = csv.reader(src)
rows = list(rows)
payload = list()

#Get index of each column
indexes = [ra, dec, proper, mag] = [rows[0].index(attr) for attr in ["ra", "dec", "proper", "mag"]]

for row in rows[1:]:
if float(row[mag]) <= mag_min:
#reduced <= [('ra', '0.000000'), ('dec', '0.000000'), ('proper', 'Sol'), ('mag', '-26.700')]
reduced = zip([rows[0][index] for index in indexes],[row[index] for index in indexes])
payload.append(dict(reduced))

# Remove Sun!!!
payload = payload[1:]

# Write to json
dst = open("reduced.json", "w")
print(f"[*] Reduced -> {len(payload)}")
dst.write(json.dumps(payload, indent = 4))

해당 스크립트는 테스트를 위해 실행시 최소 별 밝기를 인자(예시: python reducer.py 5.5)로 줄 수 있습니다.
스크립트를 돌리면 다음과 같이 필요한 정보만 담은 json파일을 생성할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[
{
"ra": "0.139791",
"dec": "29.090432",
"proper": "Alpheratz",
"mag": "2.070"
},
{
"ra": "0.152887",
"dec": "59.149780",
"proper": "Caph",
"mag": "2.280"
},
{
"ra": "0.220598",
"dec": "15.183596",
"proper": "Algenib",
"mag": "2.830"
},
{
"ra": "0.427916",
"dec": "-77.254247",
"proper": "",
"mag": "2.820"
},
...

이렇게 처리하면 용량이 32MB에서 4.1MB까지 줄어드는 것을 확인할 수 있습니다.

1
2
3
4
5
pngwna@ArchPngWnA ~/github/BHNB/reduction (git)-[master] % ll
합계 36M
-rw-r--r-- 1 pngwna users 32M 5월 27일 06:51 hygdata_v3.csv
-rw-r--r-- 1 pngwna users 4.1M 5월 27일 07:18 reduced.json
-rw-r--r-- 1 pngwna users 831 5월 27일 07:15 reducer.py

아직도 용량이 큰 것 같지만, 테스트 결과 raw.githubusercontent.com 기준으로 해당 json파일이 0.2초 내외로 로드되는 것을 확인할 수 있습니다.

플라네타리움 구현에 가장 중요한 별 위치 데이터베이스를 얻었습니다. 따라서 다음 챕터부터는 실제로 이 정보를 활용해서 어떻게 플라네타리움을 구현할지에 대한 내용을 설명하겠습니다.