var msfnz = require('../common/msfnz');
|
var HALF_PI = Math.PI/2;
|
var EPSLN = 1.0e-10;
|
var R2D = 57.29577951308232088;
|
var adjust_lon = require('../common/adjust_lon');
|
var FORTPI = Math.PI/4;
|
var tsfnz = require('../common/tsfnz');
|
var phi2z = require('../common/phi2z');
|
exports.init = function() {
|
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
|
--------------------------------------------------*/
|
|
exports.forward = function(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);
|
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);
|
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
|
--------------------------------------------------*/
|
exports.inverse = function(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));
|
|
p.x = lon;
|
p.y = lat;
|
return p;
|
};
|
|
exports.names = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"];
|