proj4
Version:
Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.
103 lines (92 loc) • 2.57 kB
JavaScript
import msfnz from '../common/msfnz';
import adjust_lon from '../common/adjust_lon';
import tsfnz from '../common/tsfnz';
import phi2z from '../common/phi2z';
import { FORTPI, R2D, EPSLN, HALF_PI } from '../constants/values';
/**
* @typedef {Object} LocalThis
* @property {number} es
* @property {number} e
* @property {number} k
*/
/** @this {import('../defs.js').ProjectionDefinition & LocalThis} */
export function init() {
var con = this.b / this.a;
this.es = 1 - con * con;
if (!('x0' in this)) {
this.x0 = 0;
}
if (!('y0' in this)) {
this.y0 = 0;
}
this.e = Math.sqrt(this.es);
if (this.lat_ts) {
if (this.sphere) {
this.k0 = Math.cos(this.lat_ts);
} else {
this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
}
} else {
if (!this.k0) {
if (this.k) {
this.k0 = this.k;
} else {
this.k0 = 1;
}
}
}
}
/* Mercator forward equations--mapping lat,long to x,y
-------------------------------------------------- */
export function forward(p) {
var lon = p.x;
var lat = p.y;
// convert to radians
if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {
return null;
}
var x, y;
if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {
return null;
} else {
if (this.sphere) {
x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0, this.over);
y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));
} else {
var sinphi = Math.sin(lat);
var ts = tsfnz(this.e, lat, sinphi);
x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0, this.over);
y = this.y0 - this.a * this.k0 * Math.log(ts);
}
p.x = x;
p.y = y;
return p;
}
}
/* Mercator inverse equations--mapping x,y to lat/long
-------------------------------------------------- */
export function inverse(p) {
var x = p.x - this.x0;
var y = p.y - this.y0;
var lon, lat;
if (this.sphere) {
lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));
} else {
var ts = Math.exp(-y / (this.a * this.k0));
lat = phi2z(this.e, ts);
if (lat === -9999) {
return null;
}
}
lon = adjust_lon(this.long0 + x / (this.a * this.k0), this.over);
p.x = lon;
p.y = lat;
return p;
}
export var names = ['Mercator', 'Popular Visualisation Pseudo Mercator', 'Mercator_1SP', 'Mercator_Auxiliary_Sphere', 'Mercator_Variant_A', 'merc'];
export default {
init: init,
forward: forward,
inverse: inverse,
names: names
};