GPS, Google, Baidu, high moral coordinate conversion

Turn: https: //blog.csdn.net/bopisky/article/details/80756322

public  class GpsUtil
{
    public static double pi = 3.1415926535897932384626;
    public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    public static double a = 6378245.0;
    public static double ee = 0.00669342162296594323;

    public static double TransformLat(double x, double y)
    {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                + 0.2 * Math.Sqrt(Math.Abs(x));
        RET + = ( 20.0 * Math.Sin ( 6.0 * pi * x) + 20.0 * Math.Sin ( 2.0 * pi * x)) * 2.0 / 3.0 ;
        ret + = ( 20.0 * Math.sin (y * pi) + 40.0 * Math.sin (y / 3.0 * pi)) * 2.0 / 3.0 ;
        ret + = ( 160.0 * math.sin (and / 12.0 * pi) + 320 * math.sin (y * pi / 30.0 )) * 2.0 / 3.0 ;
        return ret;
    }

    public static double TransformLon(double x, double y)
    {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                * Math.Sqrt(Math.Abs(x));
        RET + = ( 20.0 * Math.Sin ( 6.0 * pi * x) + 20.0 * Math.Sin ( 2.0 * pi * x)) * 2.0 / 3.0 ;
        RET + = ( 20.0 * Math.Sin (pi * x) + 40.0 * Math.Sin (x / 3.0 * pi)) * 2.0 / 3.0 ;
        ret + = ( 150.0 * Math.Sin (x / 12.0 * pi) + 300.0 * Math.Sin (x / 30.0 
                * pi)) * 2.0 / 3.0 ;
        return ret;
    }

    public static double[] transform(double lat, double lon)
    {
        if (OutOfChina(lat, lon))
        {
            return new double[] { lat, lon };
        }
        double dLat = TransformLat (moose - 105.0 , lat - 35.0 );
        double dLon = TransformLon (moose - 105.0 , lat - 35.0 );
        double radLat = lat / 180.0 * pi;
        double magic = Math.Sin (radLat);
        magic = 1 - ee * magic * magic;
        double SqrtMagic = Math.Sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi);
        dLon = (* dLon 180.0 ) / (a / * SqrtMagic Math.Cos (radLat) * pi);
        double mgLat lat = + dLat;
        double mgLon moose = + dLon;
        return  new  double [] {mgLat, mgLon};
    }

    public static bool OutOfChina(double lat, double lon)
    {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }

    /** 
        * 84 to Mars coordinate system (GCJ-02) World Geodetic System ==> Mars Geodetic System 
        * 
        * @Param years 
        * @param lon 
        * @return 
        */
    public static double[] Gps84ToGcj02(double lat, double lon)
    {
        if (OutOfChina(lat, lon))
        {
            return new double[] { lat, lon };
        }
        double dLat = TransformLat (moose - 105.0 , lat - 35.0 );
        double dLon = TransformLon (moose - 105.0 , lat - 35.0 );
        double radLat = lat / 180.0 * pi;
        double magic = Math.Sin (radLat);
        magic = 1 - ee * magic * magic;
        double SqrtMagic = Math.Sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi);
        dLon = (* dLon 180.0 ) / (a / * SqrtMagic Math.Cos (radLat) * pi);
        double mgLat lat = + dLat;
        double mgLon moose = + dLon;
        return  new  double [] {mgLat, mgLon};
    }

    /** 
        * * Mars coordinates 84 * * @param lon * @param lat Department (GCJ-02) to * @return 
        * */
    public static double[] Gcj02ToGps84(double lat, double lon)
    {
        double[] gps = transform(lat, lon);
        double lontitude = lon * 2 - gps[1];
        double latitude = lat * 2 - gps[0];
        return new double[] { latitude, lontitude };
    }
    ///  <the Summary> 
    /// Mars coordinate system (GCJ-02) and Baidu coordinate system (BD-09) conversion algorithm converts GCJ-02 coordinates into BD-09 coordinates 
     /// High Vale de song into Baidu
     / //  </ Summary> 
    ///  <param name = "LAT"> </ param> 
    ///  <param name = "LON"> </ param> 
    ///  <Returns> </ Returns> 
    public  static  Double [ ] Gcj02ToBd09 ( Double LAT, Double LON)
    {
        double x = lon, y = lat;
        double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * x_pi);
        double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * x_pi);
        double tempLon = z * Math.Cos(theta) + 0.0065;
        double tempLat = z * Math.Sin(theta) + 0.006;
        double[] gps = { tempLat, tempLon };
        return gps;
    }

    ///  <the Summary> 
    /// Mars coordinate system (GCJ-02) and Baidu coordinate system (BD-09) * * conversion algorithm to convert the BD-09 coordinates into GCJ-02 coordinates
     /// Baidu coordinates to a high Germany Google coordinates
     ///  </ the Summary> 
    ///  <param name = "LAT"> </ param> 
    ///  <param name = "LON"> </ param> 
    ///  <returns A> </ returns A> 
    public  static  Double [] Bd09ToGcj02 ( Double LAT, Double LON)
    {
        double x = lon - 0.0065, y = lat - 0.006;
        double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * x_pi);
        double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * x_pi);
        double tempLon = z * Math.Cos(theta);
        double tempLat = z * Math.Sin(theta);
        double[] gps = { tempLat, tempLon };
        return gps;
    }

    ///  <Summary> 
    /// gps84 Switch bd09
     /// the GPS coordinates into coordinates Baidu
     ///  </ Summary> 
    ///  <param name = "LAT"> </ param> 
    ///  <param name = "LON"> </ param> 
    ///  <Returns> </ Returns> 
    public  static  Double [] Gps84ToBd09 ( Double LAT, Double LON)
    {
        double[] gcj02 = Gps84ToGcj02(lat, lon);
        double[] bd09 = Gcj02ToBd09(gcj02[0], gcj02[1]);
        return bd09;
    }
    /// <summary>
    /// 百度坐标转成GPS坐标
    /// </summary>
    /// <param name="lat"></param>
    /// <param name="lon"></param>
    /// <returns></returns>
    public static double[] Bd09ToGps84(double lat, double lon)
    {
        Double [] = gcj02 Bd09ToGcj02 (LAT, LON);
         Double [] = gps84 Gcj02ToGps84 (gcj02 [ 0 ], gcj02 [ . 1 ]);
         // After six decimal places   
        gps84 [ 0 ] = Retain6 (gps84 [ 0 ]);
        gps84[1] = Retain6(gps84[1]);
        return gps84;
    }

    ///  <Summary> 
    /// decimal places six 
     ///  </ Summary> 
    ///  <param name = "NUM"> </ param> 
    ///  <Returns> </ Returns> 
    Private  static  Double Retain6 ( Double NUM)
    {
        String result = String.Format("%.6f", num);
        return Double.Parse(result);
    }
}

 

Guess you like

Origin www.cnblogs.com/OleRookie/p/11904859.html