[76] | 1 | /******************************************************************************* |
---|
| 2 | NAME MOLLWEIDE |
---|
| 3 | |
---|
| 4 | PURPOSE: Transforms input longitude and latitude to Easting and |
---|
| 5 | Northing for the MOllweide projection. The |
---|
| 6 | longitude and latitude must be in radians. The Easting |
---|
| 7 | and Northing values will be returned in meters. |
---|
| 8 | |
---|
| 9 | PROGRAMMER DATE |
---|
| 10 | ---------- ---- |
---|
| 11 | D. Steinwand, EROS May, 1991; Updated Sept, 1992; Updated Feb, 1993 |
---|
| 12 | S. Nelson, EDC Jun, 2993; Made corrections in precision and |
---|
| 13 | number of iterations. |
---|
| 14 | |
---|
| 15 | ALGORITHM REFERENCES |
---|
| 16 | |
---|
| 17 | 1. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", |
---|
| 18 | U.S. Geological Survey Professional Paper 1453 , United State Government |
---|
| 19 | Printing Office, Washington D.C., 1989. |
---|
| 20 | |
---|
| 21 | 2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological |
---|
| 22 | Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United |
---|
| 23 | State Government Printing Office, Washington D.C., 1987. |
---|
| 24 | *******************************************************************************/ |
---|
| 25 | |
---|
| 26 | Proj4js.Proj.moll = { |
---|
| 27 | |
---|
| 28 | /* Initialize the Mollweide projection |
---|
| 29 | ------------------------------------*/ |
---|
| 30 | init: function(){ |
---|
| 31 | //no-op |
---|
| 32 | }, |
---|
| 33 | |
---|
| 34 | /* Mollweide forward equations--mapping lat,long to x,y |
---|
| 35 | ----------------------------------------------------*/ |
---|
| 36 | forward: function(p) { |
---|
| 37 | |
---|
| 38 | /* Forward equations |
---|
| 39 | -----------------*/ |
---|
| 40 | var lon=p.x; |
---|
| 41 | var lat=p.y; |
---|
| 42 | |
---|
| 43 | var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); |
---|
| 44 | var theta = lat; |
---|
| 45 | var con = Proj4js.common.PI * Math.sin(lat); |
---|
| 46 | |
---|
| 47 | /* Iterate using the Newton-Raphson method to find theta |
---|
| 48 | -----------------------------------------------------*/ |
---|
| 49 | for (var i=0;true;i++) { |
---|
| 50 | var delta_theta = -(theta + Math.sin(theta) - con)/ (1.0 + Math.cos(theta)); |
---|
| 51 | theta += delta_theta; |
---|
| 52 | if (Math.abs(delta_theta) < Proj4js.common.EPSLN) break; |
---|
| 53 | if (i >= 50) { |
---|
| 54 | Proj4js.reportError("moll:Fwd:IterationError"); |
---|
| 55 | //return(241); |
---|
| 56 | } |
---|
| 57 | } |
---|
| 58 | theta /= 2.0; |
---|
| 59 | |
---|
| 60 | /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" |
---|
| 61 | this is done here because of precision problems with "cos(theta)" |
---|
| 62 | --------------------------------------------------------------------------*/ |
---|
| 63 | if (Proj4js.common.PI/2 - Math.abs(lat) < Proj4js.common.EPSLN) delta_lon =0; |
---|
| 64 | var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; |
---|
| 65 | var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; |
---|
| 66 | |
---|
| 67 | p.x=x; |
---|
| 68 | p.y=y; |
---|
| 69 | return p; |
---|
| 70 | }, |
---|
| 71 | |
---|
| 72 | inverse: function(p){ |
---|
| 73 | var theta; |
---|
| 74 | var arg; |
---|
| 75 | |
---|
| 76 | /* Inverse equations |
---|
| 77 | -----------------*/ |
---|
| 78 | p.x-= this.x0; |
---|
| 79 | //~ p.y -= this.y0; |
---|
| 80 | var arg = p.y / (1.4142135623731 * this.a); |
---|
| 81 | |
---|
| 82 | /* Because of division by zero problems, 'arg' can not be 1.0. Therefore |
---|
| 83 | a number very close to one is used instead. |
---|
| 84 | -------------------------------------------------------------------*/ |
---|
| 85 | if(Math.abs(arg) > 0.999999999999) arg=0.999999999999; |
---|
| 86 | var theta =Math.asin(arg); |
---|
| 87 | var lon = Proj4js.common.adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta)))); |
---|
| 88 | if(lon < (-Proj4js.common.PI)) lon= -Proj4js.common.PI; |
---|
| 89 | if(lon > Proj4js.common.PI) lon= Proj4js.common.PI; |
---|
| 90 | arg = (2.0 * theta + Math.sin(2.0 * theta)) / Proj4js.common.PI; |
---|
| 91 | if(Math.abs(arg) > 1.0)arg=1.0; |
---|
| 92 | var lat = Math.asin(arg); |
---|
| 93 | //return(OK); |
---|
| 94 | |
---|
| 95 | p.x=lon; |
---|
| 96 | p.y=lat; |
---|
| 97 | return p; |
---|
| 98 | } |
---|
| 99 | }; |
---|
| 100 | |
---|