14个版本 (9个重大变更)
0.10.3 | 2024年2月29日 |
---|---|
0.10.1 | 2023年11月28日 |
0.9.0 | 2023年7月20日 |
#29 in 地理空间
每月 943 次下载
2.5MB
11K SLoC
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的互操作性
许可证
与数字地球查看器中的许多其他组件一样,Miniproj 在 EUPL v1.2 许可下发布,这是一种与GPLv2类似和兼容的 copyleft 许可证,并提供23种语言版本。此许可证不适用于投影本身。数据库文件是从EPSG大地测量参数注册表中提取的,并在 其自己的使用条款 下重新分发。