11次发布

0.2.8 2023年5月22日
0.2.7 2023年5月22日
0.2.6 2023年4月26日
0.2.4 2023年3月23日
0.1.1 2023年1月26日

#327 in 算法

每月 23 下载

Apache-2.0 OR MIT

55KB
988

纯Rust编写的WCS解析库

API Documentation on docs.rs

此crate必须与fitsrs一起使用。它接受FITS头文件并将其解析为WCS。WCS对象允许两个操作

  • 将给定度数的(经度,纬度)元组投影到图像空间XY(像素)中
  • 将图像空间中的顶点反投影到球面上的(经度,纬度)元组。此crate高度依赖F.-X. Pineau (@fxpineau) 为mapproj crate所做的工作

FITS WCS标准中未失真的天球坐标系统的参考是《FITS天球坐标表示》Calabretta, M. R.,Greisen, E. W.,《天体物理学》,395,1077-1122,2002

待办事项列表

  • 添加圆锥投影(CODCOECOOCOP
  • 添加圆柱投影(CARCEACYPMER
  • 添加混合投影(HPX
  • 添加伪圆柱投影(AITMOLPARSFL
  • 添加天顶投影(AIRARCAZPSINSTGSZPTANZEAZPN
  • 不支持天顶投影(FEYENCP
  • 添加多圆锥和伪圆锥投影(BON, PCO)?
  • 添加四球面投影(TSCCSCQSC)?
  • 检查并可能记录要添加以匹配WCS投影界限的常量
  • 支持CRPIX + CD约定
  • 支持CRPIX + PC + CDELT约定
  • 支持CRPIX + CROTA + CDELT约定
  • 添加对LONPOLE的支持?
  • SIP协议支持
  • SIP未测试
  • TPV世界坐标系非标准约定
  • 添加投影文件和图表的生成(部分完成)

示例

use std::fs::File;
use std::io::BufReader;

use fitsrs::Fits;
use wcsrs::{
    WCS,
    ImgXY, LonLat
};

fn main() {
    // 1. Parse a fits file using fitsrs
    let mut f = File::open("<your fits file path>").unwrap();
    let mut reader = BufReader::new(f);
    let Fits { hdu } = Fits::from_reader(&mut reader).unwrap();

    let header = hdu.get_header();
    // Get the crval and crpix values along each axes
    let crval1 = header
        .get_parsed::<f64>(b"CRVAL1  ")
        .unwrap_or(Ok(0.0))
        .unwrap();
    let crval2 = header
        .get_parsed::<f64>(b"CRVAL2  ")
        .unwrap_or(Ok(0.0))
        .unwrap();
    let crpix1 = header
        .get_parsed::<f64>(b"CRPIX1  ")
        .unwrap_or(Ok(0.0))
        .unwrap();
    let crpix2 = header
        .get_parsed::<f64>(b"CRPIX2  ")
        .unwrap_or(Ok(0.0))
        .unwrap();

    // 2. Create a WCS from a specific header unit
    let wcs = WCS::new(&header).unwrap();

    // 3. Once the WCS object is created, performs:
    // * The projection of the center (lon, lat) = (crval1, crval2)
    let lonlat = LonLat::new(crval1.to_radians(), crval2.to_radians());
    let xy = wcs
        .proj_lonlat(&lonlat)
        .unwrap();
    assert_delta!(xy.x(), crpix1 - 1.0, 1e-6);
    assert_delta!(xy.y(), crpix2 - 1.0, 1e-6);

    // * The unprojection of (X, Y) = (crpix1, crpix2)
    let xy = ImgXY::new(crpix1 - 1.0, crpix2 - 1.0);
    let lonlat = wcs
        .unproj_lonlat(&xy)
        .unwrap();
    assert_delta!(lonlat.lon(), crval1.to_radians(), 1e-6);
    assert_delta!(lonlat.lat(), crval2.to_radians(), 1e-6);
}

依赖项

~2.8–4MB
~77K SLoC