C#-winform地图定位的实现-百度地图API
2016-03-13 11:43
393 查看
C#-winform地图定位的实现-百度地图API
需求:从硬件设备获取GPS等信息,实时在地图上显示定位信息,同时可以查询一段时间内的位置轨迹。
TIP1:从硬件获取的原始GPS数据,最好经过转换成百度GPS坐标或者Google坐标之后再在地图上标出来,否则会存在较大偏差。
TIP2:百度API调用要有获得访问应用的AK,同时可以参考百度提供的丰富的API示例。
地址:http://developer.baidu.com/map/index.html http://developer.baidu.com/map/jsdemo.htm#a6_2
实现过程:winform中使用webBrowser控件,webBrowser控件用来装载并显示你要的地图。地图通过网页(.htm)文件来做,参考百度API示例,使用javascript代码来实现,标点和连线,标注文本框等功能。数据获取自文件(XML)或者数据库中的经纬度数据(可以通过百度拾点工具去做测试数据)。大概画了个框图。
htm实现(定点例):javascript代码中,创建XML解析器,添加地图,设置显示文本窗口;解析XML文件,获得时间、位置等有效信息;标点、添加图层。代码示例:
上面ak的值,大家申请好之后要填写自己的。我注释了后三位。下面是javascript的function函数
百度API提供了很详细的实例,复杂功能也有,大家可以去上面的地址参考一下。
XML文件(定位例)实现:
最终的效果实测图:
定位图:
轨迹实测图:
总结:轨迹的显示差强人意,可能是GPS数据上传的周期较长的原因,另外实测过程中会出现大量GPS点完全一致的情况,不知道是不是原始GPS数据经过转换成百度地图数据之后的原因,图中的点的间隔也不是很均匀。
需求:从硬件设备获取GPS等信息,实时在地图上显示定位信息,同时可以查询一段时间内的位置轨迹。
TIP1:从硬件获取的原始GPS数据,最好经过转换成百度GPS坐标或者Google坐标之后再在地图上标出来,否则会存在较大偏差。
TIP2:百度API调用要有获得访问应用的AK,同时可以参考百度提供的丰富的API示例。
地址:http://developer.baidu.com/map/index.html http://developer.baidu.com/map/jsdemo.htm#a6_2
实现过程:winform中使用webBrowser控件,webBrowser控件用来装载并显示你要的地图。地图通过网页(.htm)文件来做,参考百度API示例,使用javascript代码来实现,标点和连线,标注文本框等功能。数据获取自文件(XML)或者数据库中的经纬度数据(可以通过百度拾点工具去做测试数据)。大概画了个框图。
htm实现(定点例):javascript代码中,创建XML解析器,添加地图,设置显示文本窗口;解析XML文件,获得时间、位置等有效信息;标点、添加图层。代码示例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css"> body, html{width: 100%;height: 100%;margin:0;font-family:"微软雅黑";} #allmap{height:423px;width:100%;} </style> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=HudrPv3onektDMvvIwPEo***"></script> <script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script> <title>经纬度定位</title> </head> <body> <div id="allmap"></div> </body> </html>
上面ak的值,大家申请好之后要填写自己的。我注释了后三位。下面是javascript的function函数
function myTimer() { ///step1:连接数据库,获取最后一行的温度、位置、时间信息 ///step2:是否需要进行GSP坐标转换为百度坐标 ///step3:显示定位点,以及标注信息(GPS坐标、温度、时间) //step1:读取XML数据信息 xmlDoc.async = false; xmlDoc.resolveExternals = false; xmlDoc.load("FE68CD.xml"); //装载XML文件 var arrNodes = xmlDoc.getElementsByTagName('message'); //获取当前一组温度、经纬度、设备号、时间信息 Num = arrNodes.length; SheBeiHao = arrNodes[Num - 1].childNodes[0].childNodes[0].nodeValue; WenDu = arrNodes[Num - 1].childNodes[1].childNodes[0].nodeValue; JinDu = arrNodes[Num - 1].childNodes[2].childNodes[0].nodeValue; WeiDu = arrNodes[Num - 1].childNodes[3].childNodes[0].nodeValue; ShiJian = arrNodes[Num - 1].childNodes[4].childNodes[0].nodeValue; //2014/12/24 星期三修改,GPS转百度点在后台已经做过,不需要转换直接显示即可 ///step2:是否需要进行GSP坐标转换为百度坐标 ///step3:显示定位点,以及标注信息(GPS坐标、温度、时间) //清除所有地图覆盖物 map.clearOverlays(); var BaiDuPoint = new BMap.Point(JinDu, WeiDu); map.centerAndZoom(BaiDuPoint, 17); //设置中心点和显示等级 infoWindow.setContent("设备号:" + SheBeiHao + ";温度:" + WenDu + ";经度:" + BaiDuPoint.lng + ";纬度:" + BaiDuPoint.lat + ";时间:" + ShiJian); var marker = new BMap.Marker(BaiDuPoint); map.addOverlay(marker); map.openInfoWindow(infoWindow, BaiDuPoint); //打开信息窗口 map.setCenter(BaiDuPoint); //以当前的坐标点为中心显示 }
百度API提供了很详细的实例,复杂功能也有,大家可以去上面的地址参考一下。
XML文件(定位例)实现:
<?xml version="1.0" encoding="utf-8"?> <root> <message Num="1"> <DeviceId>FE68CD</DeviceId> <Temp>24.7℃</Temp> <Location_Lng>120.27748457854</Location_Lng> <Location_Lat>31.489598073044</Location_Lat> <Time>2015-10-26 16:26:05</Time> </message> </root>
最终的效果实测图:
定位图:
轨迹实测图:
总结:轨迹的显示差强人意,可能是GPS数据上传的周期较长的原因,另外实测过程中会出现大量GPS点完全一致的情况,不知道是不是原始GPS数据经过转换成百度地图数据之后的原因,图中的点的间隔也不是很均匀。
相关文章推荐
- C#窗体中利用richtextbox控件,打开指定word文件,并进行编辑保存等操作,出现Office或者是Interop未定义的解决方案
- C#第十三节课
- 推荐学习C#的地方
- c#中Partial关键字的作用
- c# lock (obj) 与 lock (this) 区别
- C#虚函数virtual详解
- C#中sleep和wait的区别分析
- C#—数组
- VS2010中,无法嵌入互操作类型
- 总结以下三种方法,实现c#每隔一段时间执行代码:
- C# 数组
- C#冒泡排序法
- C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法
- c#教程之事件处理函数的参数
- C#...何时需要重写ToString()方法?
- C#中的函数式编程
- C# Winform程序获取外网IP地址
- C# 委托delegate 回调方法 多路广播 的通俗解释
- new在c#方法中的使用
- C# 计算标准偏差相当于Excel中的STDEV函数