/*******************************************************************************
|
NAME MERCATOR
|
|
PURPOSE: Transforms input longitude and latitude to Easting and
|
Northing for the Mercator projection. The
|
longitude and latitude must be in radians. The Easting
|
and Northing values will be returned in meters.
|
|
PROGRAMMER DATE
|
---------- ----
|
D. Steinwand, EROS Nov, 1991
|
T. Mittan Mar, 1993
|
|
ALGORITHM REFERENCES
|
|
1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
|
Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
|
State Government Printing Office, Washington D.C., 1987.
|
|
2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
|
U.S. Geological Survey Professional Paper 1453 , United State Government
|
Printing Office, Washington D.C., 1989.
|
*******************************************************************************/
|
|
//static double r_major = a; /* major axis */
|
//static double r_minor = b; /* minor axis */
|
//static double lon_center = long0; /* Center longitude (projection center) */
|
//static double lat_origin = lat0; /* center latitude */
|
//static double e,es; /* eccentricity constants */
|
//static double m1; /* small value m */
|
//static double false_northing = y0; /* y offset in meters */
|
//static double false_easting = x0; /* x offset in meters */
|
//scale_fact = k0
|
|
Proj4js.Proj.merc = {
|
init : function() {
|
//?this.temp = this.r_minor / this.r_major;
|
//this.temp = this.b / this.a;
|
//this.es = 1.0 - Math.sqrt(this.temp);
|
//this.e = Math.sqrt( this.es );
|
//?this.m1 = Math.cos(this.lat_origin) / (Math.sqrt( 1.0 - this.es * Math.sin(this.lat_origin) * Math.sin(this.lat_origin)));
|
//this.m1 = Math.cos(0.0) / (Math.sqrt( 1.0 - this.es * Math.sin(0.0) * Math.sin(0.0)));
|
if (this.lat_ts) {
|
if (this.sphere) {
|
this.k0 = Math.cos(this.lat_ts);
|
} else {
|
this.k0 = Proj4js.common.msfnz(this.es, Math.sin(this.lat_ts), Math.cos(this.lat_ts));
|
}
|
}
|
},
|
|
/* Mercator forward equations--mapping lat,long to x,y
|
--------------------------------------------------*/
|
|
forward : function(p) {
|
//alert("ll2m coords : "+coords);
|
var lon = p.x;
|
var lat = p.y;
|
// convert to radians
|
if ( lat*Proj4js.common.R2D > 90.0 &&
|
lat*Proj4js.common.R2D < -90.0 &&
|
lon*Proj4js.common.R2D > 180.0 &&
|
lon*Proj4js.common.R2D < -180.0) {
|
Proj4js.reportError("merc:forward: llInputOutOfRange: "+ lon +" : " + lat);
|
return null;
|
}
|
|
var x,y;
|
if(Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) {
|
Proj4js.reportError("merc:forward: ll2mAtPoles");
|
return null;
|
} else {
|
if (this.sphere) {
|
x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0);
|
y = this.y0 + this.a * this.k0 * Math.log(Math.tan(Proj4js.common.FORTPI + 0.5*lat));
|
} else {
|
var sinphi = Math.sin(lat);
|
var ts = Proj4js.common.tsfnz(this.e,lat,sinphi);
|
x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0);
|
y = this.y0 - this.a * this.k0 * Math.log(ts);
|
}
|
p.x = x;
|
p.y = y;
|
return p;
|
}
|
},
|
|
|
/* Mercator inverse equations--mapping x,y to lat/long
|
--------------------------------------------------*/
|
inverse : function(p) {
|
|
var x = p.x - this.x0;
|
var y = p.y - this.y0;
|
var lon,lat;
|
|
if (this.sphere) {
|
lat = Proj4js.common.HALF_PI - 2.0 * Math.atan(Math.exp(-y / this.a * this.k0));
|
} else {
|
var ts = Math.exp(-y / (this.a * this.k0));
|
lat = Proj4js.common.phi2z(this.e,ts);
|
if(lat == -9999) {
|
Proj4js.reportError("merc:inverse: lat = -9999");
|
return null;
|
}
|
}
|
lon = Proj4js.common.adjust_lon(this.long0+ x / (this.a * this.k0));
|
|
p.x = lon;
|
p.y = lat;
|
return p;
|
}
|
};
|