实时公交位置系统的实现 博客分类: 架构相关 GPS算法redisjava架构
假如你的城市,每台公交车上都装了一个gps,更幸运的是你还可以获得这些gps上报的位置信息,那如何做一款公交位置查询app,或者公交位置监控软件呢?
宏观上: 实时性(每辆车每10秒上报一次位置信息,全市上万量公交,个接口的吞吐量以及实时性是一个考验)
准确性(如何准确判断每辆车的位置,以及行驶方向)
微观上: 火星坐标系的转换(gps上报的是原生坐标系,而我们的第三方地图控件都是基于火星坐标系的)
公交方向判断(gps上报上来的是每10s的一点,而http无状态,所以服务器就必须保留之前的状态才能判断出方向)
关于gps原生坐标系,以及火星坐标系看了下面2个链接自然会明白
http://bbs.amap.com/thread-18617-1-2.html
http://dnby007.blog.163.com/blog/static/1456565201422725235211/
比较无解的是转化问题,如果没有下面找到的转化算法,我可能要另辟蹊径去辅助修正判断的准确性
http://www.tuicool.com/articles/7VNNRvA
下面是系统架构图
|
1.考虑到量的问题,公交位置收集层可以做成一个web集群,开放给gps上报模块一个web接口,作为生产者将位置信息录入redis*后续模块使用。
2.数据库中的线路以及站点信息可以加载在内存中,或者后期存在redis中,由分布式系统中的master维护。
3.公交调度计算模块作为消费者,不断的去获得生产者的位置信息,进行计算。此处2个算法 公交方向判定算法和公交到站判定算法,前者 由位置点来判定当前公交是正向还是方向,后者根据方向来判定车辆经过的站点
对于 公交方向判定算法,可以根据近两次距离最近的站点,通过比较2个最近站点的order来判断正向还是反向,(只要距离最近的站点变化,我们就可以迅速获得方向 考虑到公交到底站回头的情况,所以判断方向的算法必须快速响应),设想一下以下这种情况
距离当前位置最近的是站点3,3的order比站点2大,所以依然不会造成方向性判断错误。
但是这种计算方法只是一个瞬时点,作为一个商用系统这种不确定性是很可怕的,所以还要考虑采取记录车子的到站信息来2方面综合判断。
4.在得到车辆方向的基础上,再判断过站就变的简单了,为每个站点设定一个距离阈值,通过比较距离是否小于这个阈值来判断是否过站。
(gps精度基本在20m以内)
其实第三点和第四点是相辅相成的,如果方向判断正确的基础上自然会得到正确的过站信息,亦可以通过推断的方法来校验 线路判断的准确性。
原创文章,转载请声名出处 http://spjich.iteye.com/blog/2264025