+++ /dev/null
-/*******************************************************************************\r
-NAME SWISS OBLIQUE MERCATOR\r
-\r
-PURPOSE: Swiss projection.\r
-WARNING: X and Y are inverted (weird) in the swiss coordinate system. Not\r
- here, since we want X to be horizontal and Y vertical.\r
-\r
-ALGORITHM REFERENCES\r
-1. "Formules et constantes pour le Calcul pour la\r
- projection cylindrique conforme à axe oblique et pour la transformation entre\r
- des systèmes de référence".\r
- http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf\r
-\r
-*******************************************************************************/\r
-\r
-Proj4js.Proj.somerc = {\r
-\r
- init: function() {\r
- var phy0 = this.lat0;\r
- this.lambda0 = this.long0;\r
- var sinPhy0 = Math.sin(phy0);\r
- var semiMajorAxis = this.a;\r
- var invF = this.rf;\r
- var flattening = 1 / invF;\r
- var e2 = 2 * flattening - Math.pow(flattening, 2);\r
- var e = this.e = Math.sqrt(e2);\r
- this.R = semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2.0));\r
- this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4.0));\r
- this.b0 = Math.asin(sinPhy0 / this.alpha);\r
- this.K = Math.log(Math.tan(Math.PI / 4.0 + this.b0 / 2.0))\r
- - this.alpha\r
- * Math.log(Math.tan(Math.PI / 4.0 + phy0 / 2.0))\r
- + this.alpha\r
- * e / 2\r
- * Math.log((1 + e * sinPhy0)\r
- / (1 - e * sinPhy0));\r
- },\r
-\r
-\r
- forward: function(p) {\r
- var Sa1 = Math.log(Math.tan(Math.PI / 4.0 - p.y / 2.0));\r
- var Sa2 = this.e / 2.0\r
- * Math.log((1 + this.e * Math.sin(p.y))\r
- / (1 - this.e * Math.sin(p.y)));\r
- var S = -this.alpha * (Sa1 + Sa2) + this.K;\r
-\r
- // spheric latitude\r
- var b = 2.0 * (Math.atan(Math.exp(S)) - Math.PI / 4.0);\r
-\r
- // spheric longitude\r
- var I = this.alpha * (p.x - this.lambda0);\r
-\r
- // psoeudo equatorial rotation\r
- var rotI = Math.atan(Math.sin(I)\r
- / (Math.sin(this.b0) * Math.tan(b) +\r
- Math.cos(this.b0) * Math.cos(I)));\r
-\r
- var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) -\r
- Math.sin(this.b0) * Math.cos(b) * Math.cos(I));\r
-\r
- p.y = this.R / 2.0\r
- * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB)))\r
- + this.y0;\r
- p.x = this.R * rotI + this.x0;\r
- return p;\r
- },\r
-\r
- inverse: function(p) {\r
- var Y = p.x - this.x0;\r
- var X = p.y - this.y0;\r
-\r
- var rotI = Y / this.R;\r
- var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4.0);\r
-\r
- var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB)\r
- + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));\r
- var I = Math.atan(Math.sin(rotI)\r
- / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0)\r
- * Math.tan(rotB)));\r
-\r
- var lambda = this.lambda0 + I / this.alpha;\r
-\r
- var S = 0.0;\r
- var phy = b;\r
- var prevPhy = -1000.0;\r
- var iteration = 0;\r
- while (Math.abs(phy - prevPhy) > 0.0000001)\r
- {\r
- if (++iteration > 20)\r
- {\r
- Proj4js.reportError("omercFwdInfinity");\r
- return;\r
- }\r
- //S = Math.log(Math.tan(Math.PI / 4.0 + phy / 2.0));\r
- S = 1.0\r
- / this.alpha\r
- * (Math.log(Math.tan(Math.PI / 4.0 + b / 2.0)) - this.K)\r
- + this.e\r
- * Math.log(Math.tan(Math.PI / 4.0\r
- + Math.asin(this.e * Math.sin(phy))\r
- / 2.0));\r
- prevPhy = phy;\r
- phy = 2.0 * Math.atan(Math.exp(S)) - Math.PI / 2.0;\r
- }\r
-\r
- p.x = lambda;\r
- p.y = phy;\r
- return p;\r
- }\r
-};\r