2.13 火星坐标系统破解算法

本博客详细介绍了火星地球坐标转化的过程,并通过地图坐标修正实现精准转换,包括坐标初始化、标准到中国的转化以及中国到标准的逆向转化。

 

 

------------------------------------------------------------------------------------------------



/**
 * 火星地球坐标转化.地图坐标修偏
 *
 */
public class ModifyOffset {
      private static ModifyOffset modifyOffset;
      static double[] X = new double[660 * 450];
      static double[] Y = new double[660 * 450];


      private ModifyOffset(InputStream inputStream) throws Exception {
            init(inputStream);
      }

      public synchronized static ModifyOffset getInstance(InputStream is) throws Exception {
             if ( modifyOffset == null) {
                   modifyOffset = new ModifyOffset(is);
            }
             return modifyOffset;
      }

      public void init(InputStream inputStream) throws Exception {
            ObjectInputStream in = new ObjectInputStream(inputStream);
             try {
                   int i = 0;
                   while (in.available() > 0) {
                         if ((i & 1) == 1) {
                               Y[(i - 1) >> 1] = in.readInt() / 100000.0d;
                              ;
                        } else {
                               X[i >> 1] = in.readInt() / 100000.0d;
                              ;
                        }
                        i++;
                  }
            } finally {
                   if (in != null)
                        in.close();
            }
      }

      // standard -> china
      public PointDouble s2c(PointDouble pt) {
             int cnt = 10;
             double x = pt. x, y = pt. y;
             while (cnt-- > 0) {
                   if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
                         return pt;
                   int ix = ( int) (10.0d * (x - 72.0d));
                   int iy = ( int) (10.0d * (y - 10.0d));
                   double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
                   double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
                  x = (x + pt. x + (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] + dx
                              * (1.0d - dy) * X[ix + 660 * iy + 1] + dx * dy
                              * X[ix + 660 * iy + 661] + (1.0d - dx) * dy
                              * X[ix + 660 * iy + 660] - x) / 2.0d;
                  y = (y + pt. y + (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] + dx
                              * (1.0d - dy) * Y[ix + 660 * iy + 1] + dx * dy
                              * Y[ix + 660 * iy + 661] + (1.0d - dx) * dy
                              * Y[ix + 660 * iy + 660] - y) / 2.0d;
            }
             return new PointDouble(x, y);
      }

      // china -> standard
      public PointDouble c2s(PointDouble pt) {
             int cnt = 10;
             double x = pt. x, y = pt. y;
             while (cnt-- > 0) {
                   if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
                         return pt;
                   int ix = ( int) (10.0d * (x - 72.0d));
                   int iy = ( int) (10.0d * (y - 10.0d));
                   double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
                   double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
                  x = (x + pt. x - (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] - dx
                              * (1.0d - dy) * X[ix + 660 * iy + 1] - dx * dy
                              * X[ix + 660 * iy + 661] - (1.0d - dx) * dy
                              * X[ix + 660 * iy + 660] + x) / 2.0d;
                  y = (y + pt. y - (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] - dx
                              * (1.0d - dy) * Y[ix + 660 * iy + 1] - dx * dy
                              * Y[ix + 660 * iy + 661] - (1.0d - dx) * dy
                              * Y[ix + 660 * iy + 660] + y) / 2.0d;
            }
             return new PointDouble(x, y);
      }

}

class PointDouble {
      double x, y;

      PointDouble( double x, double y) {
             this. x = x;
             this. y = y;
      }

      public String toString() {
             return "x=" + x + ", y=" + y;
      }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值