Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/3liz/proj4rs
Rust adaptation of Proj4
https://github.com/3liz/proj4rs
Last synced: 3 months ago
JSON representation
Rust adaptation of Proj4
- Host: GitHub
- URL: https://github.com/3liz/proj4rs
- Owner: 3liz
- Created: 2023-06-08T14:18:00.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-05-18T15:19:04.000Z (6 months ago)
- Last Synced: 2024-07-01T19:34:36.049Z (4 months ago)
- Language: Rust
- Size: 328 KB
- Stars: 34
- Watchers: 8
- Forks: 8
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
- awesome-georust - Proj4rs - Rust adaptation of Proj4 (Watchlist)
README
[![Crates.io](https://img.shields.io/crates/d/proj4rs)](https://crates.io/crates/proj4rs)
[![Documentation](https://img.shields.io/badge/Documentation-Published-green)](https://docs.rs/proj4rs/latest/proj4rs/)
[![Demo](https://img.shields.io/badge/Demo-Published-green)](https://docs.3liz.org/proj4rs/)---
Rust library for transforming geographic point coordinates
from one coordinate system to another.
This is a pure Rust implementation
of the [PROJ.4 project](https://proj.org/en/9.2/faq.html#what-happened-to-proj-4).The documentation is available on [docs.rs](https://docs.rs/proj4rs/) and the demo on [docs.3liz.org](https://docs.3liz.org/proj4rs/).
# Features and Limitations
- The aim of Proj4rs is to provide the same functionality as the
[proj4js library](https://github.com/proj4js/proj4js).
- This port implements the PROJ.4 API,
which means there's no 3D/4D/orthometric transformation ATM.
- The goal of Proj4rs is not to be a replacement of PROJ,
but instead being a lightweight implementation of transformations
from CRS to CRS that could be used in Rust and WASM environments.
- This crate does not provide support for WKT. Instead,
there is a dedicated crate for transforming WKT strings to proj string.
- It aims to be WASM compatible for the `wasm32-unknown-unknown` target.
- No installation of external C libraries such as `libproj` or `sqlite3` is needed.## Basic usage in Rust
Define the coordinate system with proj strings and use the `transform` function.
You can easily get the projection string of any coordinate system
from [EPSG.io](https://epsg.io/).**Note**: Proj4rs use *radians* as natural angular unit (as does the original proj library)
Example:
```rust
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 support
If you need full support for WKT, please rely on `proj` which provides
a great implementation of the standards.If you want WKT support in WASM, please have a look at:
- https://github.com/3liz/proj4wkt-rs
- https://github.com/frewsxcv/crs-definitions## Grid shift supports
Nadgrid support is still experimental.
Currently, only Ntv2 multi grids are supported for native build and WASM.## JavaScript API
When compiled for WASM, the library exposes JavaScript API
that is very similar to that of proj4js.
A thin JavaScript layer provides full compatibility with proj4js
and thus can be used as a proj4js replacement.Example:
```javascript
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);
```## Compiling for WASM
Install [wasm-pack](https://rustwasm.github.io/wasm-pack/book/)
```bash
wasm-pack build --target web --no-default-features
```Or if you have installed [cargo-make](https://sagiegurari.github.io/cargo-make/), use the following
command:```bash
cargo make wasm
```### Running the WASM example
There is a [`index.html`] file for testing the WASM module in a navigator.
For security reasons, you need to run it from a server.
You can start a Python server with the following command:```bash
python3 -m http.server
```
The server will automatically serve the `index.html` file in the current directory.## Build for npm
```
cargo make wasm_bundle
```This will create a npm bundler package in pkg-bundler