109 lines
2.9 KiB
JavaScript
109 lines
2.9 KiB
JavaScript
import mlfn from '../common/mlfn';
|
|
import e0fn from '../common/e0fn';
|
|
import e1fn from '../common/e1fn';
|
|
import e2fn from '../common/e2fn';
|
|
import e3fn from '../common/e3fn';
|
|
import gN from '../common/gN';
|
|
import adjust_lon from '../common/adjust_lon';
|
|
import adjust_lat from '../common/adjust_lat';
|
|
import imlfn from '../common/imlfn';
|
|
import {HALF_PI, EPSLN} from '../constants/values';
|
|
|
|
export function init() {
|
|
if (!this.sphere) {
|
|
this.e0 = e0fn(this.es);
|
|
this.e1 = e1fn(this.es);
|
|
this.e2 = e2fn(this.es);
|
|
this.e3 = e3fn(this.es);
|
|
this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);
|
|
}
|
|
}
|
|
|
|
/* Cassini forward equations--mapping lat,long to x,y
|
|
-----------------------------------------------------------------------*/
|
|
export function forward(p) {
|
|
|
|
/* Forward equations
|
|
-----------------*/
|
|
var x, y;
|
|
var lam = p.x;
|
|
var phi = p.y;
|
|
lam = adjust_lon(lam - this.long0);
|
|
|
|
if (this.sphere) {
|
|
x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));
|
|
y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);
|
|
}
|
|
else {
|
|
//ellipsoid
|
|
var sinphi = Math.sin(phi);
|
|
var cosphi = Math.cos(phi);
|
|
var nl = gN(this.a, this.e, sinphi);
|
|
var tl = Math.tan(phi) * Math.tan(phi);
|
|
var al = lam * Math.cos(phi);
|
|
var asq = al * al;
|
|
var cl = this.es * cosphi * cosphi / (1 - this.es);
|
|
var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
|
|
|
|
x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));
|
|
y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);
|
|
|
|
|
|
}
|
|
|
|
p.x = x + this.x0;
|
|
p.y = y + this.y0;
|
|
return p;
|
|
}
|
|
|
|
/* Inverse equations
|
|
-----------------*/
|
|
export function inverse(p) {
|
|
p.x -= this.x0;
|
|
p.y -= this.y0;
|
|
var x = p.x / this.a;
|
|
var y = p.y / this.a;
|
|
var phi, lam;
|
|
|
|
if (this.sphere) {
|
|
var dd = y + this.lat0;
|
|
phi = Math.asin(Math.sin(dd) * Math.cos(x));
|
|
lam = Math.atan2(Math.tan(x), Math.cos(dd));
|
|
}
|
|
else {
|
|
/* ellipsoid */
|
|
var ml1 = this.ml0 / this.a + y;
|
|
var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);
|
|
if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {
|
|
p.x = this.long0;
|
|
p.y = HALF_PI;
|
|
if (y < 0) {
|
|
p.y *= -1;
|
|
}
|
|
return p;
|
|
}
|
|
var nl1 = gN(this.a, this.e, Math.sin(phi1));
|
|
|
|
var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);
|
|
var tl1 = Math.pow(Math.tan(phi1), 2);
|
|
var dl = x * this.a / nl1;
|
|
var dsq = dl * dl;
|
|
phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);
|
|
lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);
|
|
|
|
}
|
|
|
|
p.x = adjust_lon(lam + this.long0);
|
|
p.y = adjust_lat(phi);
|
|
return p;
|
|
|
|
}
|
|
|
|
export var names = ["Cassini", "Cassini_Soldner", "cass"];
|
|
export default {
|
|
init: init,
|
|
forward: forward,
|
|
inverse: inverse,
|
|
names: names
|
|
};
|