前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >天文观测数据分析:利用Astrometry API自动添加WCS信息

天文观测数据分析:利用Astrometry API自动添加WCS信息

作者头像
用户11172986
发布2025-02-27 15:43:10
发布2025-02-27 15:43:10
5100
代码可运行
举报
文章被收录于专栏:气python风雨气python风雨
运行总次数:0
代码可运行

天文观测数据分析:利用Astrometry API自动添加WCS信息

在天文观测数据分析中,位置定标(WCS,World Coordinate System)是不可或缺的步骤。WCS信息是天文数据分析的基础,没有它,后续的数据处理将无从下手。本文将介绍如何利用Astrometry的API,通过在线提交观测数据,自动获取WCS信息并将其写入原始文件中,实现位置定标的自动化。

作者:吉林通化市局气象局崔忠强

编辑:气ython风雨

1. 什么是WCS?

WCS(World Coordinate System)是一种将图像像素坐标与天空坐标(如赤经、赤纬)关联起来的系统。它是天文数据分析的核心,用于确定图像中天体的精确位置。没有WCS,天文图像的后续处理(如测光、光谱分析)将无法进行。

2. Astrometry:在线位置定标工具

Astrometry是目前最方便的在线位置定标工具之一,具有以下优点:

  • 全天盲解:无需用户提供初始位置信息,自动识别图像中的天体。
  • 高精度:解析精度较高,支持多种格式(如FITS、PNG、JPG)。
  • 无需本地星表:完全在线处理,无需下载庞大的星表数据。

唯一的缺点是速度偶尔较慢,但对于大多数用户来说,这完全是可以接受的。

3. 代码实现:自动添加WCS信息

以下代码展示了如何利用Astrometry的API,自动上传FITS文件并获取WCS信息,最终将其写入原始文件中。

代码步骤:

  1. 登录Astrometry:获取会话(session)以便后续操作。
  2. 上传FITS文件:将观测数据上传到Astrometry服务器。
  3. 获取任务ID:提交任务并获取任务ID,用于轮询任务状态。
  4. 下载WCS信息:任务完成后,下载包含WCS信息的FITS文件。
  5. 合并WCS信息:将WCS信息写入原始FITS文件。
代码语言:javascript
代码运行次数:0
复制
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()

Image Name
Image Name

位置定标后再对原始数据做孔径测光,对已知恒星拟合后结果非常好。这是某千元级智能望远镜在城市中的拟合结果。流量定标后基本可以满足入门天文爱好者的太阳系天体基础测光要求。

4.总结

利用Astrometry的API,我们可以轻松实现天文观测数据的自动位置定标。这种方法不仅高效,而且精度较高,非常适合天文爱好者和科研人员使用。如果你有天文观测数据需要处理,不妨试试这个工具

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 天文观测数据分析:利用Astrometry API自动添加WCS信息
    • 1. 什么是WCS?
    • 2. Astrometry:在线位置定标工具
    • 3. 代码实现:自动添加WCS信息
      • 代码步骤:
    • 4.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档