百度地图之实时定位与画轨迹以及纠偏问题总结

来源:互联网 发布:推荐软件推荐 知乎 编辑:程序博客网 时间:2024/05/16 12:22

百度地图API也有一段时间了,在这里我想分享一下我的心得,之前也发过一篇文章关于定位的,感觉是有些 地方不妥吧,所以借此来重新梳理一下。

我们公司的需求呢,就是实时定位自己,然后点开始记录按钮,就开始向服务器端发送自己的经纬度信息,接着点结束记录的话就停止发送坐标,这么一来一个记录就产生了,包含全局唯一标识符GUID、记录时间以及该次记录的所有坐标。当点开这条记录的时候可以看绘制的路径以及起点与终点。

--------------------------------------------------------------------------------------------------------------------

1.照顾百度地图新手,在百度地图开发之前,你需要一个密钥    点我进入申请密钥链接   在这里我就不写上自己的密钥了 大家用自己的就行。

2. 点我进入百度地图JavaScript Demo示例    点击前面的链接,里面都是基于JavaScript的百度地图api的demo,在demo里面把“你的密钥”替换掉就行。自己先写几个demo,复制粘贴就行,主要是熟悉一下。

3. 首先是定位,百度提供了浏览器定位、根据IP定位、根据城市名定位、根据经纬度定位;如果你们公司后台可以给你提供精准的坐标,你就可以根据经纬度定位啦,但是你要先看看要不要先进行纠偏(把GPS或者Google坐标转化为百度坐标,在中国任何一个地图产品都不允许使用GPS坐标,据说是为了保密,每家地图公司都会有自己的加密偏移算法),直接上纠偏的代码,大家自己体会(自己改密钥),如果你们公司不提供坐标,那就跳过下面的代码吧!

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;}#l-map{height:100%;width:78%;float:left;border-right:2px solid #bcbcbc;}#r-result{height:100%;width:20%;float:left;}</style><script type="text/javascript" src="http://api.map.baidu.com/api?v=1.5&ak=你的密钥"></script><script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script><title>GPS转百度</title></head><body><div id="allmap"></div></body></html><script type="text/javascript">//GPS坐标var xx = 117.126575995835;var yy = 36.6702207308909;var gpsPoint = new BMap.Point(xx,yy);//地图初始化var bm = new BMap.Map("allmap");bm.centerAndZoom(gpsPoint, 15);bm.addControl(new BMap.NavigationControl());//添加谷歌marker和labelvar markergps = new BMap.Marker(gpsPoint);bm.addOverlay(markergps); //添加GPS标注var labelgps = new BMap.Label("我是GPS标注哦",{offset:new BMap.Size(20,-10)});markergps.setLabel(labelgps); //添加GPS标注//坐标转换完之后的回调函数translateCallback = function (point){    var marker = new BMap.Marker(point);    bm.addOverlay(marker);    var label = new BMap.Label("我是百度标注哦",{offset:new BMap.Size(20,-10)});    marker.setLabel(label); //添加百度label    bm.setCenter(point);    alert("转化为百度坐标为:"+point.lng + "," + point.lat);}setTimeout(function(){    BMap.Convertor.translate(gpsPoint,0,translateCallback);     //真实经纬度转成百度坐标}, 2000);</script>


4.没有提供坐标怎么办?注意看API中的定位实例里面有一个浏览器定位,在这里特地说一下不要用PC来定位,很不准。本人亲测用手机很准,但也有个几百米误差,当然不同手机,不同浏览器效果否不同,这是必然的,直接放个我写的demo吧, 大家看看误差多少  http://139.224.0.122:8080/map/DiTu01.html 

为什么不准呢,大家看一下网页版的百度地图吧点我进入百度地图官网 ,是不是也一样?所以就不要折腾了,这种偏移是不可避免 的了,H5的定位肯定是不如安卓或者ios的SDK的。由于他只定位一次,那么加个定时器就可以模拟实时定位了。

5.如何画轨迹?下面写上画坐标的代码,当ajax调用到后台数据之后,返回给你一串json,你将这些数据进行处理,循环遍历之后生成一个 [new BMap.Point(x1 ,y1) , new BMap.Point(x2 ,y2), new BMap.Point(x3 ,y3)...] 这样的数组,也就是下面代码中的arrs参数,另外红色部分就是画线的函数,strokeColor代表的是绘制的颜色,strokeWeight代表粗度,strokeOpacity代表透明度,最后用addOverlay添加到地图中就行。

        var arrs = [];        var Point;        //ajax调后台坐标        $.ajax({            url: "/Share/HuoQuZuoBiao",            type: "post",            data: {                DID: DID            },            success: function (msg) {                var json = eval(msg);                for (var i = 0; i < json.length; i++) {                    Point = new BMap.Point(json[i].XZhuoBiao, json[i].YZhuoBiao);                    arrs.push(Point);                }                    var line = new BMap.Polyline(arrs, { strokeColor: "black", strokeWeight: 4, strokeOpacity: 0.7 }); //创建弧线对象                    map.addOverlay(line); //添加到地图中            }        })


6.最后如何添加开始和结束的标注呢,首先,你得获取你这条记录的开始坐标和结束坐标,以这样的方式定义:

var firstPoint = new BMap.Point( 经度 , 纬度 ); //开始点var lastPoint = new BMap.Point( 经度 , 纬度 ); //结束点
   最最后就是添加标注了:

//起点标注var marker1 = new BMap.Marker(firstPoint); //将起点转化成标注点map.addOverlay(marker1);  //将起点标注点添加到地图上var label1 = new BMap.Label("起点", { offset: new BMap.Size(20, -10) });marker1.setLabel(label1);//终点标注var marker2 = new BMap.Marker(lastPoint); //将终点转化成标注点map.addOverlay(marker2);  //将终点标注点添加到地图上var label2 = new BMap.Label("终点", { offset: new BMap.Size(20, -10) });marker2.setLabel(label2);

7.文章最后提一下GPS转百度坐标的问题:

当我们兴匆匆地把GPS设备传来的经纬度坐标标记到电子地图上时,发现地图上的位置和实际位置相差甚远,这就是天朝上国特有的地图加偏,以安全之名,行掩耳盗铃之事,给我们的开发带来了不必要的麻烦,至于加偏的原因,大家百度一下,网上一大堆,这里就不废话了。除GPS设备本身加偏外,电子地图上的坐标也不是真实的,要想正确显示到地图上,还必须将收到的加偏坐标(俗称火星坐标)换算到地图对应的坐标,也就是我们常说的纠偏,而国内用的比较多的地图主要是谷歌和百度,前者有具体的控件,比较好解决,后者就麻烦了,本人这段时间为此事折腾得不轻,但功夫不费有心人,总算比较完美地解决了,故整理一下,给还在或将要受此折腾的人参考。和大多数人一样,碰到这个问题时,首先想到了百度,总结了百度结果,主要有以下三个方法:

1.使用控件

如果和谷歌地图一样,有一个控件,直接传入GPS坐标得到地图坐标,那就省事了,通过正常途径获取控件的话,我们这种小公司还没有那个实力,而非正常途经的控件或算法貌似还没有泄漏出来,即使泄漏了,你也不敢放心使用,万一有一天,被以泄漏“ 国家”的名义请你去喝茶就得不偿失了,因此,本方法基本放弃。

2.百度地图接口

百度网站提供了接口,只要通过http传入GPS坐标参数就可以获得对应的地图坐标,该方法优点是方便准确,不足也很明显,受网速、百度服务器等影响,处理大量并发业务时力不从心。

3.数据库

所谓的加偏,就是将真实坐标加上一定的偏移量,而这个偏移量又不是线性的,不同地区偏移不一样,但同一地区偏移量却差不多,因此,有人就使用了个暴力破解的方法,将全国按GPS坐标分成很多小块,然后查出每个小块的偏移量,并保存到数据库里面,需要纠偏时,先根据GPS坐标取出对应区域的偏移量,反算出地图坐标。优点:本地执行,速度快,缺点:中国太大了,存放区域的记录有几千万条,不仅占用了大量存储空间,检索速度也大受影响,更要命的是,网上也很难找到一个完整的数据库,有些网站说有完整的,但要Money,提到Money就不亲热了,毕竟我们是个人或小公司嘛,钱不是问题,问题是没钱。

貌似进入了一个死胡同,但我们仔细一想,数据库方法不错,但有点浪费,因为我们面向的客户大多是某区域的,而且,车辆行驶的路线相对是固定的(尤其是客运班车),塔克拉玛干沙漠或者居民小区楼顶的坐标对于我们来说,貌似没有多少意义,理论上,我们需要的仅仅是客户车辆行驶区域的坐标就可以了,车辆能到达的区域(通常是公路)相对整个国土面积来说,太小了,因此,有这么一个轻量级的数据库是不是就完美了呢?本文正是基于这一思路,将方法2和方法3结合起来,巧妙解决了百度地图纠偏问题。

基本原理:收到GPS坐标后,首先计算出该坐标所属的区域,然后再从本地数据库查询该区域的偏移量,如果查询到,直接和该偏移相加得到地图坐标,如果没有查询到,则从百度网站接口查询,并和GPS坐标相减得到偏移,将本偏移存放到本地数据库,然后直接返回从百度接口得到的地图坐标。换句话说,我们自己根据车辆使用过的坐标,构建了一个轻量级的数据库,使用一段时间后,我们会发现,绝大部分数据都是从本地数据库获取的,数据量也就区区几十万条而已。







0 0
原创粉丝点击