cosmo/backend/scripts/update_orbit_params.py

170 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
更新太阳系行星和矮行星的轨道参数到 extra_data 字段
将硬编码在 celestial_orbit.py 中的轨道周期和颜色迁移到数据库的 extra_data 字段
这样用户可以在后台界面直接编辑这些参数
"""
import asyncio
import sys
from pathlib import Path
# Add backend directory to path
backend_dir = Path(__file__).parent.parent
sys.path.insert(0, str(backend_dir))
from sqlalchemy import select, update
from app.database import AsyncSessionLocal
from app.models.db.celestial_body import CelestialBody
# 轨道参数(从 celestial_orbit.py 迁移)
ORBIT_PARAMS = {
# 行星 - 完整公转周期
"199": {
"orbit_period_days": 88.0,
"orbit_color": "#8C7853",
"name_zh": "水星"
},
"299": {
"orbit_period_days": 224.7,
"orbit_color": "#FFC649",
"name_zh": "金星"
},
"399": {
"orbit_period_days": 365.25,
"orbit_color": "#4A90E2",
"name_zh": "地球"
},
"499": {
"orbit_period_days": 687.0,
"orbit_color": "#CD5C5C",
"name_zh": "火星"
},
"599": {
"orbit_period_days": 4333.0,
"orbit_color": "#DAA520",
"name_zh": "木星"
},
"699": {
"orbit_period_days": 10759.0,
"orbit_color": "#F4A460",
"name_zh": "土星"
},
"799": {
"orbit_period_days": 30687.0,
"orbit_color": "#4FD1C5",
"name_zh": "天王星"
},
"899": {
"orbit_period_days": 60190.0,
"orbit_color": "#4169E1",
"name_zh": "海王星"
},
# 矮行星 - 完整公转周期
"999": {
"orbit_period_days": 90560.0,
"orbit_color": "#8B7355",
"name_zh": "冥王星"
},
"2000001": {
"orbit_period_days": 1680.0,
"orbit_color": "#9E9E9E",
"name_zh": "谷神星"
},
"136199": {
"orbit_period_days": 203500.0,
"orbit_color": "#E0E0E0",
"name_zh": "阋神星"
},
"136108": {
"orbit_period_days": 104000.0,
"orbit_color": "#D4A574",
"name_zh": "妊神星"
},
"136472": {
"orbit_period_days": 112897.0,
"orbit_color": "#C49A6C",
"name_zh": "鸟神星"
},
}
async def update_orbit_parameters():
"""更新数据库中的轨道参数"""
async with AsyncSessionLocal() as session:
print("🔄 开始更新轨道参数...\n")
updated_count = 0
not_found_count = 0
for body_id, params in ORBIT_PARAMS.items():
# 查询天体
result = await session.execute(
select(CelestialBody).where(CelestialBody.id == body_id)
)
body = result.scalar_one_or_none()
if not body:
print(f"⚠️ 天体 {body_id} ({params['name_zh']}) 未找到")
not_found_count += 1
continue
# 合并 extra_data
extra_data = body.extra_data or {}
extra_data["orbit_period_days"] = params["orbit_period_days"]
extra_data["orbit_color"] = params["orbit_color"]
# 更新数据库
await session.execute(
update(CelestialBody)
.where(CelestialBody.id == body_id)
.values(extra_data=extra_data)
)
print(f"{params['name_zh']:8s} (ID: {body_id:7s}) - "
f"周期: {params['orbit_period_days']:8.1f} 天 ({params['orbit_period_days']/365.25:6.2f} 年), "
f"颜色: {params['orbit_color']}")
updated_count += 1
await session.commit()
print(f"\n{'='*80}")
print(f"✅ 更新完成: {updated_count} 个天体")
if not_found_count > 0:
print(f"⚠️ 未找到: {not_found_count} 个天体")
print(f"{'='*80}")
async def main():
"""主函数"""
print("=" * 80)
print("太阳系行星和矮行星轨道参数更新工具")
print("=" * 80)
print()
await update_orbit_parameters()
print("\n灶神星Vesta轨道参数")
print("=" * 80)
print("JPL Horizons ID: 2000004")
print("英文名: Vesta")
print("中文名: 灶神星")
print("类型: 矮行星 (dwarf_planet)")
print()
print("轨道参数:")
print(" - 轨道周期: 1325.46 天 (约 3.63 年)")
print(" - 建议颜色: #A8A8A8 (浅灰色)")
print(" - 半长轴: 2.36 AU")
print(" - 离心率: 0.089")
print(" - 轨道倾角: 7.14°")
print()
print("描述: 灶神星是小行星带中第二大的小行星直径约525公里。")
print(" 它是唯一一颗肉眼可见的小行星,也是黎明号探测器访问过的天体。")
print("=" * 80)
if __name__ == "__main__":
asyncio.run(main())