Understand shapefiles in different projections (notably OSGB)
[potlatch2.git] / com / gradoservice / proj4as / proj / ProjGauss.as
1 package com.gradoservice.proj4as.proj\r
2 {\r
3         import com.gradoservice.proj4as.ProjPoint;\r
4         import com.gradoservice.proj4as.ProjConstants;\r
5         import com.gradoservice.proj4as.Datum;\r
6                 \r
7         public class ProjGauss extends AbstractProjProjection\r
8         {\r
9 \r
10         protected var phic0:Number;\r
11         protected var ratexp:Number;\r
12 \r
13                 public function ProjGauss(data:ProjParams)\r
14                 {\r
15                         super(data);\r
16                 }\r
17                 \r
18   override public function init():void\r
19         {\r
20     var sphi:Number = Math.sin(this.lat0);\r
21     var cphi:Number = Math.cos(this.lat0);  \r
22     cphi *= cphi;\r
23     this.rc = Math.sqrt(1.0 - this.es) / (1.0 - this.es * sphi * sphi);\r
24     this.c = Math.sqrt(1.0 + this.es * cphi * cphi / (1.0 - this.es));\r
25     this.phic0 = Math.asin(sphi / this.c);\r
26     this.ratexp = 0.5 * this.c * this.e;\r
27     this.k = Math.tan(0.5 * this.phic0 + ProjConstants.FORTPI) / (Math.pow(Math.tan(0.5*this.lat0 + ProjConstants.FORTPI), this.c) * ProjConstants.srat(this.e*sphi, this.ratexp));\r
28         }\r
29 \r
30   override public function forward(p:ProjPoint):ProjPoint \r
31         {\r
32     var lon:Number = p.x;\r
33     var lat:Number = p.y;\r
34 \r
35     p.y = 2.0 * Math.atan( this.k * Math.pow(Math.tan(0.5 * lat + ProjConstants.FORTPI), this.c) * ProjConstants.srat(this.e * Math.sin(lat), this.ratexp) ) - ProjConstants.HALF_PI;\r
36     p.x = this.c * lon;\r
37     return p;\r
38         }\r
39 \r
40    override public function inverse(p:ProjPoint):ProjPoint\r
41    {\r
42     var DEL_TOL:Number = 1e-14;\r
43     var lon:Number = p.x / this.c;\r
44     var lat:Number = p.y;\r
45     var num:Number = Math.pow(Math.tan(0.5 * lat + ProjConstants.FORTPI)/this.k, 1./this.c);\r
46     for (var i:int = ProjConstants.MAX_ITER; i>0; --i) {\r
47       lat = 2.0 * Math.atan(num * ProjConstants.srat(this.e * Math.sin(p.y), -0.5 * this.e)) - ProjConstants.HALF_PI;\r
48       if (Math.abs(lat - p.y) < DEL_TOL) break;\r
49       p.y = lat;\r
50     }   \r
51     /* convergence failed */\r
52     if (!i) {\r
53       trace("gauss:inverse:convergence failed");\r
54       return null;\r
55     }\r
56     p.x = lon;\r
57     p.y = lat;\r
58     return p;\r
59   }             \r
60                 \r
61         }\r
62 }