之前用过百度地图Android SDK,觉得功能很强大,而且工具封装的很好,语句写出来也很好懂,照着官方的例子就能很快学会。这会儿需要在WPF程序中实现,只能用百度地图JavaScript API了。要实现的功能是:程序不断获得到GPS坐标信息,并将轨迹显示在地图上,标注出最后一个位置。这其中还涉及到了百度坐标转换API。
首先当然要在xaml中加入一个控件WebBrowser用来显示HTML页面。
<WebBrowser x:Name="map" />在MainWindow的构造函数中,加入以下内容,使WebBrowser加载我们需要加载的HTML文件。这里文件名为"map.html"。
Uri mapUri = new Uri(@"map.html"); map.Navigate(mapUri);程序获取到一个新的GPS坐标点,利用WebBrowser控件调用JavaScript里的函数move(lat, lng)。
double lat = 39.918; double lng = 116.409; map.InvokeScript("move", new object[] {lat, lng });map.html里的内容如下(因为懒所以直接把Javascript代码写到HTML里了)
<!DOCTYPE html> <html> <!-- saved from url=(0014)about:internet --> <head> <meta http-equiv="X-UA-Compatible" content="IE=9" > <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Hello, World</title> <!--标题--> <style type="text/css"> html{height:100%} body{height:100%;margin:0px;padding:0px} #container{height:100%} </style> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=8pEG3G7pYGIya6gaHGcU8pbE"> //v2.0版本的引用方式:src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥" </script> </head> <body> <div id="container"></div> <script type="text/javascript"> var map = new BMap.Map("container"); // 创建地图实例 var point = new BMap.Point(116.404, 39.915); // 创建点坐标 map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别 var opts = {type: BMAP_NAVIGATION_CONTROL_SMALL} // 设置地图类型控件样式为小型 map.addControl(new BMap.NavigationControl(opts)); // 添加地图类型控件 var lastpoint = null; // 最后一次到达的点(百度坐标) var marker; // 当前位置的标注 translateCallback = function (data){ // 百度坐标转换回调函数 if(data.status === 0) { // 转换成功 var newpoint = data.points[0]; // 新到达的点(百度坐标) if (lastpoint != null) { var polyline = new BMap.Polyline([ lastpoint, newpoint ], {strokeColor:"red", strokeWeight: 6, strokeOpacity: 0.5}); map.addOverlay(polyline); // 如果最后一次到达的点不为空,则在地图上添加一条线 } map.removeOverlay(marker); // 删除之前的标注 marker = new BMap.Marker(newpoint); // 根据新到达的点创建标注 map.addOverlay(marker); // 将标注添加到地图中 map.panTo(newpoint); // 移动地图中心到新到达的点 lastpoint = newpoint; // 修改最后一次到达的点 } } function move(lat, lng) { var convertor = new BMap.Convertor(); // 新建一个坐标转换器 var pointArr = []; var ggPoint = new BMap.Point(lng, lat); // 将要转换的坐标(GPS坐标) pointArr.push(ggPoint); // 把坐标添加到转换数组中 convertor.translate(pointArr, 1, 5, translateCallback); // 调用百度坐标转换,设置回调函数为translateCallback } </script> <style type="text/css"> .anchorBL{ display:none; } /*去除百度地图版权信息,不建议这么做*/ </style> </body> </html>
最终效果如图。