在天文观测数据分析中,位置定标(WCS,World Coordinate System)是不可或缺的步骤。WCS信息是天文数据分析的基础,没有它,后续的数据处理将无从下手。本文将介绍如何利用Astrometry的API,通过在线提交观测数据,自动获取WCS信息并将其写入原始文件中,实现位置定标的自动化。
作者:吉林通化市局气象局崔忠强
编辑:气ython风雨
WCS(World Coordinate System)是一种将图像像素坐标与天空坐标(如赤经、赤纬)关联起来的系统。它是天文数据分析的核心,用于确定图像中天体的精确位置。没有WCS,天文图像的后续处理(如测光、光谱分析)将无法进行。
Astrometry是目前最方便的在线位置定标工具之一,具有以下优点:
唯一的缺点是速度偶尔较慢,但对于大多数用户来说,这完全是可以接受的。
以下代码展示了如何利用Astrometry的API,自动上传FITS文件并获取WCS信息,最终将其写入原始文件中。
import requests
import json
import time
from astropy.io import fits
# 配置参数
API_KEY = 'XXXX'# 替换为你的Astrometry API密钥
FITS_FILE = r'fts\29P Schwassmann-Wachmann_15s60_Astro_20250223-222729644_0C.fits'# 输入FITS文件路径
def solve_and_add_wcs():
# 登录Astrometry
R = requests.post('http://nova.astrometry.net/api/login', data={'request-json': json.dumps({"apikey": API_KEY})}).json()
session = R['session']
print('登录成功,session=' + session)
# 上传FITS文件
upload_url = 'http://nova.astrometry.net/api/upload'
data = {
'request-json': json.dumps({
'session': session,
'publicly_visible': 'n',
'allow_modifications': 'd',
})
}
try:
with open(FITS_FILE, 'rb') as f:
upload_response = requests.post(upload_url, data=data, files={'file': f})
upload_response.raise_for_status()
except Exception as e:
raise Exception(f"上传失败: {str(e)}")
upload_data = upload_response.json()
print(upload_data)
if upload_data.get('status') != 'success':
raise Exception(f"上传错误: {upload_data.get('error', '未知错误')}")
# 获取任务ID
submission_id = upload_data['subid']
whileTrue:
get_job_url = f'http://nova.astrometry.net/api/submissions/{submission_id}'
job_data = requests.get(get_job_url).json()
if len(job_data['jobs']) == 0or job_data['jobs'][0] == None:
print("任务排队中")
time.sleep(10)
continue
else:
break
job_id = job_data['jobs'][0]
print(f"任务提交成功,Job ID: {job_id}")
# 轮询任务状态
job_url = f'http://nova.astrometry.net/api/jobs/{job_id}'
whileTrue:
try:
job_response = requests.get(job_url)
job_response.raise_for_status()
job_data = job_response.json()
except Exception as e:
print(f"状态检查失败: {str(e)}")
time.sleep(10)
continue
status = job_data.get('status')
if status == 'success':
print("解析成功!")
break
elif status in ['error', 'failure']:
raise Exception(f"解析失败: {job_data.get('error', '无错误信息')}")
else:
print(f"当前状态: {status},10秒后重试...")
time.sleep(10)
# 下载WCS信息
wcs_url = f'http://nova.astrometry.net/wcs_file/{job_id}'
try:
wcs_response = requests.get(wcs_url)
wcs_response.raise_for_status()
except Exception as e:
raise Exception(f"下载WCS失败: {str(e)}")
wcs_filename = f'wcs_{job_id}.fits'
with open(wcs_filename, 'wb') as f:
f.write(wcs_response.content)
print(f"WCS文件已保存: {wcs_filename}")
# 合并WCS信息到原文件
with fits.open(FITS_FILE, mode='update') as orig_hdu, fits.open(wcs_filename) as wcs_hdu:
orig_header = orig_hdu[0].header
wcs_header = wcs_hdu[0].header
# 删除旧WCS关键字
for key in orig_header:
if key.startswith(('CTYPE', 'CRPIX', 'CRVAL', 'CD', 'PV', 'RADESYS', 'EQUINOX')):
del orig_header[key]
# 添加新WCS关键字
for key in wcs_header:
if key.startswith(('CTYPE', 'CRPIX', 'CRVAL', 'CD', 'PV', 'RADESYS', 'EQUINOX')):
orig_header[key] = wcs_header[key]
print(f"WCS信息已写入{FITS_FILE}")
if __name__ == '__main__':
solve_and_add_wcs()
位置定标后再对原始数据做孔径测光,对已知恒星拟合后结果非常好。这是某千元级智能望远镜在城市中的拟合结果。流量定标后基本可以满足入门天文爱好者的太阳系天体基础测光要求。
利用Astrometry的API,我们可以轻松实现天文观测数据的自动位置定标。这种方法不仅高效,而且精度较高,非常适合天文爱好者和科研人员使用。如果你有天文观测数据需要处理,不妨试试这个工具