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); } }