「嗨,黑蛋,咦? 你那邊怎麼會有鳥叫聲?喔,原來你在山上呀。對了,客戶表示目前系外行星資料表中,『與地球的距離』欄位的值是以秒差距這個單位呈現,他希望有可以切換成其他單位的功能,像是光年、天文單位與公里,以便他能因應不同狀況而匯出不同距離單位的資料表。」
其實黑蛋一直很納悶何謂秒差距,結束通話後,他便詢問Google大神。在看完「星空500秒:ep8 視差現象與秒差距」這個由中央大學天文所陳文屏教授所解說的影片後,黑蛋俯瞰山腳,想像山腳下兩頭的人分別望向他所在的這座山時所造成的視角差異,體會到這便是用來定義秒差距的視差現象吧。
在略懂秒差距後,黑蛋開始著手進行單位轉換功能的開發。為了方便將秒差距換算成其他距離單位,他先是用了Astropy這個Python套件中的天文常用單位轉換功能astropy.units,來計算1個秒差距等於多少光年、多少天文單位、多少公里。然後,他加上st.radio元件,讓使用者能在頁面上切換距離單位,並搭配convert_exoplanet_table_distance_unit()函式,來換算資料表中『與地球的距離』欄位的值。最後,為了讓使用者了解不同單位如何換算,他以st.markdown加上說明。
# 02_Exoplanet_table_filter.py
import streamlit as st
import astropy.units as u
# 前略
def get_distance_unit_dict():
parsec = 1 * u.parsec
parsec_to_lightyear = parsec.to(u.lyr)
parsec_to_au = parsec.to(u.au)
parsec_to_km = parsec.to(u.km)
distance_unit_dict = {
'秒差距': parsec,
'光年': parsec_to_lightyear,
'天文單位': parsec_to_au,
'公里': parsec_to_km
}
return distance_unit_dict
def convert_exoplanet_table_distance_unit(
exoplanet_table, distance_unit_dict, distance_unit
):
exoplanet_table['與地球的距離'] = exoplanet_table[
'與地球的距離'] * distance_unit_dict.get(distance_unit).value
exoplanet_table = exoplanet_table.rename(
columns={'與地球的距離': f'與地球的距離(單位:{distance_unit})'}
)
return exoplanet_table
# 中略
distance_unit_dict = get_distance_unit_dict()
distance_unit = st.radio(
'切換表格中的距離單位', list(distance_unit_dict.keys()), horizontal=True
)
exoplanet_table = convert_exoplanet_table_distance_unit(
exoplanet_table, distance_unit_dict, distance_unit
)
with st.expander('各距離單位的換算'):
st.markdown('[秒差距](https://zh.wikipedia.org/zh-tw/%E7%A7%92%E5%B7%AE%E8%B7%9D)、[光年](https://zh.wikipedia.org/zh-tw/%E5%85%89%E5%B9%B4)和[天文單位](https://zh.wikipedia.org/zh-tw/%E5%A4%A9%E6%96%87%E5%96%AE%E4%BD%8D)都是常用來描述星體距離的長度單位')
st.markdown('1秒差距約為 $3.09*10^{13}$ 公里')
st.markdown('1光年約為 $9.46*10^{12}$ 公里')
st.markdown('1天文單位是地球和太陽的平均距離,約為 $1.5*10^{8}$ 公里')
# 後略
此系列文由蘇羿豪撰寫,以「創用CC 姓名標示 4.0(CC BY 4.0)國際版授權條款」釋出。