You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于本地位置利用Astropy生成日食发生时刻?

天文摄影自动化:离线生成日食精确时刻并实现自动拍摄

我是一名天文摄影爱好者,正在开发Python脚本以自动化拍摄2024年的日全食,这样就能用肉眼欣赏日食的同时让单反相机自动拍摄。目前已经开发出基于日食偏食阶段(初亏C1)和UTC时刻的自动化脚本,使用digicamcontrol控制相机,代码如下:

import digiCamControlPython as dccp
import time
from datetime import datetime
from astropy.time import Time 

local_time = Time.now()

utc_time_now = local_time.utc

def PartialEclipse(start_time:str, end_time:str):
    camera = dccp.Camera()
    camera.setIso(100)
    camera.setShutterspeed("1/50")
    camera.setFolder(r"C:\Users\My_Name\Pictures\digiCamControl")
    
    # 设置目标拍摄时间为astropy时间格式
    partial_eclipse_start = Time(start_time, format='isot')
    partial_eclipse_end = Time(end_time, format='isot')

    # 等待到拍摄开始时间
    while utc_time_now < partial_eclipse_start:
        time.sleep(1)

    # 开始拍摄图像
    while utc_time_now < partial_eclipse_end:
        camera.capture()
        time.sleep(30)  # 每30秒拍摄一张照片
        
PartialEclipse("2024-04-08T17:12:13", "2024-04-08T18:29:24") # 偏食开始时刻和全食前15秒的时刻

但我遇到一个问题:如果无法联网获取基于我所在位置的日食精确时刻,该如何生成这些时刻?有没有更高效的方法利用Astropy完成此任务?提前感谢。


后续进展

之后我自己摸索出了一些思路,写出了以下代码:

import numpy as np
import astropy.units as u
from astropy.coordinates import solar_system_ephemeris, AltAz, EarthLocation, SkyCoord
from astropy.coordinates import get_body, get_moon, get_sun
from astropy.time import Time

myLocation = EarthLocation(lat=26*u.deg, lon=-80*u.deg, height=0*u.m)

# 设置检查日食的时间间隔(秒)
time_step = 3600 # 1小时

# 设置检查日食的天数范围
num_days = 365

# 设置检查的起始和结束时间
start_time = Time.now()
end_time = start_time + num_days * u.day

# 初始化存储日食时刻的列表
eclipse_times = []

# 遍历目标时间范围,每隔time_step秒检查一次日食
with solar_system_ephemeris.set('jpl'):
  for t in np.arange(start_time.unix, end_time.unix, time_step):
    time = Time(t, format='unix')
    moon = get_body('moon', time, myLocation)
    sun = get_body('sun', time, myLocation)
    sun_coord = SkyCoord(sun.ra, sun.dec, sun.distance, frame='icrs')
    moon_coord = SkyCoord(moon.ra, moon.dec, moon.distance, frame='icrs')
    
    # 检查月球和太阳的角距离是否接近0
    angular_separation = moon_coord.separation(sun_coord)
    if angular_separation < 0.6 * u.deg: # 偏食开始的角距阈值
      eclipse_times.append(time)

# 输出下一次日食的时刻
if len(eclipse_times) > 0:
  print("下一次日食的时刻是: ", eclipse_times[0].iso)
else:
  print("在指定时间范围内未找到日食。")

内容的提问来源于stack exchange,提问作者ked123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:20:41