From bd210ee7438fd203c19d3e8080ea12b79fe56159 Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Mon, 09 Jun 2008 17:19:15 +0800
Subject: [PATCH] update for EOFM-117

---
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWDDatumConverter.java |  191 ++++++++++++++++++++++++-----------------------
 1 files changed, 96 insertions(+), 95 deletions(-)

diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWDDatumConverter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWDDatumConverter.java
index e9a6445..0971069 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWDDatumConverter.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWDDatumConverter.java
@@ -15,7 +15,7 @@
      *   Definition of math related value
      */
     private static final double COS67_5 = 0.3826834323650897717284599840304e0;
-    private static final double PI      = 3.14159265358979323e0;
+    private static final double PI = 3.14159265358979323e0;
     private static final double HALF_PI = 1.570796326794896615e0;
     private static final double DEG_RAD = 0.01745329251994329572e0;
     private static final double RAD_DEG = 57.295779513082321031e0;
@@ -23,10 +23,10 @@
     /*
      * Definition of datum related value
      */
-    private static final double AD_C       = 1.0026000e0;
-    private static final double TWD67_A    = 6378160.0e0;
-    private static final double TWD67_B    = 6356774.7192e0;
-    private static final double TWD67_ECC  = 0.00669454185458e0;
+    private static final double AD_C = 1.0026000e0;
+    private static final double TWD67_A = 6378160.0e0;
+    private static final double TWD67_B = 6356774.7192e0;
+    private static final double TWD67_ECC = 0.00669454185458e0;
     private static final double TWD67_ECC2 = 0.00673966079586e0;
 
     // different from garmin and already knowned value, but those all value only
@@ -36,17 +36,17 @@
     private static final double TWD67_DY = -361.32e0;
 
     // release to public. if can got more enough twd67/twd97 control point coordinare,
-    private static final double TWD67_DZ   = -180.51e0;
-    private static final double TWD67_RX   = -0.00000117e0;    // then we can calculate a better value than now.
-    private static final double TWD67_RY   = 0.00000184e0;     //
-    private static final double TWD67_RZ   = 0.00000098e0;     // and, also lack twd67/twd97 altitude convertion value...
-    private static final double TWD67_S    = 0.00002329e0;     //
-    private static final double TWD97_A    = 6378137.0e0;
-    private static final double TWD97_B    = 6356752.3141e0;
-    private static final double TWD97_ECC  = 0.00669438002290e0;
+    private static final double TWD67_DZ = -180.51e0;
+    private static final double TWD67_RX = -0.00000117e0;    // then we can calculate a better value than now.
+    private static final double TWD67_RY = 0.00000184e0;     //
+    private static final double TWD67_RZ = 0.00000098e0;     // and, also lack twd67/twd97 altitude convertion value...
+    private static final double TWD67_S = 0.00002329e0;     //
+    private static final double TWD97_A = 6378137.0e0;
+    private static final double TWD97_B = 6356752.3141e0;
+    private static final double TWD97_ECC = 0.00669438002290e0;
     private static final double TWD97_ECC2 = 0.00673949677556e0;
-    private static final double TWD67_TM2  = 0.9999e0;         // TWD67->TM2 scale
-    private static final double TWD97_TM2  = 0.9999e0;         // TWD97->TM2 scale
+    private static final double TWD67_TM2 = 0.9999e0;         // TWD67->TM2 scale
+    private static final double TWD97_TM2 = 0.9999e0;         // TWD97->TM2 scale
 
     /*
      * datum convert function
@@ -59,8 +59,8 @@
         double x1, y1, z1, x2, y2, z2;
         double q, q2, t, t1, s, s1, sum, sin_b, cos_b, sin_p, cos_p;
 
-        lon    = pt.x * DEG_RAD;
-        lat    = pt.y * DEG_RAD;
+        lon = pt.x * DEG_RAD;
+        lat = pt.y * DEG_RAD;
         height = pt.z * DEG_RAD;
 
         if ((lat < -HALF_PI) && (lat > -1.001 * HALF_PI))
@@ -81,14 +81,14 @@
 
         sin_lat = Math.sin(lat);
         cos_lat = Math.cos(lat);
-        r       = TWD67_A / (Math.sqrt(1.0 - TWD67_ECC * sin_lat * sin_lat));
-        x1      = (r + height) * cos_lat * Math.cos(lon);
-        y1      = (r + height) * cos_lat * Math.sin(lon);
-        z1      = ((r * (1 - TWD67_ECC)) + height) * sin_lat;
-        x2      = x1 + TWD67_DX + TWD67_S * (lon + TWD67_RZ * lat - TWD67_RY * height);
-        y2      = y1 + TWD67_DY + TWD67_S * (-TWD67_RZ * lon + lat + TWD67_RX * height);
-        z2      = z1 + TWD67_DZ + TWD67_S * (TWD67_RY * lon - TWD67_RX * lat + height);
-        pole    = 0.0;
+        r = TWD67_A / (Math.sqrt(1.0 - TWD67_ECC * sin_lat * sin_lat));
+        x1 = (r + height) * cos_lat * Math.cos(lon);
+        y1 = (r + height) * cos_lat * Math.sin(lon);
+        z1 = ((r * (1 - TWD67_ECC)) + height) * sin_lat;
+        x2 = x1 + TWD67_DX + TWD67_S * (lon + TWD67_RZ * lat - TWD67_RY * height);
+        y2 = y1 + TWD67_DY + TWD67_S * (-TWD67_RZ * lon + lat + TWD67_RX * height);
+        z2 = z1 + TWD67_DZ + TWD67_S * (TWD67_RY * lon - TWD67_RX * lat + height);
+        pole = 0.0;
 
         if (x2 != 0.0)
         {
@@ -104,7 +104,7 @@
             } else
             {
                 pole = 1;
-                lon  = 0;
+                lon = 0;
 
                 if (z2 > 0)
                 {
@@ -114,7 +114,7 @@
                     lat = -HALF_PI;
                 } else
                 {
-                    lat  = HALF_PI;
+                    lat = HALF_PI;
                     newX = lon * RAD_DEG;
                     newY = lat * RAD_DEG;
                     newZ = -TWD97_B;
@@ -124,18 +124,18 @@
             }
         }
 
-        q2    = x2 * x2 + y2 * y2;
-        q     = Math.sqrt(q2);
-        t     = z2 * AD_C;
-        s     = Math.sqrt(t * t + q2);
+        q2 = x2 * x2 + y2 * y2;
+        q = Math.sqrt(q2);
+        t = z2 * AD_C;
+        s = Math.sqrt(t * t + q2);
         sin_b = t / s;
         cos_b = q / s;
-        t1    = z2 + TWD97_B * TWD97_ECC2 * sin_b * sin_b * sin_b;
-        sum   = q - TWD97_A * TWD97_ECC * cos_b * cos_b * cos_b;
-        s1    = Math.sqrt(t1 * t1 + sum * sum);
+        t1 = z2 + TWD97_B * TWD97_ECC2 * sin_b * sin_b * sin_b;
+        sum = q - TWD97_A * TWD97_ECC * cos_b * cos_b * cos_b;
+        s1 = Math.sqrt(t1 * t1 + sum * sum);
         sin_p = t1 / s1;
         cos_p = sum / s1;
-        r     = TWD97_A / Math.sqrt(1.0 - TWD97_ECC * sin_p * sin_p);
+        r = TWD97_A / Math.sqrt(1.0 - TWD97_ECC * sin_p * sin_p);
 
         if (cos_p >= COS67_5)
         {
@@ -148,7 +148,7 @@
             height = z2 / sin_p + r * (TWD97_ECC - 1.0);
         }
 
-        if (pole !=0.0)
+        if (pole != 0.0)
         {
             lat = Math.atan(sin_p / cos_p);
         }
@@ -167,8 +167,8 @@
         double x1, y1, z1, x2, y2, z2;
         double q, q2, t, t1, s, s1, sum, sin_b, cos_b, sin_p, cos_p;
 
-        lon    = pt.x * DEG_RAD;
-        lat    = pt.y * DEG_RAD;
+        lon = pt.x * DEG_RAD;
+        lat = pt.y * DEG_RAD;
         height = pt.z * DEG_RAD;
 
         if ((lat < -HALF_PI) && (lat > -1.001 * HALF_PI))
@@ -189,14 +189,14 @@
 
         sin_lat = Math.sin(lat);
         cos_lat = Math.cos(lat);
-        r       = TWD97_A / (Math.sqrt(1.0 - TWD97_ECC * sin_lat * sin_lat));
-        x1      = (r + height) * cos_lat * Math.cos(lon);
-        y1      = (r + height) * cos_lat * Math.sin(lon);
-        z1      = ((r * (1 - TWD97_ECC)) + height) * sin_lat;
-        x2      = x1 - TWD67_DX - TWD67_S * (lon + TWD67_RZ * lat - TWD67_RY * height);
-        y2      = y1 - TWD67_DY - TWD67_S * (-TWD67_RZ * lon + lat + TWD67_RX * height);
-        z2      = z1 - TWD67_DZ - TWD67_S * (TWD67_RY * lon - TWD67_RX * lat + height);
-        pole    = 0;
+        r = TWD97_A / (Math.sqrt(1.0 - TWD97_ECC * sin_lat * sin_lat));
+        x1 = (r + height) * cos_lat * Math.cos(lon);
+        y1 = (r + height) * cos_lat * Math.sin(lon);
+        z1 = ((r * (1 - TWD97_ECC)) + height) * sin_lat;
+        x2 = x1 - TWD67_DX - TWD67_S * (lon + TWD67_RZ * lat - TWD67_RY * height);
+        y2 = y1 - TWD67_DY - TWD67_S * (-TWD67_RZ * lon + lat + TWD67_RX * height);
+        z2 = z1 - TWD67_DZ - TWD67_S * (TWD67_RY * lon - TWD67_RX * lat + height);
+        pole = 0;
 
         if (x2 != 0.0)
         {
@@ -212,7 +212,7 @@
             } else
             {
                 pole = 1;
-                lon  = 0;
+                lon = 0;
 
                 if (z2 > 0)
                 {
@@ -222,7 +222,7 @@
                     lat = -HALF_PI;
                 } else
                 {
-                    lat  = HALF_PI;
+                    lat = HALF_PI;
                     newX = lon * RAD_DEG;
                     newY = lat * RAD_DEG;
                     newZ = -TWD67_B;
@@ -232,18 +232,18 @@
             }
         }
 
-        q2    = x2 * x2 + y2 * y2;
-        q     = Math.sqrt(q2);
-        t     = z2 * AD_C;
-        s     = Math.sqrt(t * t + q2);
+        q2 = x2 * x2 + y2 * y2;
+        q = Math.sqrt(q2);
+        t = z2 * AD_C;
+        s = Math.sqrt(t * t + q2);
         sin_b = t / s;
         cos_b = q / s;
-        t1    = z2 + TWD67_B * TWD67_ECC2 * sin_b * sin_b * sin_b;
-        sum   = q - TWD67_A * TWD67_ECC * cos_b * cos_b * cos_b;
-        s1    = Math.sqrt(t1 * t1 + sum * sum);
+        t1 = z2 + TWD67_B * TWD67_ECC2 * sin_b * sin_b * sin_b;
+        sum = q - TWD67_A * TWD67_ECC * cos_b * cos_b * cos_b;
+        s1 = Math.sqrt(t1 * t1 + sum * sum);
         sin_p = t1 / s1;
         cos_p = sum / s1;
-        r     = TWD67_A / Math.sqrt(1.0 - TWD67_ECC * sin_p * sin_p);
+        r = TWD67_A / Math.sqrt(1.0 - TWD67_ECC * sin_p * sin_p);
 
         if (cos_p >= COS67_5)
         {
@@ -273,24 +273,24 @@
         double n, t, c, A;
         double newX, newY;
 
-        x0   = x * DEG_RAD;
-        y0   = y * DEG_RAD;
-        x1   = lon * DEG_RAD;
-        y1   = lat * DEG_RAD;
-        m0   = mercator(y1, a, ecc);
-        m1   = mercator(y0, a, ecc);
-        n    = a / Math.sqrt(1 - ecc * Math.pow(Math.sin(y0), 2.0));
-        t    = Math.pow(Math.tan(y0), 2.0);
-        c    = ecc2 * Math.pow(Math.cos(y0), 2.0);
-        A    = (x0 - x1) * Math.cos(y0);
+        x0 = x * DEG_RAD;
+        y0 = y * DEG_RAD;
+        x1 = lon * DEG_RAD;
+        y1 = lat * DEG_RAD;
+        m0 = mercator(y1, a, ecc);
+        m1 = mercator(y0, a, ecc);
+        n = a / Math.sqrt(1 - ecc * Math.pow(Math.sin(y0), 2.0));
+        t = Math.pow(Math.tan(y0), 2.0);
+        c = ecc2 * Math.pow(Math.cos(y0), 2.0);
+        A = (x0 - x1) * Math.cos(y0);
         newX = scale * n
-               * (A + (1.0 - t + c) * A * A * A / 6.0
-                  + (5.0 - 18.0 * t + t * t + 72.0 * c - 58.0 * ecc2) * Math.pow(A, 5.0) / 120.0);
+                * (A + (1.0 - t + c) * A * A * A / 6.0
+                + (5.0 - 18.0 * t + t * t + 72.0 * c - 58.0 * ecc2) * Math.pow(A, 5.0) / 120.0);
         newY = scale
-               * (m1 - m0
-                  + n * Math.tan(y0)
-                    * (A * A / 2.0 + (5.0 - t + 9.0 * c + 4 * c * c) * Math.pow(A, 4.0) / 24.0
-                       + (61.0 - 58.0 * t + t * t + 600.0 * c - 330.0 * ecc2) * Math.pow(A, 6.0) / 720.0));
+                * (m1 - m0
+                + n * Math.tan(y0)
+                * (A * A / 2.0 + (5.0 - t + 9.0 * c + 4 * c * c) * Math.pow(A, 4.0) / 24.0
+                + (61.0 - 58.0 * t + t * t + 600.0 * c - 330.0 * ecc2) * Math.pow(A, 6.0) / 720.0));
         return new Coordinate(newX, newY);
     }
 
@@ -300,30 +300,30 @@
         double x0, y0, x1, y1, phi, m, m0, mu, e1;
         double c1, t1, n1, r1, d;
 
-        x0  = x;
-        y0  = y;
-        x1  = lon * DEG_RAD;
-        y1  = lat * DEG_RAD;
-        m0  = mercator(y1, a, ecc);
-        m   = m0 + y0 / scale;
-        e1  = (1.0 - Math.sqrt(1.0 - ecc)) / (1.0 + Math.sqrt(1.0 - ecc));
-        mu  = m / (a * (1.0 - ecc / 4.0 - 3.0 * ecc * ecc / 64.0 - 5.0 * ecc * ecc * ecc / 256.0));
+        x0 = x;
+        y0 = y;
+        x1 = lon * DEG_RAD;
+        y1 = lat * DEG_RAD;
+        m0 = mercator(y1, a, ecc);
+        m = m0 + y0 / scale;
+        e1 = (1.0 - Math.sqrt(1.0 - ecc)) / (1.0 + Math.sqrt(1.0 - ecc));
+        mu = m / (a * (1.0 - ecc / 4.0 - 3.0 * ecc * ecc / 64.0 - 5.0 * ecc * ecc * ecc / 256.0));
         phi = mu + (3.0 * e1 / 2.0 - 27.0 * Math.pow(e1, 3.0) / 32.0) * Math.sin(2.0 * mu)
-              + (21.0 * e1 * e1 / 16.0 - 55.0 * Math.pow(e1, 4.0) / 32.0) * Math.sin(4.0 * mu)
-              + 151.0 * Math.pow(e1, 3.0) / 96.0 * Math.sin(6.0 * mu) + 1097.0 * Math.pow(e1, 4.0) / 512.0 * Math.sin(8.0 * mu);
-        c1   = ecc2 * Math.pow(Math.cos(phi), 2.0);
-        t1   = Math.pow(Math.tan(phi), 2.0);
-        n1   = a / Math.sqrt(1 - ecc * Math.pow(Math.sin(phi), 2.0));
-        r1   = a * (1.0 - ecc) / Math.pow(1.0 - ecc * Math.pow(Math.sin(phi), 2.0), 1.5);
-        d    = x0 / (n1 * scale);
+                + (21.0 * e1 * e1 / 16.0 - 55.0 * Math.pow(e1, 4.0) / 32.0) * Math.sin(4.0 * mu)
+                + 151.0 * Math.pow(e1, 3.0) / 96.0 * Math.sin(6.0 * mu) + 1097.0 * Math.pow(e1, 4.0) / 512.0 * Math.sin(8.0 * mu);
+        c1 = ecc2 * Math.pow(Math.cos(phi), 2.0);
+        t1 = Math.pow(Math.tan(phi), 2.0);
+        n1 = a / Math.sqrt(1 - ecc * Math.pow(Math.sin(phi), 2.0));
+        r1 = a * (1.0 - ecc) / Math.pow(1.0 - ecc * Math.pow(Math.sin(phi), 2.0), 1.5);
+        d = x0 / (n1 * scale);
         newX = (x1 + (d - (1.0 + 2.0 * t1 + c1) * Math.pow(d, 3.0) / 6.0
-                      + (5.0 - 2.0 * c1 + 28.0 * t1 - 3.0 * c1 * c1 + 8.0 * ecc2 + 24.0 * t1 * t1) * Math.pow(d, 5.0)
-                        / 120.0) / Math.cos(phi)) * RAD_DEG;
+                + (5.0 - 2.0 * c1 + 28.0 * t1 - 3.0 * c1 * c1 + 8.0 * ecc2 + 24.0 * t1 * t1) * Math.pow(d, 5.0)
+                / 120.0) / Math.cos(phi)) * RAD_DEG;
         newY = (phi
                 - n1 * Math.tan(phi) / r1
-                  * (d * d / 2.0 - (5.0 + 3.0 * t1 + 10.0 * c1 - 4.0 * c1 * c1 - 9.0 * ecc2) * Math.pow(d, 4.0) / 24.0
-                     + (61.0 + 90.0 * t1 + 298.0 * c1 + 45.0 * t1 * t1 - 252.0 * ecc2 - 3.0 * c1 * c1) * Math.pow(d, 6.0)
-                       / 72.0)) * RAD_DEG;
+                * (d * d / 2.0 - (5.0 + 3.0 * t1 + 10.0 * c1 - 4.0 * c1 * c1 - 9.0 * ecc2) * Math.pow(d, 4.0) / 24.0
+                + (61.0 + 90.0 * t1 + 298.0 * c1 + 45.0 * t1 * t1 - 252.0 * ecc2 - 3.0 * c1 * c1) * Math.pow(d, 6.0)
+                / 72.0)) * RAD_DEG;
         return new Coordinate(newX, newY);
     }
 
@@ -335,9 +335,9 @@
         } else
         {
             return a * ((1.0 - ecc / 4.0 - 3.0 * ecc * ecc / 64.0 - 5.0 * ecc * ecc * ecc / 256.0) * y
-                        - (3.0 * ecc / 8.0 + 3.0 * ecc * ecc / 32.0 + 45.0 * ecc * ecc * ecc / 1024.0) * Math.sin(2.0 * y)
-                        + (15.0 * ecc * ecc / 256.0 + 45.0 * ecc * ecc * ecc / 1024.0) * Math.sin(4.0 * y)
-                        - (35.0 * ecc * ecc * ecc / 3072.0) * Math.sin(6.0 * y));
+                    - (3.0 * ecc / 8.0 + 3.0 * ecc * ecc / 32.0 + 45.0 * ecc * ecc * ecc / 1024.0) * Math.sin(2.0 * y)
+                    + (15.0 * ecc * ecc / 256.0 + 45.0 * ecc * ecc * ecc / 1024.0) * Math.sin(4.0 * y)
+                    - (35.0 * ecc * ecc * ecc / 3072.0) * Math.sin(6.0 * y));
         }
     }
 
@@ -492,6 +492,7 @@
 
     /**
      * ��TM2�y���ഫ��TWD97�y��
+     *
      * @param pt TM2��m
      * @return �s��TWD97�y��
      */

--
Gitblit v0.0.0-SNAPSHOT