GPS 经度纬度 坐标转换的以色列横轴墨卡托投影(ITM)

百度谷歌很多只找到了js版本的。没办法 扒代码转换成了C#语言的  ,估计有人会需要 伸手党接好。没有整理函数 直接按步骤扒的 。参考用吧!

js 版本 :github :https://github.com/nonZero/js-itm

  public string gpsToItm(double lat,double lng )// JS GPS转换ITM  扒来的
        { 
            double grs80_a = 6378137;
            double grs80_b = 6356752.31414;
            double grs80_e2 = (System.Math.Pow(grs80_a, 2) - System.Math.Pow(grs80_b, 2)) / System.Math.Pow(grs80_a, 2);

            double wgs84_a = 6378137;
            double wgs84_b = 6356752.314245;
            double wgs84_e2 = (System.Math.Pow(wgs84_a, 2) - System.Math.Pow(wgs84_b, 2)) / System.Math.Pow(wgs84_a, 2);

            double dx = 48;
            double dy = -55;
            double dz = -52;

            double radlat = lat * (System.Math.PI / 180);
            double radlng = lng * (System.Math.PI / 180);
            double alt = 0 ;
            double V = wgs84_a / (System.Math.Sqrt(1 - (wgs84_e2 * (System.Math.Pow(System.Math.Sin(radlat), 2)))));

            double x = (V + alt) * (System.Math.Cos(radlat)) * (System.Math.Cos(radlng));
            double y = (V + alt) * (System.Math.Cos(radlat)) * (System.Math.Sin(radlng));
            double z = ((V*(1-grs80_e2))+alt)*(System.Math.Sin(radlat));


            double point_x  = x +dx;
            double point_y = y+dy;
            double point_z = z + dz;


            double RootXYSqr = System.Math.Sqrt(Math.Pow(point_x, 2) + Math.Pow(point_y, 2));
            double radlat1 = Math.Atan2(point_z, (RootXYSqr * (1 - grs80_e2)));
            double V1, radlat2;
            do
            {
                 V1 = grs80_a / (Math.Sqrt(1 - (grs80_e2 * Math.Pow(Math.Sin(radlat1), 2))));
                radlat2 = Math.Atan2((point_z+(grs80_e2*V1*(Math.Sin(radlat1)))),RootXYSqr);
                if (Math.Abs(radlat1 - radlat2) > 0.000000001)
                {
                    radlat1 = radlat2;
                }
                else {
                    break;
                }
            }
            while (true);
            double lat_itm = radlat2 * (180 / Math.PI);
            double lng_itm = Math.Atan2(point_y, point_x) * (180 / Math.PI);

            double RadPHI = lat_itm * (Math.PI / 180);
            double RadLAM = lng_itm * (Math.PI / 180);


            double e0 = 219529.58400;   //east
            double n0 = 626907.38999;   //north
            double f0 = 1.000006700000000;
            double lat0 = 31.734394;
            double lng0 = 35.204517;
            double radlat0 = lat0*(Math.PI / 180);
            double radlng0 = lng0*(Math.PI / 180);
            double af0  = grs80_a *f0;
            double bf0 = grs80_b *f0;
            double e2 = (Math.Pow(af0,2)-Math.Pow(bf0,2))/Math.Pow(af0,2);
            double n = (af0-bf0)/(af0+bf0);
            double n2 = n*n;
            double n3 = n2*n;



            double nu = af0 / (Math.Sqrt(1 - (e2 * Math.Pow(Math.Sin(RadPHI), 2))));

            double rho = (nu * (1 - e2)) / (1 - (e2 * Math.Pow(Math.Sin(RadPHI), 2)));
            double eta2 = (nu / rho) - 1;
            double p = RadLAM - radlng0;

            double M = bf0 * (
            ((1 + n + ((5 / 4) * n2) + ((5 / 4) * n3)) * (RadPHI - radlat0)) -
            (((3 * n) + (3 * n2) + ((21 / 8) * n3)) * (Math.Sin(RadPHI - radlat0)) * (Math.Cos(RadPHI + radlat0))) +
            ((((15 / 8) * n2) + ((15 / 8) * n3)) * (Math.Sin(2 * (RadPHI - radlat0))) * (Math.Cos(2 * (RadPHI + radlat0)))) -
            (((35 / 24) * n3) * (Math.Sin(3 * (RadPHI - radlat0))) * (Math.Cos(3 * (RadPHI + radlat0))))
        );




            double I = M + n0;
            double II = (nu / 2) * (Math.Sin(RadPHI)) * (Math.Cos(RadPHI));
            double III = ((nu / 24) * (Math.Sin(RadPHI)) * (Math.Pow(Math.Cos(RadPHI), 3))) * (5 - (Math.Pow(Math.Tan(RadPHI), 2)) + (9 * eta2));
            double IIIA = ((nu / 720) * (Math.Sin(RadPHI)) * (Math.Pow(Math.Cos(RadPHI), 5))) * (61 - (58 * (Math.Pow(Math.Tan(RadPHI), 2))) + (Math.Pow(Math.Tan(RadPHI), 4)));

            double yy = I + (Math.Pow(p, 2) * II) + (Math.Pow(p, 4) * III) + (Math.Pow(p, 6) * IIIA);

            double IV = nu * (Math.Cos(RadPHI));
            double VII = (nu / 6) * (Math.Pow(Math.Cos(RadPHI), 3)) * ((nu / rho) - (Math.Pow(Math.Tan(RadPHI), 2)));
            double VI = (nu / 120) * (Math.Pow(Math.Cos(RadPHI), 5)) * (5 - (18 * (Math.Pow(Math.Tan(RadPHI), 2))) + (Math.Pow(Math.Tan(RadPHI), 4)) + (14 * eta2) - (58 * (Math.Pow(Math.Tan(RadPHI), 2)) * eta2));

            double xx = e0 + (p * IV) + (Math.Pow(p, 3) * VII) + (Math.Pow(p, 5) * VI);

          int realy_lat= (int) Math.Round(xx);
          int realy_lng = (int ) Math.Round(yy);

            return  realy_lat.ToString()
                + " " + realy_lng.ToString();
         }

你可能感兴趣的:(经验之谈)