136 lines
4.0 KiB
JavaScript
136 lines
4.0 KiB
JavaScript
import e0fn from '../common/e0fn';
|
|
import e1fn from '../common/e1fn';
|
|
import e2fn from '../common/e2fn';
|
|
import e3fn from '../common/e3fn';
|
|
import adjust_lon from '../common/adjust_lon';
|
|
import adjust_lat from '../common/adjust_lat';
|
|
import mlfn from '../common/mlfn';
|
|
import {EPSLN} from '../constants/values';
|
|
|
|
import gN from '../common/gN';
|
|
var MAX_ITER = 20;
|
|
|
|
export function init() {
|
|
/* Place parameters in static storage for common use
|
|
-------------------------------------------------*/
|
|
this.temp = this.b / this.a;
|
|
this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles
|
|
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.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas
|
|
}
|
|
|
|
/* Polyconic forward equations--mapping lat,long to x,y
|
|
---------------------------------------------------*/
|
|
export function forward(p) {
|
|
var lon = p.x;
|
|
var lat = p.y;
|
|
var x, y, el;
|
|
var dlon = adjust_lon(lon - this.long0);
|
|
el = dlon * Math.sin(lat);
|
|
if (this.sphere) {
|
|
if (Math.abs(lat) <= EPSLN) {
|
|
x = this.a * dlon;
|
|
y = -1 * this.a * this.lat0;
|
|
}
|
|
else {
|
|
x = this.a * Math.sin(el) / Math.tan(lat);
|
|
y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));
|
|
}
|
|
}
|
|
else {
|
|
if (Math.abs(lat) <= EPSLN) {
|
|
x = this.a * dlon;
|
|
y = -1 * this.ml0;
|
|
}
|
|
else {
|
|
var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);
|
|
x = nl * Math.sin(el);
|
|
y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));
|
|
}
|
|
|
|
}
|
|
p.x = x + this.x0;
|
|
p.y = y + this.y0;
|
|
return p;
|
|
}
|
|
|
|
/* Inverse equations
|
|
-----------------*/
|
|
export function inverse(p) {
|
|
var lon, lat, x, y, i;
|
|
var al, bl;
|
|
var phi, dphi;
|
|
x = p.x - this.x0;
|
|
y = p.y - this.y0;
|
|
|
|
if (this.sphere) {
|
|
if (Math.abs(y + this.a * this.lat0) <= EPSLN) {
|
|
lon = adjust_lon(x / this.a + this.long0);
|
|
lat = 0;
|
|
}
|
|
else {
|
|
al = this.lat0 + y / this.a;
|
|
bl = x * x / this.a / this.a + al * al;
|
|
phi = al;
|
|
var tanphi;
|
|
for (i = MAX_ITER; i; --i) {
|
|
tanphi = Math.tan(phi);
|
|
dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);
|
|
phi += dphi;
|
|
if (Math.abs(dphi) <= EPSLN) {
|
|
lat = phi;
|
|
break;
|
|
}
|
|
}
|
|
lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat));
|
|
}
|
|
}
|
|
else {
|
|
if (Math.abs(y + this.ml0) <= EPSLN) {
|
|
lat = 0;
|
|
lon = adjust_lon(this.long0 + x / this.a);
|
|
}
|
|
else {
|
|
|
|
al = (this.ml0 + y) / this.a;
|
|
bl = x * x / this.a / this.a + al * al;
|
|
phi = al;
|
|
var cl, mln, mlnp, ma;
|
|
var con;
|
|
for (i = MAX_ITER; i; --i) {
|
|
con = this.e * Math.sin(phi);
|
|
cl = Math.sqrt(1 - con * con) * Math.tan(phi);
|
|
mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);
|
|
mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);
|
|
ma = mln / this.a;
|
|
dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);
|
|
phi -= dphi;
|
|
if (Math.abs(dphi) <= EPSLN) {
|
|
lat = phi;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0);
|
|
cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);
|
|
lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));
|
|
}
|
|
}
|
|
|
|
p.x = lon;
|
|
p.y = lat;
|
|
return p;
|
|
}
|
|
|
|
export var names = ["Polyconic", "poly"];
|
|
export default {
|
|
init: init,
|
|
forward: forward,
|
|
inverse: inverse,
|
|
names: names
|
|
};
|