151 lines
4.1 KiB
JavaScript
151 lines
4.1 KiB
JavaScript
|
import msfnz from '../common/msfnz';
|
||
|
import tsfnz from '../common/tsfnz';
|
||
|
import sign from '../common/sign';
|
||
|
import adjust_lon from '../common/adjust_lon';
|
||
|
import phi2z from '../common/phi2z';
|
||
|
import {HALF_PI, EPSLN} from '../constants/values';
|
||
|
export function init() {
|
||
|
|
||
|
//double lat0; /* the reference latitude */
|
||
|
//double long0; /* the reference longitude */
|
||
|
//double lat1; /* first standard parallel */
|
||
|
//double lat2; /* second standard parallel */
|
||
|
//double r_maj; /* major axis */
|
||
|
//double r_min; /* minor axis */
|
||
|
//double false_east; /* x offset in meters */
|
||
|
//double false_north; /* y offset in meters */
|
||
|
|
||
|
//the above value can be set with proj4.defs
|
||
|
//example: proj4.defs("EPSG:2154","+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
|
||
|
|
||
|
if (!this.lat2) {
|
||
|
this.lat2 = this.lat1;
|
||
|
} //if lat2 is not defined
|
||
|
if (!this.k0) {
|
||
|
this.k0 = 1;
|
||
|
}
|
||
|
this.x0 = this.x0 || 0;
|
||
|
this.y0 = this.y0 || 0;
|
||
|
// Standard Parallels cannot be equal and on opposite sides of the equator
|
||
|
if (Math.abs(this.lat1 + this.lat2) < EPSLN) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var temp = this.b / this.a;
|
||
|
this.e = Math.sqrt(1 - temp * temp);
|
||
|
|
||
|
var sin1 = Math.sin(this.lat1);
|
||
|
var cos1 = Math.cos(this.lat1);
|
||
|
var ms1 = msfnz(this.e, sin1, cos1);
|
||
|
var ts1 = tsfnz(this.e, this.lat1, sin1);
|
||
|
|
||
|
var sin2 = Math.sin(this.lat2);
|
||
|
var cos2 = Math.cos(this.lat2);
|
||
|
var ms2 = msfnz(this.e, sin2, cos2);
|
||
|
var ts2 = tsfnz(this.e, this.lat2, sin2);
|
||
|
|
||
|
var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));
|
||
|
|
||
|
if (Math.abs(this.lat1 - this.lat2) > EPSLN) {
|
||
|
this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);
|
||
|
}
|
||
|
else {
|
||
|
this.ns = sin1;
|
||
|
}
|
||
|
if (isNaN(this.ns)) {
|
||
|
this.ns = sin1;
|
||
|
}
|
||
|
this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));
|
||
|
this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);
|
||
|
if (!this.title) {
|
||
|
this.title = "Lambert Conformal Conic";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Lambert Conformal conic forward equations--mapping lat,long to x,y
|
||
|
// -----------------------------------------------------------------
|
||
|
export function forward(p) {
|
||
|
|
||
|
var lon = p.x;
|
||
|
var lat = p.y;
|
||
|
|
||
|
// singular cases :
|
||
|
if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {
|
||
|
lat = sign(lat) * (HALF_PI - 2 * EPSLN);
|
||
|
}
|
||
|
|
||
|
var con = Math.abs(Math.abs(lat) - HALF_PI);
|
||
|
var ts, rh1;
|
||
|
if (con > EPSLN) {
|
||
|
ts = tsfnz(this.e, lat, Math.sin(lat));
|
||
|
rh1 = this.a * this.f0 * Math.pow(ts, this.ns);
|
||
|
}
|
||
|
else {
|
||
|
con = lat * this.ns;
|
||
|
if (con <= 0) {
|
||
|
return null;
|
||
|
}
|
||
|
rh1 = 0;
|
||
|
}
|
||
|
var theta = this.ns * adjust_lon(lon - this.long0);
|
||
|
p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;
|
||
|
p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;
|
||
|
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
// Lambert Conformal Conic inverse equations--mapping x,y to lat/long
|
||
|
// -----------------------------------------------------------------
|
||
|
export function inverse(p) {
|
||
|
|
||
|
var rh1, con, ts;
|
||
|
var lat, lon;
|
||
|
var x = (p.x - this.x0) / this.k0;
|
||
|
var y = (this.rh - (p.y - this.y0) / this.k0);
|
||
|
if (this.ns > 0) {
|
||
|
rh1 = Math.sqrt(x * x + y * y);
|
||
|
con = 1;
|
||
|
}
|
||
|
else {
|
||
|
rh1 = -Math.sqrt(x * x + y * y);
|
||
|
con = -1;
|
||
|
}
|
||
|
var theta = 0;
|
||
|
if (rh1 !== 0) {
|
||
|
theta = Math.atan2((con * x), (con * y));
|
||
|
}
|
||
|
if ((rh1 !== 0) || (this.ns > 0)) {
|
||
|
con = 1 / this.ns;
|
||
|
ts = Math.pow((rh1 / (this.a * this.f0)), con);
|
||
|
lat = phi2z(this.e, ts);
|
||
|
if (lat === -9999) {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
lat = -HALF_PI;
|
||
|
}
|
||
|
lon = adjust_lon(theta / this.ns + this.long0);
|
||
|
|
||
|
p.x = lon;
|
||
|
p.y = lat;
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
export var names = [
|
||
|
"Lambert Tangential Conformal Conic Projection",
|
||
|
"Lambert_Conformal_Conic",
|
||
|
"Lambert_Conformal_Conic_1SP",
|
||
|
"Lambert_Conformal_Conic_2SP",
|
||
|
"lcc",
|
||
|
"Lambert Conic Conformal (1SP)",
|
||
|
"Lambert Conic Conformal (2SP)"
|
||
|
];
|
||
|
|
||
|
export default {
|
||
|
init: init,
|
||
|
forward: forward,
|
||
|
inverse: inverse,
|
||
|
names: names
|
||
|
};
|