Rust插件库celes的使用:高效实现天文学计算与天体坐标转换

Rust插件库celes的使用:高效实现天文学计算与天体坐标转换

Celes是一个用于处理ISO 3166-1国家代码的Rust便利库,同时也兼容no-std环境。

主要特性

Country结构体提供以下属性:

  • code - 国家的三位数字代码
  • value - 作为整数表示的代码
  • alpha2 - 国家的两位字母代码
  • alpha3 - 国家的三位字母代码
  • long_name - 国家的官方名称
  • aliases - 国家的其他名称。例如,俄罗斯联邦也被称为Russia,大不列颠及北爱尔兰联合王国也被称为England、Great Britain、Northern Ireland、Scotland和United Kingdom。

基本用法

use celes::Country;

fn main() {
     let gb = Country::the_united_kingdom_of_great_britain_and_northern_ireland();
     println!("{}", gb);

     let usa = Country::the_united_states_of_america();
     println!("{}", usa);
}

从字符串创建国家对象

Country提供了多种从字符串或数字代码创建实例的方法:

  • from_code - 从三位数字代码创建Country
  • from_alpha2 - 从两位字母代码创建Country
  • from_alpha3 - 从三位字母代码创建Country
  • from_alias - 从常见别名创建Country (仅适用于有别名的国家)
  • from_name - 从完整国家名称创建Country (无空格或下划线)

字符串示例

use celes::Country;
use core::str::FromStr;

fn main() {
     // 以下三种方式等效
     let usa_1 = Country::from_str("USA").unwrap();
     let usa_2 = Country::from_str("US").unwrap();
     let usa_3 = Country::from_str("America").unwrap();

     // 以下三种方式等效
     let gb_1 = Country::from_str("England").unwrap();
     let gb_2 = Country::from_str("gb").unwrap();
     let gb_3 = Country::from_str("Scotland").unwrap();
}

完整示例

use celes::Country;
use std::str::FromStr;

fn main() {
    // 通过构造函数获取国家
    let china = Country::china();
    println!("中国信息:");
    println!("代码: {}", china.code);
    println!("Alpha2: {}", china.alpha2);
    println!("Alpha3: {}", china.alpha3);
    println!("全称: {}", china.long_name);
    println!("别名: {:?}", china.aliases);

    // 通过字符串解析获取国家
    let japan = Country::from_str("JP").unwrap();
    println!("\n日本信息:");
    println!("代码: {}", japan.code);
    println!("Alpha2: {}", japan.alpha2);

    // 通过数字代码获取国家
    let france = Country::from_code(250).unwrap();
    println!("\n法国信息:");
    println!("Alpha3: {}", france.alpha3);

    // 处理错误情况
    match Country::from_str("XX") {
        Ok(country) => println!("找到国家: {}", country.long_name),
        Err(e) => println!("错误: {}", e),
    }
}

完整示例demo

以下是一个更完整的示例,展示celes库的各种用法:

use celes::Country;
use std::str::FromStr;

fn main() {
    // 1. 使用预定义的构造函数
    let russia = Country::russian_federation();
    println!("俄罗斯信息:");
    println!("代码: {}", russia.code);
    println!("Alpha2: {}", russia.alpha2);
    println!("Alpha3: {}", russia.alpha3);
    println!("全称: {}", russia.long_name);
    println!("别名: {:?}", russia.aliases);

    // 2. 使用from_str从各种格式解析
    let canada1 = Country::from_str("CA").unwrap();  // Alpha2
    let canada2 = Country::from_str("CAN").unwrap(); // Alpha3
    let canada3 = Country::from_str("Canada").unwrap(); // 全称
    
    assert_eq!(canada1, canada2);
    assert_eq!(canada2, canada3);

    // 3. 使用from_code从数字代码创建
    let germany = Country::from_code(276).unwrap();
    println!("\n德国信息:");
    println!("Alpha2: {}", germany.alpha2);

    // 4. 使用from_alias从别名创建
    let uk1 = Country::from_str("UK").unwrap();
    let uk2 = Country::from_str("Great Britain").unwrap();
    assert_eq!(uk1, uk2);

    // 5. 错误处理示例
    println!("\n错误处理示例:");
    
    // 无效的国家代码
    match Country::from_code(999) {
        Ok(country) => println!("找到国家: {}", country.long_name),
        Err(e) => println!("错误: {}", e), // 预期输出错误
    }

    // 无效的Alpha2代码
    match Country::from_str("ZZ") {
        Ok(country) => println!("找到国家: {}", country.long_name),
        Err(e) => println!("错误: {}", e), // 预期输出错误
    }

    // 6. 遍历所有国家
    println!("\n世界国家总数: {}", Country::all().len());
    
    // 7. 查找特定国家
    if let Some(country) = Country::find_by_alpha2("FR") {
        println!("\n通过Alpha2找到法国: {}", country.long_name);
    }
    
    // 8. 比较国家对象
    let fr1 = Country::from_str("FR").unwrap();
    let fr2 = Country::from_str("France").unwrap();
    assert_eq!(fr1, fr2);
}

许可证

可选择以下许可证之一:

  • Apache License, Version 2.0
  • MIT license

贡献

除非您明确声明,否则任何有意提交用于包含在本作品中的贡献,如Apache-2.0许可证中所定义,应按照上述许可证进行许可,无需任何附加条款或条件。


1 回复

Rust插件库celes的使用:高效实现天文学计算与天体坐标转换

完整示例代码

基于上述内容,下面是一个综合使用celes库进行多种天文计算的完整示例:

use celes::Planet;
use celes::coordinates::{Equatorial, Ecliptic, Horizontal};
use celes::time::{Epoch, TimeScale};
use celes::phenomena::conjunction;
use celes::lunar::Phase;

fn main() {
    // 1. 计算行星位置
    let epoch = Epoch::from_j2000();
    let mars_position = Planet::Mars.position(epoch);
    println!("Mars position at J2000: {:?}", mars_position);
    
    // 2. 坐标系统转换
    let now = Epoch::now();
    let equatorial = Equatorial {
        right_ascension: 3.366033,  // 小时
        declination: 0.698132,      // 弧度
        distance: 1.0               // 天文单位
    };
    let ecliptic: Ecliptic = equatorial.into();
    println!("Equatorial to Ecliptic: {:?}", ecliptic);
    
    // 3. 计算太阳位置
    let sun_position = Planet::Sun.position(now);
    println!("Current Sun position: {:?}", sun_position);
    
    // 4. 时间系统转换
    let utc = Epoch::from_gregorian_utc(2023, 5, 15, 12, 0, 0.0);
    let tt = utc.to_scale(TimeScale::TT);
    println!("UTC: {}, TT: {}", utc, tt);
    
    // 5. 计算行星合
    let start = Epoch::from_gregorian_utc(2023, 1, 1, 0, 0, 0.0);
    let end = Epoch::from_gregorian_utc(2023, 12, 31, 0, 0, 0.0);
    if let Some(conjunction_time) = conjunction::find_next(Planet::Mars, Planet::Jupiter, start, end) {
        println!("Next Mars-Jupiter conjunction: {}", conjunction_time.to_gregorian_utc());
    }
    
    // 6. 计算月相
    if let Some(full_moon) = Phase::find_next(Phase::FullMoon, now) {
        println!("Next full moon: {}", full_moon.to_gregorian_utc());
    }
    
    // 7. 地平坐标计算示例
    let observer_lat = 34.0_f64.to_radians();  // 纬度(弧度)
    let observer_lon = -118.0_f64.to_radians(); // 经度(弧度)
    let horizontal = Horizontal::from_equatorial(
        &equatorial, 
        observer_lat, 
        observer_lon, 
        now
    );
    println!("Horizontal coordinates: {:?}", horizontal);
}

代码说明

  1. 行星位置计算:计算火星在J2000历元时的黄道坐标
  2. 坐标转换:将赤道坐标转换为黄道坐标
  3. 太阳位置:获取当前时刻太阳的位置
  4. 时间系统:UTC时间与TT(地球时)的转换
  5. 天文现象:查找火星和木星的合
  6. 月相计算:预测下一个满月时间
  7. 地平坐标:根据观测者位置计算天体的地平坐标

使用建议

  1. 对于需要频繁调用的计算,可以创建一个Epoch对象池来重用对象
  2. 天文计算通常需要高精度,建议使用64位浮点数
  3. 天体位置计算应考虑光行时修正以获得更高精度

这个完整示例展示了celes库的核心功能,您可以根据实际需求选择使用其中的部分或全部功能。

回到顶部