#projection #geodesy #mapping #epsg #compile-time #geoprocessing

miniproj

本库实现了一般和特定的地理测量操作,如地理投影

14个版本 (9个重大变更)

0.10.3 2024年2月29日
0.10.1 2023年11月28日
0.9.0 2023年7月20日

#29 in 地理空间

Download history 123/week @ 2024-03-30 39/week @ 2024-04-06 64/week @ 2024-04-13 80/week @ 2024-04-20 70/week @ 2024-04-27 77/week @ 2024-05-04 45/week @ 2024-05-11 39/week @ 2024-05-18 38/week @ 2024-05-25 107/week @ 2024-06-01 91/week @ 2024-06-08 107/week @ 2024-06-15 251/week @ 2024-06-22 325/week @ 2024-06-29 224/week @ 2024-07-06 121/week @ 2024-07-13

每月 943 次下载

自定义许可

2.5MB
11K SLoC

SQL 9K SLoC Rust 2K SLoC // 0.0% comments

Miniproj

本库实现了在投影坐标系和其底层地理坐标系之间的地理坐标投影,适用于由欧洲石油勘探集团地理测量定义的投影坐标参考系统。它最初是在GEOMAR赫尔姆霍兹海洋研究中心作为数字地球项目的一部分开发的,并继续为数字地球查看器提供重投影功能。

投影根据指南实现,所有“动态均匀”的局部变量都在编译时计算。然后,投影存储在静态的PHFMap中,以便在运行时快速访问。代码生成被分离到miniproj-epsg-registry库中,而操作本身则实现于miniproj-ops

Miniproj与Proj无关或派生自Proj。

范围

投影

EPSG代码 操作方法名称 覆盖的投影坐标系数量
9807 横墨卡托 3591
9802 兰伯特圆锥等角(2SP) 949
9801 兰伯特圆锥等角(1SP) 215
9822 阿尔伯斯等面积 36
9809 斜轴测投影 20
9820 兰伯特方位等面积 14
9810 极地笛卡尔(变体A) 10
1024 流行的视觉伪墨卡托 1

转换

EPSG代码 操作方法名称
9602 地理/地心转换

变换

EPSG代码 操作方法名称
开发中

使用示例

// Get the WGS84 UTM zone 32N projection
use miniproj::{
    get_projection,
    Projection,
    get_ellipsoid_code,
    get_ellipsoid,
    Ellipsoid
};
let projection = get_projection(32632)
    .expect("Projection not implemented.");

// Coordinates of the office where this crate was written in UTM:
let (easting, northing) = (576935.86f64, 6020593.46f64);

// To get the latitude and longitude, use the Projection::to_deg
// method. Note that the order of the returned tuple is not 
// alphabetical, but instead follows the axis order (X for
// Longitude, Y for Latitude).
let (lon, lat) = projection.projected_to_deg(easting, northing);

assert!((lon - 10.183034).abs() < 0.000001);
assert!((lat - 54.327389).abs() < 0.000001);

// To convert this geographic position to a geocentric position
// (a position in euclidian space), get the underlying ellipsoid:

let ellipsoid = get_ellipsoid_code(32632)
    .and_then(|c| get_ellipsoid(c))
    .expect("No associated ellipsoid.");

// Do the actual conversion. Axis order applies as explained above.
// Height as per GPS altitude.
let (x, y, z) = ellipsoid.deg_to_geocentric(lon, lat, 53.7);

assert!((x - 3668985.10).abs() < 0.1);
assert!((y - 659033.08).abs() < 0.1);
assert!((z - 5158122.64).abs() < 0.1);

限制

Miniproj仍在开发中,缺少一些重要功能。如果您正在寻找一个经过精炼、经过验证的库,请查看PROJ

变更日志

0.10.0

  • 公开构建给定投影方法代码的投影。这可以用于为不属于EPSG注册表的参数集或椭球体创建投影实例。

0.9.0

  • 移除了依赖项 rusqlite
  • miniproj 现在可以使用稳定的 rustc (1.71.0) 进行构建
  • 不再将“身份”投影作为特例处理,现在允许更多地理坐标系被视为投影坐标系(606个定义好的CRS)
  • 目前,过滤掉不使用格林尼治子午线的CRS

0.8.0

  • 添加了Albers等面积投影(36个定义好的CRS)

0.7.0

  • 添加了斜轴墨卡托投影(20个定义好的CRS)

0.6.0

  • 暴露椭球体
  • 添加了通过EPSG代码访问 Ellipsoid 的接口
  • 添加了通过EPSG代码查找投影背后的椭球体的接口

0.5.0

  • 添加了Lambert圆锥等角投影(1SP)(233个定义好的CRS)
  • 澄清了一些术语

0.4.0

  • 添加了流行的视觉伪墨卡托投影(1个定义好的CRS)。这种方法可能是最受欢迎的,因为它被Google、OpenStreetMap等使用。

0.3.0

  • 添加了Lambert圆锥等角投影(2SP)(950个定义好的CRS)
  • 修复了极地正射投影A中的某些重大错误

0.2.0

  • 添加了极地正射投影方法A(10个定义好的CRS)

0.1.1

  • 初始版本

路线图

1.0.0之前

  • 实现转换
  • 实现非标准子午线的精细处理
  • 为操作方法添加功能门控

长期目标

  • 实现所有缺失的投影
  • 实现WKT及其类似格式的解析
  • 制作 miniproj 的 no-std 子集
  • 添加与如 geo 等crate的互操作性

许可证

与数字地球查看器中的许多其他组件一样,MiniprojEUPL v1.2 许可下发布,这是一种与GPLv2类似和兼容的 copyleft 许可证,并提供23种语言版本。此许可证不适用于投影本身。数据库文件是从EPSG大地测量参数注册表中提取的,并在 其自己的使用条款 下重新分发。

依赖项