百度地图API(四)

百度地图呈现

  前面工做已经完成,控件,方法等,这篇主要记录如何在WPF上呈现,还有坐标WGS-84转换为百度坐标的算法。php

WPF页面加载

  首先,要引用BaiduControl的项目,在window中引用算法

1 xmlns:BaiduMapControl="clr-namespace:BaiduMapControl;assembly=BaiduMapControl"

  在Grid中声明,命名为bmcBaiduMap,在控件上面,还加了一个隐藏的控件,是一个加载等待控件,由于百度地图API是一Web,没法在其上添加加载控件,因此就先定义了一个加载控件,设置为隐藏,加载的时候显示,加载完成隐藏。ide

1 <Grid>
2                                 <controls:WaitLoading x:Name="LoadingControl"
3                                                       Visibility="Collapsed" />
4                                 <BaiduMapControl:BaiduMap x:Name="bmcBaiduMap"
5                                                           Visibility="Visible"
6                                                           Opacity="0.5"
7                                                           Margin="0,0,0,0" />
8                             </Grid>

地图上的操做

  这里只写了一部分的操做,不过大致一致。google

  地图上加载一个UserMarkerspa

1 UserMarker um = new UserMarker(selectedUser.UserName);
2 bmcBaiduMap.SelectedUserMarker(um);

  地图上加载路线code

1 List<BaiduMapControl.MapBase.Point> pointList = new List<BaiduMapControl.MapBase.Point>();
2 //赋值
3 BaiduMapControl.MapService.UserRoute userRoute = new BaiduMapControl.MapService.UserRoute(pointList);
4 bmcBaiduMap.AddUserRoute(userRoute);

  清空全部覆盖物orm

1 BaiduMapControl.MapBase.MapControl mc = new BaiduMapControl.MapBase.MapControl();
2 bmcBaiduMap.ClearAllOverlay(mc);

  地图中心移动到某坐标xml

1 BaiduMapControl.MapBase.MapControl mc = new BaiduMapControl.MapBase.MapControl(lastPosition.Lng, lastPosition.Lat, mapSize);
2 bmcBaiduMap.MoveMapTo(mc);

坐标转换算法

  分了两部,第一步是将WGS-84(地球坐标系)转为GCJ-02(火星坐标系),第二部才是GCJ-02转为BD-09(百度坐标系)(好像百度地图官方有直接将WGS-84转为百度坐标系的接口,能够自行查找)htm

  地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法blog

 1 #region  地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法
 2 
 3         const double pi = 3.14159265358979324;
 4         //
 5         // Krasovsky 1940
 6         //
 7         // a = 6378245.0, 1/f = 298.3
 8         // b = a * (1 - f)
 9         // ee = (a^2 - b^2) / a^2;
10         const double a = 6378245.0;
11         const double ee = 0.00669342162296594323;
12 
13         /// <summary>
14         ///  World Geodetic System ==> Mars Geodetic System(GPS左边转换火星坐标)
15         /// </summary>
16         /// <param name="wgLat"></param>
17         /// <param name="wgLon"></param>
18         /// <param name="mgLat"></param>
19         /// <param name="mgLon"></param>
20         public static List<string> TransformGPSToBMap(double wgLat, double wgLon)
21         {
22             List<string> croods = new List<string>();
23             double mgLat;
24             double mgLon;
25             if (outOfChina(wgLat, wgLon))
26             {
27                 mgLat = wgLat;
28                 mgLon = wgLon;
29                 return bd_encrypt(mgLat,mgLon);
30             }
31 
32             double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
33             double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
34             double radLat = wgLat / 180.0 * pi;
35             double magic = Math.Sin(radLat);
36             magic = 1 - ee * magic * magic;
37             double sqrtMagic = Math.Sqrt(magic);
38             dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
39             dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
40             mgLat = wgLat + dLat;
41             mgLon = wgLon + dLon;
42 
43             return bd_encrypt(mgLat, mgLon);
44         }
45 
46         /// <summary>
47         /// 坐标是否出中国地区
48         /// </summary>
49         /// <param name="lat"></param>
50         /// <param name="lon"></param>
51         /// <returns></returns>
52         static bool outOfChina(double lat, double lon)
53         {
54             if (lon < 72.004 || lon > 137.8347)
55                 return true;
56             if (lat < 0.8293 || lat > 55.8271)
57                 return true;
58             return false;
59         }
60 
61         /// <summary>
62         /// 转换纬度
63         /// </summary>
64         /// <param name="x"></param>
65         /// <param name="y"></param>
66         /// <returns></returns>
67         static double transformLat(double x, double y)
68         {
69             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));
70             ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
71             ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
72             ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
73             return ret;
74         }
75 
76         /// <summary>
77         /// 转换经度
78         /// </summary>
79         /// <param name="x"></param>
80         /// <param name="y"></param>
81         /// <returns></returns>
82         static double transformLon(double x, double y)
83         {
84             double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
85             ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
86             ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
87             ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
88             return ret;
89         }
90 
91         #endregion
View Code

  火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法

 1 #region 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
 2 
 3         const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
 4 
 5         /// <summary>
 6         /// 将 GCJ-02(google地图) 坐标转换成 BD-09(百度地图) 坐标
 7         /// </summary>
 8         /// <param name="gg_lat"></param>
 9         /// <param name="gg_lon"></param>
10         /// <returns></returns>
11         public static List<string> bd_encrypt(double gg_lat, double gg_lon)
12         {
13             double bd_lat;
14             double bd_lon;
15             double x = gg_lon, y = gg_lat;
16             double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * x_pi);
17             double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * x_pi);
18             bd_lon = z * Math.Cos(theta) + 0.0065;
19             bd_lat = z * Math.Sin(theta) + 0.006;
20             return new List<string>() { bd_lon.ToString(), bd_lat .ToString()};
21         }
22 
23         /// <summary>
24         /// 将 BD-09 坐标转换成  GCJ-02  坐标
25         /// </summary>
26         /// <param name="bd_lat"></param>
27         /// <param name="bd_lon"></param>
28         /// <param name="gg_lat"></param>
29         /// <param name="gg_lon"></param>
30         void bd_decrypt(double bd_lat, double bd_lon, double gg_lat, double gg_lon)
31         {
32             double x = bd_lon - 0.0065, y = bd_lat - 0.006;
33             double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * x_pi);
34             double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * x_pi);
35             gg_lon = z * Math.Cos(theta);
36             gg_lat = z * Math.Sin(theta);
37         }
38 
39         #endregion
View Code

结束语

  百度地图API的使用到这就over,可能有些地方语言和代码都不太清晰,语文体育老师教的,体育课都是被英语老师占~其中也参考了好多大牛的文章,如今已经找不到了,对不住他们呀~如下是百度官方网址。

  百度地图官方网址:http://developer.baidu.com/map/reference/index.php

  百度API实例网址:http://developer.baidu.com/map/jsdemo.htm#h0_6