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 下载
55KB
988 行
纯Rust编写的WCS解析库
此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
待办事项列表
- 添加圆锥投影(
COD
,COE
,COO
,COP
) - 添加圆柱投影(
CAR
,CEA
,CYP
,MER
) - 添加混合投影(
HPX
) - 添加伪圆柱投影(
AIT
,MOL
,PAR
,SFL
) - 添加天顶投影(
AIR
,ARC
,AZP
,SIN
,STG
,SZP
,TAN
,ZEA
,ZPN
) - 不支持天顶投影(
FEYE
,NCP
) - 添加多圆锥和伪圆锥投影(
BON, PCO
)? - 添加四球面投影(
TSC
,CSC
,QSC
)? - 检查并可能记录要添加以匹配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