潘志宏,万智萍,谢海明
1.中山大学 新华学院,广州 510520
2.广东移动通信有限责任公司 茂名分公司,广东 茂名 525000
近年来,随着物联网与移动互联网技术快速发展,国家不断推进智慧城市建设,其中城市交通是智慧城市重点解决的问题之一。伴随车联网、智慧公交、共享单车不断的深入应用,如何利用现有的物联网、移动互联网、大数据等技术来提升城市交通效率,实现智慧交通是目前国内外研究的热点[1-5]。公交系统作为城市交通的重要组成部分,出现了针对智慧公交APP,比如车来了、掌上公交等,它们通过与政府交通部门合作,授权获取城市公交车的实时位置信息,从而给用户提供上车前查询的服务,和上车后的智能提醒服务。这种方案通过安装在公交车的特定传感器进行实时数据收集,并将数据存储于政府交通部门的云服务器,这部分数据非常精确,但是出于城市安全问题考虑,这部分数据并不会对外开放,必须是有资质的公司通过与政府合作才能获取数据,另外它也具有一定的局限性,比如当部分公交车实时数据采集和回传出现异常时,APP会因为数据的异常导致相应服务中断,产生不好的用户体验,例如会因为用户所乘坐的公交车实时数据产生异常,使用户无法得到实时的报站信息,甚至因此错过下车站点。为了解决数据缺失问题,近年来很多学者利用智能终端的移动感知能力来解决城市交通问题,比如Farkas等人[4]提出基于移动群智感知的城市公交信息服务平台,通过乘客移动终端感知数据与公交站点事件检测器监控相融合的方法来获得公交车的实时信息。Manali等人[5]提出基于参与式感知技术利用乘客智能终端收集公交车的实时轨迹,最终给用户提供公交车到站信息。Srinivasan等人[7]通过收集手机GPS轨迹数据从而获得城市公交车站点信息。
为了解决上述城市公交实时数据缺失问题,本文提出了利用开源的公交线路信息与移动终端的感知数据相互融合的解决方案[5-9],方案实现在没有获得交通部门实时数据的情况下,给用户提供上车后智能提醒服务,包含实时报站与到站提醒功能。本文的贡献在于,首先提出基于Haversine[10-11]的最近站点自动生成算法和基于心跳包机制的站点实时监测与到站提醒算法;其次通过优化距离计算公式方法来降低空间距离计算时间复杂度,从而提升算法的性能;最后利用移动跨平台框架[12-15]APPCan实现智慧公交APP,它很好地兼容Android、iOS等多种移动操作系统,并具有实时报站、到站提醒、公交线路查询、最近上车站点自动生成等功能。
公交系统作为目前城市出行的重要组成部分,如何给市民乘坐公交系统出行提供智慧服务,是目前实现智慧出行重要的一步。本文主要针对智慧公交中的实时报站与到站提醒功能设计一款APP,解决用户在公共汽车上因为专注于其他事情而引起误站的问题,又或者到陌生地方乘坐公交系统因为对站点不熟悉而错站的问题。主要包括查询站点、实时报站、到站提醒等功能。图1给出了系统的功能流程图。
功能描述如下:(1)查询路线站点,用户输入路线并点击确认后会在下方呈现该路线的所有站点的列表,并提示用户点击选择目的地;(2)自动生成最近的站点,用户在点击选择目的地站点后,系统会根据Haversine最近站点自动生成算法生成用户上车的最佳站点;(3)手动选择上车站点,如果系统自动生成的站点不准确,用户可手动更改上车站点;(4)实时报站,用户在确认了基本乘车信息,包括公交路线、目标站点和上车站点之后开始实时报站,系统会根据心跳包机制的站点实时监测算法检测公交车是否到站,并自动刷新页面对用户反馈;(5)到站提醒,当用户距离目标站点还剩3个站的时候,每到一个站,手机会震动进行提醒。在用户到达最后一站时会响铃提醒。
图1 系统功能流程图
获取用户输入的公交路线,将其作为参数添加至API请求链接中,然后向第三方数据平台聚合数据的路线信息API进行请求。数据平台将公交路线的数据返回给移动终端,移动终端将公交路线的站点信息进行存放,同时将所有站点以列表的形式进行显示。
当用户选择公交路线后,移动终端能够根据算法自动生成搭车的最佳站点。首先通过移动终端GPS获取用户所在位置,然后将其与整个路线的所有站点进行对比距离,最后输出距离用户最近的站点。根据Haversine公式[10-11]可得到如下公式:
其中hav函数满足如下条件:
最终根据公式(1)跟(2)求得两点的距离为:
公式(1)跟(3)中的lat表示纬度,lng表示经度,也即是(lat2,lng2)和(lat1,lng1)表示两个坐标点 L2和 L1的经纬度,r为地球半径。这里需要注意的是在编程实现的时候,必须把三角函数的参数转换为弧度,也即是参数需要乘上PI/180。
算法1基于Haversine的最近站点自动生成算法
1.Initialize:获取用户的位置,纬度为latu,经度为lngu,获取整条路线所有站点的经纬度,构成站点列表L={L1(lat1,lng1]),L2(lat2,lng2),…,Ln(latn,lngn)},创建数组ArrayD用来存放用户与所有站点之间的距离。
2.for each Liin L
3. 利用公式(3)计算用户当前位置与列表L中每个节点的距离di。
4. 将di存入数组ArrayD
5.end for
6.对数组ArrayD进行升序排列
7.获取ArrayD最小值dimin,并将最小值对应的Li站点进行返回。
因为考虑到城市实际的道路复杂情况,有时候地理位置最近的站点不一定是步行最佳的站点,所以在智慧公交APP中增加手动选择上车站点功能。该功能在确认乘车信息的界面中增加“手动选择上车站点”选择列表,把该路线的所有站点作为列表选项,用户可以选择站点来替换系统自动生成的最近站点。
目前市面上智慧公交APP基本都是通过获取政府交通部门的授权,获取公交车的实时位置信息来提供实时报站和到站提醒服务,本文研究的是通过用户移动终端感知数据与免费开源交通数据的融合,从而获取用户所在公交车的位置与站点之间的关系,来给用户提供实时报站与到站提醒服务[5-9]。该功能使用“心跳包”机制来实现即时监测,即在时间间隔内反复执行心跳包函数,心跳包函数主要完成当前公交车所到站点的检测和是否到达目的站点的判断。其中所到站点实时监测主要是通过计算当前公交车与下一站之间的实时距离,当距离小于阀值是判定车辆到站,然后自动刷新一次页面反馈信息。而到站提醒功能是在站点实时监测的基本上,通过当前所到站点与目的站点之间的距离和站点数来进行判定是否到站或者是否需要启动提醒,当心跳包检测所剩站点数目小于等于3时,每到一站就震动受,到达最后一站时改为响铃。
因为心跳包每隔2 s就会发出请求一次,假设一次车程需要1 h,需要经过20个站点,根据算法2可知至少需要执行1 820次距离计算。在算法1中,只需要调用几十次(线路所有站点个数)距离计算就实现功能,所以距离计算公式(3)完全能满足算法1的性能需求。但是由于执行公式(3)中的三角函数会消耗很多移动终端的计算资源,特别是距离计算次数达到几千次级别时,APP性能会下降非常多,所以必须对距离计算公式(3)进行优化,让它满足算法2背景下的距离计算。
APP应用场景一般是限定在一个城市的范围内进行,也即是两个站点间的距离不会超过200 km。由于范围小,可以近似认为经线和所纬线是垂直的,假设如图2示,要求计算 X(113.4,23.10)和Y(113.5,23.20)两点的距离,可以先求出南北方向距离LY,然后求出东西方向距离LX,最后求矩形对角线距离,即
图2 经纬度近似垂直情况下两点间距离的计算
其中 toRadians(θ)=θ×PI/180 (7)
根据公式(4)、(5)、(6)、(7)最终得出:
下面主要从两个方面来验证本文优化方案:第一是可靠性,主要验证优化后的公式是否能满足实际的需求;第二是高效性,主要是验证是否能减少手机的计算资源,提升性能。
因为在算法2中,有两处需要用到距离计算:一个是计算当前位置与下一个站点的距离,一般两个相邻的公交车站的距离在2 km以内;另外一个是计算当前位置与目的站点的距离,两个站点是在一个城市内,所以一般距离不会超过200 km。在这两种情况下,因为距离较小,可以近似认为经线跟纬线是垂直的,所以采用优化后的距离计算公式(8)来计算距离。通过前面分析可知Haversine距离计算公式(3)算出来的距离是最准确的,在表1中通过设置几对不同数量级别距离的测试点来验证通过优化后的距离计算公式(8)与Haversine距离计算公式(3)两种方法计算出来的误差。从表1的测试结果分析得出,公式(8)在几千米的距离内误差为0;在几万米的范围内,误差为10 cm左右;在290 km左右的距离,误差仅为10 m左右,完全满足APP精度的需求。因此,可以得出优化后的公式(8)可靠性是满足算法2的需求。
前面验证公式的可靠性,它能很好地满足对距离计算的要求。下面验证优化后公式的高效性。三角函数的计算是一种运算量比较大,占用时间比较长的运算,所以通过采用减少三角函数计算次数的方式来降低运算时间。通过比较公式(8)与公式(3),可以清楚看到公式(3)要进行5次三角函数的计算,而公式(8)只需要进行1次的三角函数计算。假设在算法2中,要进行2 000次的距离计算。通过优化,从原来需要进行10 000次三角函数运算降低到2 000次,减少了80%的计算资源,大大降低了手机的计算时间,对于实时性要求高的手机应用来说是至关重要的。为了验证优化后的效果,在处理器为8核,运行内存为3 GB,操作系统为Android4.4.2的华为荣耀6手机测试,在单线程环境下执行1千次、5千次、1万次、5万次、10万次距离计算公式,计算出每种状态下的耗时情况,如图3所示。通过耗时曲线图可以得到,在执行同样次数的距离公式,优化后的距离计算公式耗时大概是Haversine距离计算公式的1/7,大大提升了计算效率,因此提高了算法的性能。
表1 优化后距离计算公式(8)与Haversine距离计算公式(3)可靠性验证
图3 Haversine公式与优化后公式耗时对比情况
通过上面数据验证,优化后的距离计算公式一方面既满足距离计算机精确度,也因为减少了大量反三角函数的计算量从而提高了计算效率,提升了算法的性能,满足APP的实际需求。接下来是利用优化后的距离计算公式(8)设计基于心跳包机制的站点实时监测与到站提醒算法。算法具体步骤如下:
算法2基于心跳包机制的站点实时监测与到站提醒算法
1.初始化:将算法1生成的最近站点与所选目的站点之间的站点数量设定为变量n,设置常量dconstant用来判定是否到站。Tlast_health为上次收到心跳包时间,Tcurrent为当前时间,Ttimeout为设定的超时时间。
2.if((Tcurrent-Tlast_health<=Ttimeout)
//判断心跳包是否超时,如果不超时执行如下操作
3.通过GPS获取当前用户的位置Lu(latnow,lngnow)
4.从位置列表获取当前时刻下一个站点位置Lnext
5. 通过公式(8)计算当前位置Lu与下一站点Lnext之间的距离dnext
6.if(dnext<=dconstant)
7.n-- //距离目的地站点个数减1
8.更新下一个站点位置,重置Lnext
9.通过公式(8)计算当前站点与目的地的距离并在界面显示。
10.if(n<=3)
11.启动到站提醒
12.end if
13.end if
14.end if
通过聚合数据API[16]中的全国公交及路径规划查询接口获取指定公交路线的所有站点的信息,包括对应线路所有途径站点名字、站点序号、站点经纬度等信息。全国公交及路径规划查询接口的地址为:http://op.juhe.cn/189/bus/busline,支持的格式为json/xml,当需要获取对应公交线路的所以站点信息时,只需要传入key、city、bus三个参数值,分别对应授权密钥、城市、公交路线。请求格式如:http://op.juhe.cn/189/bus/busline?key=xx&city=yy&bus=zz(其中xx、yy、zz代表对应参数值)。将获取到的线路站点信息进行存储,提供给线路查询、最近站点生成、站点监测、到站提醒使用。如图4就是在线路查询中得到的线路的所有站点。
图4 搜索路线以及站点
为了提升开发效率,能同时开发Android与iOS平台的应用,考虑采用移动跨平台开发技术,目前主流的跨平台开发技术有React Native、ionic、APPCan[12-15]。其中APPCan是国内知名的跨平台移动应用开发工具,利用HTML5技术快速开发出Android、iOS平台上的移动应用,它分为5个层次。最底层是移动操作平台,目前支持iOS和Android。第4层是封装好的各种通用组件库,主要有统计分析、消息推送、网络管理等。第3层是管理层,主要包括应用管理、插件的统一管理注册以及相关的插件组件模块。第2层是Window manager,它负责网页面界面渲染和实现原生插件的调用。第1层是开发者使用HTML5来实现应用开发[12]。
首先利用APPCan的uexLocation来进行定位[12],它能同时使用GPS、GPRS、WIFI三种方式联合定位,取最先返回值。首先利用uexLocation的openLocation()方法打开定位功能,返回当前移动设备所在地经纬度信息,同时可以利用onChange()方法来监听移动设备位置变化。前面已经实现通过第三方数据平台获取公交线路所有站点信息。在自动站点生成功能的实现中,可以将刚刚获取的当前移动设备的经纬度信息与公交线路的站点信息作为输入,利用基于Haversine的最近站点自动生成算法自动计算出最优的上车站点,并反馈到页面进行显示,如图5所示。
图5 自动生成最近站点
站点实时监测与报站,主要是通过前面所设计算法2来实现,通过不断监测当前位置与下一站点之间的距离,从而给用户呈现与下一站点的距离、与目的地的距离、距离目的地站数等信息,实现效果如图6所示。
图6 实时报站
到站提醒功能是当算法2检测所剩站点数目小于等于3时,每到一站就震动受,到达最后一站时改为响铃。震动和响铃可通过AppCan内置框架对手机硬件设备调用[12]。其中震动功能可以通过uexDevice的vibrate(milliseconds)方法来启动移动设备的震动,cancelVibrate()方法来关闭设备震动。响铃功能通过调用uex-Audio来进行音频文件的播放与停止,首先通过uexAudio.open(url)打开铃声或者歌曲链接,通过uexAudio.play(repeats)启动播放,通过uexAudio.stop()停止播放。
为了解决在没有城市实时公交车数据的情况下实现智慧公交提醒服务,本文提出利用开源的公交线路信息与移动终端的感知数据融合的解决方案,并在这个方案基础上设计最近站点自动生成算法、实时监测与到站提醒算法;接着通过优化距离计算公式提升计算时间复杂度,从而提升算法的性能;最后利用移动跨平台框架APPCan实现智慧公交APP,通过测试验证表明其能很好地满足用户智慧公交提醒的需求。