天体信息 = {"太阳": { "质量": 1.9891e30, "平均密度": 1.408e3 }, "地球": { "质量": 5.97237e24, "平均密度": 5507.85, "转轴倾角": 23.44 }, "月球": { "质量": 7.342e22, "平均密度": 3.344e3 }} def get_body_pos_vel(body_name: str, dt=None): """ 根据日期时间获取地球的 @param dt: @return: """ import pytz # 安装 astropy 包 # pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com astropy # 获取天体的坐标pos和速度vel from astropy.coordinates import get_body_barycentric_posvel import astropy.units as u # 单位 body_dict = {'地球': 'earth', '太阳': 'sun', '月球': 'moon', '水星': 'mercury', '金星': 'venus', '地月': 'earth-moon-barycenter', '火星': 'mars', '木星': 'jupiter', '土星': 'saturn', '天王星': 'uranus', '海王星': 'neptune'} body_name = body_dict.get(body_name, body_name) # from astropy.coordinates import solar_system_ephemeris # print("天体名:", solar_system_ephemeris.bodies) # ('earth', 'sun', 'moon', 'mercury', 'venus', 'earth-moon-barycenter', # 'mars', 'jupiter', 'saturn', 'uranus', 'neptune') if dt is None: from astropy.time import Time from datetime import datetime # dt = Time(datetime.strptime('2149-02-01 12:00:00+0800', '%Y-%m-%d %H:%M:%S%z'), # format='datetime') dt = Time.now() print('----------------------------------------') print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai'))) # 获取地球的坐标和速度 pos, vel = get_body_barycentric_posvel(body_name.lower(), dt) pos = [pos.x.to(u.km).value, pos.y.to(u.km).value, pos.z.to(u.km).value] # print("地球坐标(公里):", pos) # pos = [pos.x.to(u.au).value, # pos.y.to(u.au).value, # pos.z.to(u.au).value] # print("地球坐标(天文单位):", pos) vel = [vel.x.to(u.km / u.second).value, vel.y.to(u.km / u.second).value, vel.z.to(u.km / u.second).value] # print("地球速度(公里/秒):", vel) print('----------------------------------------') # pos = [pos[0].value,pos[1].value,pos[2].value] return pos, vel from astropy.coordinates import solar_system_ephemeris print(solar_system_ephemeris.bodies) print(get_body_pos_vel('earth')) # # from astropy.coordinates import SkyCoord, get_sun # from astropy import units as u # from astropy.time import Time # # # 指定时间,这里以2023年10月1日为例 # obs_time = Time('2023-10-01') # # # 创建冥王星的坐标对象,使用名称'Pluto'或者天体ID 134340 # pluto_coord = SkyCoord(body='Pluto', frame='icrs', obstime=obs_time) # # # 计算并输出冥王星在该时间的赤道坐标(赤经和赤纬) # print(pluto_coord.ra, pluto_coord.dec) # # # 如果需要获取相对于太阳的坐标,可以使用get_sun函数获取太阳的位置 # sun_coord = get_sun(obs_time) # # # 计算冥王星相对于太阳的坐标 # pluto_relative_coord = pluto_coord.separation(sun_coord) # # # 输出冥王星相对于太阳的角距离 # print(pluto_relative_coord.arcsec)