百度地图API(四)

百度地图呈现

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

WPF页面加载

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

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

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

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>

地图上的操作

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

  地图上加载一个UserMarker

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

  地图上加载路线

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

  清空所有覆盖物

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

  地图中心移动到某坐标

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转为百度坐标系的接口,可以自行查找)

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

 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

  火星坐标系 (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

结束语

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

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

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

时间: 2024-10-20 05:51:17

百度地图API(四)的相关文章

【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注

原文:[百度地图API]建立全国银行位置查询系统(四)--如何利用百度地图的数据生成自己的标注 摘要: 上一章留个悬念,"如果自己没有地理坐标的数据库,应该怎样制作银行的分布地图呢?" 答案就是,利用百度地图上的数据. ---------------------------------------------------------------------------------------------- 我们不用花大把时间写代码去跑数据,只需要利用百度地图API提供的免费接口,就可以

Android应用中使用百度地图API定位自己的位置(二)

官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发者们提供了如下类型的地图覆盖物: 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标): Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层: 路线图层(RouteOverlay):公交.步行和驾车线路图层,将公交.步行和驾车出行方案的路线及关键点显示在地图上(起.终

VUE之使用百度地图API

利用vue创建点餐系统,在点餐系统中需要知道商家地址信息,这时就需要借用百度地图API. 步骤一:申请百度地图密钥: 步骤二:在index.html中添加百度地图JavaScript API接口: <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=KCzp8claYra8uYAvahElV9oKUT6j7Gx1" ></script> 步

百度地图API

本文我将从如何使用地图API(本文以百度为例,谷歌类似)开始,往后的扩展行的内容详见后续文章.1.打开链接http://developer.baidu.com/map/jshome.htm  这里有很多DEMO,或者你直接百度搜索“百度地图API”,第一个就是.进入后有很多方向供你选择,由于现在开源的地图API都是JS脚本写的,所以我上面的链接就只针对JAVASCRIPT进行介绍.  即使是编程菜鸟(像我这种),也知道当你在任何一个开发环境下写代码时,都需要加入头文件,例如,你要在C++里使用c

百度地图API和高德地图API资料集锦

[高德地图API]从零开始学高德JS API(五)路线规划--驾车|公交|步行 [高德地图API]从零开始学高德JS API(四)搜索服务--POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 [高德地图API]从零开始学高德JS API(三)覆盖物--标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 [高德地图API]从零开始学高德JS API(二)地图控件与插件--测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 [高德地图API]从零开始学高德JS API

百度地图API —— 制作多途经点的线路导航

[百度地图API]如何制作多途经点的线路导航--驾车篇 摘要: 休假结束,酸奶小妹要从重庆驾车去北京.可是途中要去西安奶奶家拿牛奶饼干呢!用百度地图API,能不能帮我实现这个愿望呢? ------------------------------------------------------------------------------------------------------------------------ 一.创建地图 首先要告诉大家的是,API1.2版本取消密钥,取消服务设置,

百度地图API简单应用——1.根据地址查询经纬度

这几天比较空闲,就接触了下百度地图的API(开发者中心链接地址:http://developer.baidu.com),发现调用还是挺方便的.只要简单几步注册下,就可以获得一个Key,就能直接调用(PS:好像1.3版本前的无需注册获取key,就能直接调用api). 想着能结合到自己的项目中去,那也挺不错的.看了园子中的几篇文章,感觉甚好,想自己也动手试试.在调用百度地图API的时候,经纬度的获取必然是关键,那么怎么样获取到经纬度的值呢?这是一个最首要解决的问题.通过查询资料,看了几个例子,得知了

C#调用百度地图API入门&amp;解决BMap未定义问题

本文主要是最近帮助好友研究JavaScript的百度地图API,同时显示到C# Winform界面.同时遇到了BMap未定义的错误(BMap is not defined)及解决方法.以前写过基于Android的百度地图,其实原理都差不多,希望文章对你有所帮助吧! 一. C#显示百度地图 使用C# Winform显示百度地图主要包括两个步骤: 1.调用百度地图API,通过申请的密钥AK访问JavaScript版本地图: 2.再在C#中webBrowser浏览器控件中访问JS文件,显示地图到窗口.

【百度地图API】如何制作多途经点的线路导航——驾车篇

转:http://www.cnblogs.com/milkmap/archive/2011/08/26/2154627.html 摘要: 休假结束,酸奶小妹要从重庆驾车去北京.可是途中要去西安奶奶家拿牛奶饼干呢!用百度地图API,能不能帮我实现这个愿望呢? ------------------------------------------------------------------------------------------------------------------------