#投影 #FITS #WCS

mapproj

FITS 世界坐标系统(WCS)中定义的地图投影(部分)的实现

3 个版本 (破坏性更新)

0.3.0 2022 年 12 月 13 日
0.2.0 2022 年 11 月 18 日
0.1.0 2022 年 11 月 18 日

#187 in 科学

Download history 28/week @ 2024-03-13 56/week @ 2024-03-20 41/week @ 2024-03-27 74/week @ 2024-04-03 14/week @ 2024-04-10 5/week @ 2024-04-17 8/week @ 2024-04-24 7/week @ 2024-05-01 24/week @ 2024-05-08 66/week @ 2024-05-15 242/week @ 2024-05-22 1845/week @ 2024-05-29 38/week @ 2024-06-05 30/week @ 2024-06-12 119/week @ 2024-06-19 162/week @ 2024-06-26

388 每月下载
用于 2 crates

Apache-2.0 OR MIT

275KB
2.5K SLoC

mapproj

FITS 世界坐标系统(WCS)中定义的地图投影(部分)的实现。

API Documentation on docs.rs

目的

主要用于添加投影,并支持在 Aladin Lite V3 中显示 FITS 图像。

警告

此库

  • 不支持 FITS 读取/解析和关键字分析;
  • 目前处于早期阶段(请参阅待办事项列表),将在 Aladin Lite V3 中包含时进行演变。

详细信息

WCS 论文 不同,我们遵循 F. Ochsenbein 之前的作品,使用春分点 (1, 0, 0) 作为默认投影中心/原点。对于天顶投影,我们因此使用欧几里得坐标而不是赤道坐标在 yz 平面上进行投影。更改投影中心对应于欧几里得坐标的简单 3x3 矩阵乘法。

这项工作最初于 2017 年内部完成(仍由 F.-X. Pineau 完成),使用 Java,以在 Aladin Desktop 中支持更多投影(尚未发布,尚未公开)。F. Ochsenbein 在其 AstroCoo 库中先前实现了 TAN、STG、SIN、ZEA、ARC、AIT、SFL、MER 和 CEA(对于 lambda=1,即兰伯特投影)。

示例

给定以下 FITS 卡

CTYPE1  = 'RA---SIN'                                               
CTYPE2  = 'DEC--SIN'                            
CRPIX1  =      382.00001513958 / reference pixel in X coordinate  
CRPIX2  =     389.500015437603 / reference pixel in Y coordinate       
CRVAL1  =        183.914583333 / RA of reference position (degrees)        
CRVAL2  =              36.3275 / DEC of reference position (degrees)      
WCSDIM  =                    2                            
CD1_1   =  -2.7777777349544E-4                                  
CD2_2   =  2.77777773495436E-4                                                                               
CDELT1  =  -2.7777777349544E-4 / Redundancy with CD1_1, we ignore it      
CDELT2  =  2.77777773495436E-4 / Redundancy with CD2_2, we ignore it
// Imports
use mapproj::{
   CenteredProjection, ImgXY, LonLat
   img2lonlat::Img2LonLat,
   img2proj::ImgXY2ProjXY,
   zenithal::sin::Sin,
};

// Define constants
let crpix1 =  382.00001513958_f64;
let crpix2 = 389.500015437603_f64;

let crval1 = 183.914583333_f64;
let crval2 = 36.3275_f64;

let cd11 = -2.7777777349544e-4_f64;
let cd22 =  2.77777773495436e-4_f64;

// Set the projection
let mut proj = CenteredProjection::new(Sin::default());
let proj_center = LonLat::new(crval1.to_radians(), crval2.to_radians());
proj.set_proj_center_from_lonlat(&proj_center);
let img2proj = ImgXY2ProjXY::from_cd(crpix1, crpix2, cd11, 0.0, 0.0, cd22);
let img2lonlat = Img2Celestial::new(img2proj, proj);
// We could have set the projection center here instead of previously:
//   img2lonlat.set_proj_center_from_lonlat(proj_center);

// Use to project, unproject coordinates:
// - we choose on purpose position in the image of the projection center 
let img_coo_input = ImgXY::new(382.00001513958, 389.500015437603);
let lonlat = img2lonlat.img2lonlat(&img_coo_input).unwrap();
assert!((lonlat.lon() - proj_center.lon()).abs() < 1e-14);
assert!((lonlat.lat() - proj_center.lat()).abs() < 1e-14);
let img_coo_input = img2lonlat.lonlat2img(&lonlat).unwrap();
assert!((img_coo_input.x() - img_coo_input.x()).abs() < 1e-14);
assert!((img_coo_input.y() - img_coo_input.y()).abs() < 1e-14);

待办事项列表

  • 添加圆锥投影(CODCOECOOCOP
  • 添加圆柱投影(CARCEACYPMER
  • 添加混合投影(HPX
  • 添加伪圆柱投影(AITMOLPARSFL
  • 添加天顶投影(AIRARCAZPFEYENCPSINSTGSZPTANZEAZPN
  • 添加多圆锥和伪圆锥投影(BON, PCO)?
  • 添加四立方投影(TSCCSCQSC)?
  • 为每个投影添加边界
  • is_in_proj_bounds创建单独的实现以避免不必要的计算(但将与未投影引入冗余)
  • 检查并记录要添加到WCS投影边界的常数
  • 支持CRPIX + CD约定
  • 支持CRPIX + PC + CDELT约定
  • 支持CRPIX + CROTA + CDELT约定
  • 添加对LONPOLE的支持?
  • 测试并完善SIP
  • 将包含计算细节的pdf文档添加到git
  • 检查、修复错别字,丰富包含计算细节的pdf文档
  • 添加生成投影文件和绘图(如Java库中的)的功能

许可证

像大多数Rust项目一样,本项目许可为以下之一

任选其一。

贡献

除非你明确声明,否则根据Apache-2.0许可证定义,你提交的任何旨在包含在本项目中的有意贡献,都应以上述方式双许可,没有任何额外的条款或条件。

无运行时依赖