gcoord
Version:
geographic coordinate library
37 lines (30 loc) • 1.11 kB
text/typescript
import { Position } from '../geojson';
// https://github.com/Turfjs/turf/blob/master/packages/turf-projection/index.ts
const R2D = 180 / Math.PI;
const D2R = Math.PI / 180;
const A = 6378137.0;
const MAXEXTENT = 20037508.342789244;
export function EPSG3857ToWGS84(xy: Position): Position {
return [
(xy[0] * R2D) / A,
(Math.PI * 0.5 - 2.0 * Math.atan(Math.exp(-xy[1] / A))) * R2D,
];
}
export function WGS84ToEPSG3857(lonLat: Position): Position {
// compensate longitudes passing the 180th meridian
// from https://github.com/proj4js/proj4js/blob/master/lib/common/adjust_lon.js
const adjusted =
Math.abs(lonLat[0]) <= 180
? lonLat[0]
: lonLat[0] - (lonLat[0] < 0 ? -1 : 1) * 360;
const xy: Position = [
A * adjusted * D2R,
A * Math.log(Math.tan(Math.PI * 0.25 + 0.5 * lonLat[1] * D2R)),
];
// if xy value is beyond maxextent (e.g. poles), return maxextent
if (xy[0] > MAXEXTENT) xy[0] = MAXEXTENT;
if (xy[0] < -MAXEXTENT) xy[0] = -MAXEXTENT;
if (xy[1] > MAXEXTENT) xy[1] = MAXEXTENT;
if (xy[1] < -MAXEXTENT) xy[1] = -MAXEXTENT;
return xy;
}