| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- var EPSLN = 1.0e-10;
- var msfnz = require('../common/msfnz');
- var tsfnz = require('../common/tsfnz');
- var HALF_PI = Math.PI/2;
- var sign = require('../common/sign');
- var adjust_lon = require('../common/adjust_lon');
- var phi2z = require('../common/phi2z');
- exports.init = function() {
- // array of: r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north
- //double c_lat; /* center latitude */
- //double c_lon; /* center 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 */
- 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
- // -----------------------------------------------------------------
- exports.forward = function(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
- // -----------------------------------------------------------------
- exports.inverse = function(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;
- };
- exports.names = ["Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_2SP", "lcc"];
|