53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
|
import srat from '../common/srat';
|
||
|
var MAX_ITER = 20;
|
||
|
import {HALF_PI, FORTPI} from '../constants/values';
|
||
|
|
||
|
export function init() {
|
||
|
var sphi = Math.sin(this.lat0);
|
||
|
var cphi = Math.cos(this.lat0);
|
||
|
cphi *= cphi;
|
||
|
this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);
|
||
|
this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));
|
||
|
this.phic0 = Math.asin(sphi / this.C);
|
||
|
this.ratexp = 0.5 * this.C * this.e;
|
||
|
this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));
|
||
|
}
|
||
|
|
||
|
export function forward(p) {
|
||
|
var lon = p.x;
|
||
|
var lat = p.y;
|
||
|
|
||
|
p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;
|
||
|
p.x = this.C * lon;
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
export function inverse(p) {
|
||
|
var DEL_TOL = 1e-14;
|
||
|
var lon = p.x / this.C;
|
||
|
var lat = p.y;
|
||
|
var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);
|
||
|
for (var i = MAX_ITER; i > 0; --i) {
|
||
|
lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI;
|
||
|
if (Math.abs(lat - p.y) < DEL_TOL) {
|
||
|
break;
|
||
|
}
|
||
|
p.y = lat;
|
||
|
}
|
||
|
/* convergence failed */
|
||
|
if (!i) {
|
||
|
return null;
|
||
|
}
|
||
|
p.x = lon;
|
||
|
p.y = lat;
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
export var names = ["gauss"];
|
||
|
export default {
|
||
|
init: init,
|
||
|
forward: forward,
|
||
|
inverse: inverse,
|
||
|
names: names
|
||
|
};
|