118 lines
3.1 KiB
JavaScript
118 lines
3.1 KiB
JavaScript
import e0fn from '../common/e0fn';
|
|
import e1fn from '../common/e1fn';
|
|
import e2fn from '../common/e2fn';
|
|
import e3fn from '../common/e3fn';
|
|
import msfnz from '../common/msfnz';
|
|
import mlfn from '../common/mlfn';
|
|
import adjust_lon from '../common/adjust_lon';
|
|
import adjust_lat from '../common/adjust_lat';
|
|
import imlfn from '../common/imlfn';
|
|
import {EPSLN} from '../constants/values';
|
|
|
|
export function init() {
|
|
|
|
/* Place parameters in static storage for common use
|
|
-------------------------------------------------*/
|
|
// Standard Parallels cannot be equal and on opposite sides of the equator
|
|
if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
|
|
return;
|
|
}
|
|
this.lat2 = this.lat2 || this.lat1;
|
|
this.temp = this.b / this.a;
|
|
this.es = 1 - Math.pow(this.temp, 2);
|
|
this.e = Math.sqrt(this.es);
|
|
this.e0 = e0fn(this.es);
|
|
this.e1 = e1fn(this.es);
|
|
this.e2 = e2fn(this.es);
|
|
this.e3 = e3fn(this.es);
|
|
|
|
this.sinphi = Math.sin(this.lat1);
|
|
this.cosphi = Math.cos(this.lat1);
|
|
|
|
this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);
|
|
this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);
|
|
|
|
if (Math.abs(this.lat1 - this.lat2) < EPSLN) {
|
|
this.ns = this.sinphi;
|
|
}
|
|
else {
|
|
this.sinphi = Math.sin(this.lat2);
|
|
this.cosphi = Math.cos(this.lat2);
|
|
this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);
|
|
this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);
|
|
this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);
|
|
}
|
|
this.g = this.ml1 + this.ms1 / this.ns;
|
|
this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
|
|
this.rh = this.a * (this.g - this.ml0);
|
|
}
|
|
|
|
/* Equidistant Conic forward equations--mapping lat,long to x,y
|
|
-----------------------------------------------------------*/
|
|
export function forward(p) {
|
|
var lon = p.x;
|
|
var lat = p.y;
|
|
var rh1;
|
|
|
|
/* Forward equations
|
|
-----------------*/
|
|
if (this.sphere) {
|
|
rh1 = this.a * (this.g - lat);
|
|
}
|
|
else {
|
|
var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);
|
|
rh1 = this.a * (this.g - ml);
|
|
}
|
|
var theta = this.ns * adjust_lon(lon - this.long0);
|
|
var x = this.x0 + rh1 * Math.sin(theta);
|
|
var y = this.y0 + this.rh - rh1 * Math.cos(theta);
|
|
p.x = x;
|
|
p.y = y;
|
|
return p;
|
|
}
|
|
|
|
/* Inverse equations
|
|
-----------------*/
|
|
export function inverse(p) {
|
|
p.x -= this.x0;
|
|
p.y = this.rh - p.y + this.y0;
|
|
var con, rh1, lat, lon;
|
|
if (this.ns >= 0) {
|
|
rh1 = Math.sqrt(p.x * p.x + p.y * p.y);
|
|
con = 1;
|
|
}
|
|
else {
|
|
rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);
|
|
con = -1;
|
|
}
|
|
var theta = 0;
|
|
if (rh1 !== 0) {
|
|
theta = Math.atan2(con * p.x, con * p.y);
|
|
}
|
|
|
|
if (this.sphere) {
|
|
lon = adjust_lon(this.long0 + theta / this.ns);
|
|
lat = adjust_lat(this.g - rh1 / this.a);
|
|
p.x = lon;
|
|
p.y = lat;
|
|
return p;
|
|
}
|
|
else {
|
|
var ml = this.g - rh1 / this.a;
|
|
lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);
|
|
lon = adjust_lon(this.long0 + theta / this.ns);
|
|
p.x = lon;
|
|
p.y = lat;
|
|
return p;
|
|
}
|
|
|
|
}
|
|
|
|
export var names = ["Equidistant_Conic", "eqdc"];
|
|
export default {
|
|
init: init,
|
|
forward: forward,
|
|
inverse: inverse,
|
|
names: names
|
|
};
|