#geospatial #projection #gis #geography #proj

bin+lib proj4rs

Rust 对 Proj4 的适配

4 个版本

0.1.3 2024 年 5 月 18 日
0.1.2 2023 年 11 月 19 日
0.1.1 2023 年 9 月 7 日
0.1.0 2023 年 6 月 8 日

地理空间 中排名第 19

Download history 106/week @ 2024-04-25 59/week @ 2024-05-02 80/week @ 2024-05-09 304/week @ 2024-05-16 81/week @ 2024-05-23 96/week @ 2024-05-30 40/week @ 2024-06-06 80/week @ 2024-06-13 77/week @ 2024-06-20 122/week @ 2024-06-27 197/week @ 2024-07-04 234/week @ 2024-07-11 132/week @ 2024-07-18 257/week @ 2024-07-25 166/week @ 2024-08-01 822/week @ 2024-08-08

每月下载量 1,414

MIT/Apache

250KB
6K SLoC

Crates.io Documentation Demo


Rust 库,用于将地理坐标从一个坐标系转换为另一个坐标系。这是 PROJ.4 项目的纯 Rust 实现。

文档可在 docs.rsdocs.3liz.org 上找到。

功能和限制

  • Proj4rs 的目标是提供与 proj4js 库 相同的功能。
  • 此端口实现了 PROJ.4 API,这意味着目前没有 3D/4D/正射变换。
  • Proj4rs 的目标不是替代 PROJ,而是成为一个轻量级的从 CRS 到 CRS 的变换实现,可以在 Rust 和 WASM 环境中使用。
  • 此包不提供对 WKT 的支持。相反,有一个专门的包用于将 WKT 字符串转换为 proj 字符串。
  • 它旨在与 wasm32-unknown-unknown 目标兼容。
  • 不需要安装外部 C 库,如 libprojsqlite3

Rust 中的基本用法

使用 proj 字符串定义坐标系,并使用 transform 函数。您可以从 EPSG.io 轻松获取任何坐标系的投影字符串。

注意: Proj4rs 使用 弧度 作为自然角单位(与原始 proj 库相同)

示例

use proj4rs;
use proj4rs::proj::Proj;

// EPSG:5174 - Example
let from = Proj::from_proj_string(concat!(
    "+proj=tmerc +lat_0=38 +lon_0=127.002890277778",
    " +k=1 +x_0=200000 +y_0=500000 +ellps=bessel",
    " +towgs84=-145.907,505.034,685.756,-1.162,2.347,1.592,6.342",
    " +units=m +no_defs +type=crs"
))
.unwrap();

// EPSG:4326 - WGS84, known to us as basic longitude and latitude.
let to = Proj::from_proj_string(concat!(
    "+proj=longlat +ellps=WGS84",
    " +datum=WGS84 +no_defs"
))
.unwrap();

let mut point_3d = (198236.3200000003, 453407.8560000006, 0.0);
proj4rs::transform::transform(&from, &to, &mut point_3d).unwrap();

// Note that WGS84 output from this library is in radians, not degrees.
point_3d.0 = point_3d.0.to_degrees();
point_3d.1 = point_3d.1.to_degrees();

// Output in longitude, latitude, and height.
println!("{} {}",point_3d.0, point_3d.1); // 126.98069676435814, 37.58308534678718

WKT 支持

如果您需要完整的 WKT 支持,请依赖 proj,它提供了对标准的出色实现。

如果您想在 WASM 中使用 WKT 支持,请查看以下链接:

网格平移支持

Nadgrid 支持仍然是实验性的。目前,仅支持 Ntv2 多网格用于本地构建和 WASM。

JavaScript API

当编译为WASM时,库公开了与proj4js非常相似的JavaScript API。一个薄的JavaScript层提供了对proj4js的完全兼容性,因此可以用作proj4js的替代品。

示例

let from = new Proj.Projection("+proj=latlong +ellps=GRS80");
let to = new Proj.Projection("+proj=etmerc +ellps=GRS80");
let point = new Proj.Point(2.0, 1.0, 0.0);

// Point is transformed in place
Proj.transform(from, to, point);

编译为WASM

安装wasm-pack

wasm-pack build --target web --no-default-features

如果您已安装cargo-make,请使用以下命令

cargo make wasm

运行WASM示例

存在一个index.html文件,用于在浏览器中测试WASM模块。

出于安全原因,您需要从服务器运行它。您可以使用以下命令启动Python服务器

python3 -m http.server

服务器将自动在当前目录下提供index.html文件。

为npm构建

cargo make wasm_bundle

这将创建一个位于pkg-bundler的npm打包包

依赖关系

~0.3–4.5MB
~71K SLoC