将一串gps轨迹纠偏为绑路的轨迹
超图需要购买服务,而百度和高德提供了免费接口,百度还额外提供了鹰眼平台管理这些数据,所以这次预研了下鹰眼地图。
具体思路为:
1.添加终端
2.上传点位
3.查询纠偏后轨迹
百度鹰眼api地址:http://lbsyun.baidu.com/index.php?title=yingyan/api/v3/trackupload
这里介绍下鹰眼功能模块:
终端:可以理解为设备、人、车,为移动轨迹的载体;
点位:可以理解为终端在时间轴上的单位位置信息;
纠偏:普通的纠偏在webGis内的概念主要是不同地图厂商投影坐标系不同产生了误差,需要坐标系转换,这里用于轨迹的纠偏,分为去噪、抽稀、绑路,
去噪,则是去除前后时间轴上方差过大的点,简言之就是速度100码,但前一个点在西湖,后一个点已在湘湖,偏差过大了,也可能根据radius精度判断,
抽稀,则是去除重复性太大的点,点位一秒上传一次,但一条100米的路却因为开的慢上传了上万个点,轨迹几乎是直线,优化下,
绑路,则是将点位纠正到道路上,对点位进行最近距离的路网信息进行搜索,然后选取最适道路绑定,坐标也做一个纠正
轨迹:可以理解为终端在时间轴上的历史位置展示,可根据速度分析出停留点、驾驶行为、里程信息;
围栏:可以理解为一个多边形区域,终端在一个时间段在区域外,或在区域内但不满足限速,产生出栏、超速、低速、停止等可报警元素。
踩坑1:addpoints批量上传点位接口,反复出现loc_time类型不匹配,经查,不是类型不匹配,而可能原因有
1、loc_time是unix时间戳,取得是秒数,js举例为Math.round((new Date()).getTime()/1000)
2、loc_name时间小于了或重复了原已存在点位时间
3、entity_name不存在
4、掺夹了没有添加的自定义字段
踩坑2:gettrack查不出纠偏后数据
原因:addpoints上传的点位只有经纬度,并没有设模拟的方向和速度
解决:速度暂设100km/h,而方向则根据前后两个点形成的向量算出与y正轴顺时针的方向夹角即可。
踩坑3:gettrack无法查询出wgs84坐标系的数据,只支持百度和国测局,百度公开的坐标转换api
http://api.map.baidu.com/geoconv/v1/?coords=x,y&from=1&to=5
无法将百度或国测局转化为wgs84坐标系;
解决:找到另一个百度不公开的api转换,还是不行,链接如下:
http://api.map.baidu.com/ag/coord/convert?from=0&to=2&x=longitude&y=latitude
民间算法不准确,
最后办法为addPoint上传wgs84,然后gettrack查出未绑路的gcj02,算出这两条线的平均偏移,
再gettrack查出绑路后的gcj02,减去之前算出的偏移,算出绑路后的wgs84。
因为这两者距离很小,可以避开国测局大范围的不同经纬区块偏移策略,偏移基本够用,误差很小。