欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实时公交位置系统的实现 博客分类: 架构相关 GPS算法redisjava架构

程序员文章站 2024-02-17 08:18:10
...

假如你的城市,每台公交车上都装了一个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

 

下面是系统架构图

 
实时公交位置系统的实现
            
    
    博客分类: 架构相关 GPS算法redisjava架构
 

 

 

1.考虑到量的问题,公交位置收集层可以做成一个web集群,开放给gps上报模块一个web接口,作为生产者将位置信息录入redis*后续模块使用。

2.数据库中的线路以及站点信息可以加载在内存中,或者后期存在redis中,由分布式系统中的master维护。

3.公交调度计算模块作为消费者,不断的去获得生产者的位置信息,进行计算。此处2个算法 公交方向判定算法公交到站判定算法,前者 由位置点来判定当前公交是正向还是方向,后者根据方向来判定车辆经过的站点

   对于 公交方向判定算法,可以根据近两次距离最近的站点,通过比较2个最近站点的order来判断正向还是反向,(只要距离最近的站点变化,我们就可以迅速获得方向 考虑到公交到底站回头的情况,所以判断方向的算法必须快速响应),设想一下以下这种情况

 
实时公交位置系统的实现
            
    
    博客分类: 架构相关 GPS算法redisjava架构
 
距离当前位置最近的是站点3,3的order比站点2大,所以依然不会造成方向性判断错误。

但是这种计算方法只是一个瞬时点,作为一个商用系统这种不确定性是很可怕的,所以还要考虑采取记录车子的到站信息来2方面综合判断。

 

4.在得到车辆方向的基础上,再判断过站就变的简单了,为每个站点设定一个距离阈值,通过比较距离是否小于这个阈值来判断是否过站。

  (gps精度基本在20m以内)

 

其实第三点和第四点是相辅相成的,如果方向判断正确的基础上自然会得到正确的过站信息,亦可以通过推断的方法来校验 线路判断的准确性。

 

 

原创文章,转载请声名出处  http://spjich.iteye.com/blog/2264025
 

  • 实时公交位置系统的实现
            
    
    博客分类: 架构相关 GPS算法redisjava架构
  • 大小: 58.4 KB
  • 实时公交位置系统的实现
            
    
    博客分类: 架构相关 GPS算法redisjava架构
  • 大小: 73.5 KB