# proj-turbo

> Turbo-charge your Re-projection Functions

Latest version **0.0.1** (published 2023-01-21) · CC0-1.0 license · 0 weekly downloads

## Install

```sh
npm install proj-turbo
pnpm add proj-turbo
yarn add proj-turbo
bun add proj-turbo
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.0.1 |
| Published | 2023-01-21 |
| First published | 2023-01-21 |
| Weekly downloads | 0 |
| License | CC0-1.0 |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 15.7 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 8 |
| Author | Daniel J. Dufour |
| Maintainers | danieljdufour |
| Keywords | coordinates, geospatial, gis, proj, proj4, proj4js, raster, reprojection |

## Links

- npm: https://www.npmjs.com/package/proj-turbo
- Repository: https://github.com/DanielJDufour/proj-turbo
- Homepage: https://github.com/DanielJDufour/proj-turbo#readme
- Issues: https://github.com/DanielJDufour/proj-turbo/issues
- npm.io page: https://npm.io/package/proj-turbo

## Recent versions

- 0.0.1 (latest) — 2023-01-21

## README

:warning: this is new and highly experimental and has only been tested on 3 projections so far.  I suggest testing it on your data before using it.


# proj-turbo
:fire: Turbo-charge your Re-projection Functions

## features
- reproject from [Web Mercator](https://en.wikipedia.org/wiki/Web_Mercator_projection) to EPSG:4326 (Latitude/Longitude) ~3x faster
- reproject from [UTM](https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system) to EPSG:4326 ~5x faster
- zero dependencies
- works great with [proj4js](https://www.npmjs.com/package/proj4)
- isomorphic (works in the browser and in NodeJS)

## algorithm
This basically checks if reprojection within the given bbox can be modeled by the following function without exceeding the error threshold.
```js
([x, y]) => ([
  x_origin + x_scale * (x - xmin), // x_origin is the smallest possible x output value, xmin is from the given bbox
  y_origin + y_scale * (y - ymin) // y_origin is the smallest possible y output value , ymin is from the given bbox
]);
```

### usage
```js
import proj4 from "proj4";
import { turbocharge } from "proj-turbo";

// convert from EPSG:4326 to EPSG:3857
const reproject = proj4("EPSG:4326", "EPSG:3857");

const reprojectFaster = turbocharge(reproject, {
  // container including points to reproject
  // in the srs that you are reprojecting from
  bbox,

  debug_level = 0,

  // default is false
  // set to true to return undefined instead of throwing an error
  // when proj-turbo can't figure out a faster reprojection function
  quiet = false,

  // the reprojection function we want to try to replace
  // with a faster alternative
  reproject,
  
  // maximum allowable error along the x and y axis
  // in the projection we are reprojecting to.
  // when reprojecting rasters,
  // this will often be the pixel size
  threshold: [x_threshold, y_threshold]
});
```

### thanks
Thanks to [Jim Phillips](https://github.com/jcphill) for inspiring me with the awesome performance optimizations he contributed to [GeoRasterLayer](https://github.com/GeoTIFF/georaster-layer-for-leaflet).

---
_Source: https://npm.io/package/proj-turbo · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
