Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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

Awesome Lists containing this project

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