妈的,这么个技术点都成香馍馍了,人家老早把算法私下颁布了啊(呵呵,我们公司好像10多年也没搞定,也是我来搞定的,不过不是我写的,我抄来的,写过游戏的直觉是对的,估计也是sin一类的);
百度的二次偏移不支持,需要再次运算,以下算法为一次偏移纠偏运算(比如bing,google都只是一次偏移);
上个图证明是OK的哈,图中的是silverlight bingmap ——
代码继续往下——
1 internal class EvilTransform 2 { 3 private const double pi = 3.14159265358979324; 4 5 // 6 // Krasovsky 1940 7 // 8 // a = 6378245.0, 1/f = 298.3 9 // b = a * (1 - f) 10 // ee = (a^2 - b^2) / a^2; 11 private const double a = 6378245.0; 12 private const double ee = 0.00669342162296594323; 13 14 // 15 // World Geodetic System ==> Mars Geodetic System 16 public static void Transform(double wgLat, double wgLon, out double mgLat, out double mgLon) 17 { 18 if (OutOfChina(wgLat, wgLon)) 19 { 20 mgLat = wgLat; 21 mgLon = wgLon; 22 return; 23 } 24 double dLat = TransformLat(wgLon - 105.0, wgLat - 35.0); 25 double dLon = TransformLon(wgLon - 105.0, wgLat - 35.0); 26 double radLat = wgLat/180.0*pi; 27 double magic = Math.Sin(radLat); 28 magic = 1 - ee*magic*magic; 29 double sqrtMagic = Math.Sqrt(magic); 30 dLat = (dLat*180.0)/((a*(1 - ee))/(magic*sqrtMagic)*pi); 31 dLon = (dLon*180.0)/(a/sqrtMagic*Math.Cos(radLat)*pi); 32 mgLat = wgLat + dLat; 33 mgLon = wgLon + dLon; 34 } 35 36 private static bool OutOfChina(double lat, double lon) 37 { 38 if (lon < 72.004 || lon > 137.8347) 39 return true; 40 if (lat < 0.8293 || lat > 55.8271) 41 return true; 42 return false; 43 } 44 45 private static double TransformLat(double x, double y) 46 { 47 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)); 48 ret += (20.0*Math.Sin(6.0*x*pi) + 20.0*Math.Sin(2.0*x*pi))*2.0/3.0; 49 ret += (20.0*Math.Sin(y*pi) + 40.0*Math.Sin(y/3.0*pi))*2.0/3.0; 50 ret += (160.0*Math.Sin(y/12.0*pi) + 320*Math.Sin(y*pi/30.0))*2.0/3.0; 51 return ret; 52 } 53 54 private static double TransformLon(double x, double y) 55 { 56 double ret = 300.0 + x + 2.0*y + 0.1*x*x + 0.1*x*y + 0.1*Math.Sqrt(Math.Abs(x)); 57 ret += (20.0*Math.Sin(6.0*x*pi) + 20.0*Math.Sin(2.0*x*pi))*2.0/3.0; 58 ret += (20.0*Math.Sin(x*pi) + 40.0*Math.Sin(x/3.0*pi))*2.0/3.0; 59 ret += (150.0*Math.Sin(x/12.0*pi) + 300.0*Math.Sin(x/30.0*pi))*2.0/3.0; 60 return ret; 61 } 62 }
在来个算两点距离的(二维平面,不算三维的z哈)
1 public struct EarthPoint 2 { 3 public const double Ea = 6378137; // 赤道半径 WGS84标准参考椭球中的地球长半径(单位:m) 4 public const double Eb = 6356725; // 极半径 5 public readonly double Ec; 6 public readonly double Ed; 7 public readonly double Jd; 8 public readonly double Latidute; 9 public readonly double Longitude; 10 public readonly double Wd; 11 12 public EarthPoint(double longitude, double latidute) 13 { 14 Longitude = longitude; 15 Latidute = latidute; 16 Jd = Longitude*Math.PI/180; //转换成角度 17 Wd = Latidute*Math.PI/180; //转换成角度 18 Ec = Eb + (Ea - Eb)*(90 - Latidute)/90; 19 Ed = Ec*Math.Cos(Wd); 20 } 21 22 public double Distance(EarthPoint point) 23 { 24 double dx = (point.Jd - Jd)*Ed; 25 double dy = (point.Wd - Wd)*Ec; 26 return Math.Sqrt(dx*dx + dy*dy); 27 } 28 29 public static double GetDistance( 30 double latidute1, 31 double longitude1, 32 double latidute2, 33 double longitude2) 34 { 35 var p1 = new EarthPoint(longitude1, latidute1); 36 var p2 = new EarthPoint(longitude2, latidute2); 37 return p1.Distance(p2); 38 } 39 }