WGS-84 coordinate system: using the global positioning system, GPS, Compass
GCJ-02 coordinate system: use in China, offset by the WGS-84 from
BD-09 coordinate system: dedicated Baidu, offset from the GCJ-02
(PS: from project requirements, wanted to read the latitude and longitude of the picture displayed on Baidu offline maps later found positioning deviation too, think carefully, the original picture and the coordinate system used by Baidu is not the same.
Calculation converting section
public class GPSChange { Private const Double PI = 3.14159265358979324 ; Private const Double x_pi = 3.14159265358979324 * 3000.0 / 180.0 ; // Ke Lasuo days Gaussian ellipsoid parameters Private const Double A = 6,378,245.0 ; // first eccentricity Private const Double EE = .00669342162296594323 ; /// <Summary> /// GCJ-02 09-converting the BD /// </ Summary> /// <param name="gg_lat">纬度</param> /// <param name="gg_lon">经度</param> /// <returns></returns> public static GPSPoint GCJ02_to_BD09(double gg_lat, double gg_lon) { GPSPoint point = new GPSPoint(); double x = gg_lon, y = gg_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 bd_lon = z * Math.Cos(theta) + 0.0065; double bd_lat = z * Math.Sin(theta) + 0.006; point.SetLat(bd_lat); point.SetLng(bd_lon); return point; } /// <summary> /// BD-09转换GCJ-02 /// </summary> /// <param name="bd_lat">纬度</param> /// <param name="bd_lon">经度</param> /// <returns></returns> public static GPSPoint BD09_to_GCJ02(double bd_lat, double bd_lon) { GPSPoint point = new GPSPoint(); double x = bd_lon - 0.0065, y = bd_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 gg_lon = z * Math.Cos(theta); double gg_lat = z * Math.Sin(theta); point.SetLat(gg_lat); point.SetLng(gg_lon); return point; } /// <summary> /// WGS-84转换GCJ-02 /// </summary> /// <param name="wgLat">纬度</param> /// <param name="wgLon">经度</param> /// <returns></returns> public static GPSPoint WGS84_to_GCJ02(double wgLat, double wgLon) { GPSPoint point = new GPSPoint(); if (OutOfChina(wgLat, wgLon)) { point.SetLat(wgLat); point.SetLng(wgLon); return point; } double dLat = TransformLat(wgLon - 105.0, wgLat - 35.0); double dLon = TransformLon(wgLon - 105.0, wgLat - 35.0); double radLat = wgLat / 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 lat = wgLat + dLat; double lon = wgLon + dLon; point.SetLat(lat); point.SetLng(lon); return point; } public static void Transform(double wgLat, double wgLon, double[] latlng) { if (OutOfChina(wgLat, wgLon)) { latlng[0] = wgLat; latlng[1] = wgLon; return; } double dLat = TransformLat(wgLon - 105.0, wgLat - 35.0); double dLon = TransformLon(wgLon - 105.0, wgLat - 35.0); double radLat = wgLat / 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); latlng [ 0 ] = + wgLat dLat; latlng [ 1 ] + = wgLon dLon; } Private Static bool OutOfChina ( double lat, double moose) { IF (moose < 72,004 || moose> 137.8347 ) return true ; IF (lat < 0.8293 || lat > 55.8271) return true; return false; } private 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 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 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; } private 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 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0; ret += (20.0 * Math.Sin(x * pi) + 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; } }
Foundation Classes
public class GPSPoint { private double lat;// 纬度 private double lng;// 经度 public GPSPoint() { } public GPSPoint(double lng, double lat) { this.lng = lng; this.lat = lat; } public double GetLat() { return lat; } public void SetLat(doublelat) { this .lat = lat; } Public double GetLng () { return i; } Public void SetLng ( double u) { this .lng = lng; } }