地图导航

导航软件作为我们技术进步可夸耀的成果,似乎给我们的生活提供了巨大的便利。我并没有怎么用过,在仅有的几次使用感受来看,目前还有很多问题。

走高速导航并不算方便,因为高速是主干道,可以在地图上清楚的看到遍布全国的高速网络,平时走也就简单的几条,一般走的比较远,先看地图规划下,在路上的路牌标志也很明显,很远之前就提示前面哪里转可以到哪里,有足够的反映思考时间。

但是在各种大路小道密集的城市中,去一个自己不太知道的地方,就很麻烦了,看地图要半天,而且因为距离短,路边标志等看清楚的时候,就已经错过了,所以可以看到分叉路口的白线上经常会有车停下来在那里看路标。这种情况下,用一下导航也是很方便的。

依赖导航有一个很不好的后果,就是自己很少主动思考,就像被人牵着鼻子走的,必须严格按照描述的方法前进,这种感觉让人很不喜欢。

地图数据不及时更新的话,很多道路信息就是错误的,把人引导到错误的道路上,浪费很多时间。特别是中国现在城市更新速度很快,地图数据,一定要跟得上才行。我就遇到过一次这种情况,当时急着赶路,就开了下导航试试,结果绕了一大圈,后来在路边买的纸质地图上,发现跟导航软件上的路是不一样的。

道路计算的方法上,也有很多问题,很多时候找到的路径并不是最优的,这个不太好解决。不过可以人为的给出一些提示信息,比如只走高速,或者避开小路,或者最近距离。最重要的还是道路信息的完善,每条路是否经常堵车,或者某个地方到某个地方,走哪条路会近一些,这些本地人比较清楚,要是通过某种方式,能够让司机集体参与更新地图,就会好很多。

我以前喜欢骑自行车,也呆了好几年,对深圳的大小道路基本了如指掌,所以平时根本没怎么借助过导航软件,出去玩的时候,基本都是看地图,到城市以后,也是随意的开,到处走走,毕竟是玩,没有急着去特定地点的需求。在仅有的几次需要使用场景中,印象一点都不好,除了添麻烦,没有带来什么便利。有一次在防城港快没有油了,着急加油,就打开找一个加油站,绕过各种小路土路,来到一个小加油站边,却发现没人营业。最后还是顺着大路一直往前走,看到了个加油站。

我有段时间曾经仔细的思考过地图导航软件如何的实现,感觉虽然不算复杂,但也不算简单。

首先是地图数据的表示,如何表示一条道路?现实世界的道路弯弯曲曲,需要把这些细节都记录下来,这意味着需要每隔一小段距离就记录一下,可以每隔五米十米,记录下这条道路的中心位置的经度纬度,以及道路的宽度,或者直接记录道路两边的经纬度,这样宽度就可以计算出来。这样每一条道路都是一个位置点的数组,然后再有一个结构描述道路的各种信息,名字,长度,限速,摄像头,等等。

另外需要单独记录道路结构的拓扑信息,交叉路口,某条道路跟另一条道路在那里相连,距离多少,这些拓扑信息,构成了一个有向图,这个图上进行广度优先搜索,或者使用dijkstra最短路径算法,就能计算出来某个位置到某个位置的最短路径了。这跟游戏里的自动寻路算法基本没多大出入。

地图上的位置景点这些可以单独出来,建一个位置列表,某某小区,某某学校,某某酒店等,这些位置点记录下坐标位置,在道路拓扑信息中也要加入他们的连接结构。

查询的时候,首先输入终点,从位置列表中查询出来这个点的坐标,然后从道路拓扑图中找到相应的节点,通过GPS得到当前的位置坐标,查询到相应的道路位置节点,然后运行寻路算法计算出来最短路径。

对于巨大的地图信息,一定要分层优化才行,可以按找地理区域划分为不同层次,或者把地图切割成若干级别的小块,每个小块下面又有更加细分的深层次小块列表。

在mmog游戏中寻路,一般是一个个小的场景地图为级别的,如果跨地图,或者跨主城,另外有单独的这些大区域连接信息,寻路的时候就是二层,先看下是否是跨主城,如果是的话,先寻找主城间的道路,然后在每个小的场景地图上单独寻路。

导航软件也是一样,比如国家的道路信息网单独列出来构成一个拓扑信息,,如果目的地跨度比较大的话,比如深圳某某地方到上海某某地方的道路,可以先在一个大的层次上,找到连接这两个城市的高速公路信息,各自的入口点,然后在城市级别,寻找当前位置到高速入口的道路。

另外的提示信息,像当前道路限速多少,前方多少米有摄像头,则是在道路描述信息的结构列表中读出来根据当前位置相应提示。这些信息也可以单独记录,记录下属于那个道路,执行的时候查询加载出来就行。

语音识别和语音合成播报,则是另外专门的技术了,有很多现成的库和模块可以使用。

如果实现一个导航软件,并不只是我们看到的这一部分,另外还要实现一套道路信息的采集和编辑系统,这个就先不讨论了吧。

其实真的实现这样一个软件,很多细节都是要考虑的,需要花很多时间精力才行,国内的这些做导航软件的团队,都是至少几十人上百人,不光技术,产品,UI,运营销售,数据采集等都需要一些人。

导航软件的未来究竟走向何方,似乎很难说,大致看来,可能跟生活结合的更紧密一些,包括周边各种吃喝玩乐景点,以及提供生活服务的设施场所结合起来,总的来说应该是个地图综合类应用,导航只是其中的一个小部分。

车载导航,长远看来淘汰的命运比较大一些,不同汽车厂商提供不同的服务,但是用户体验做的都很一般,毕竟汽车行业不是专注做IT的,而且各自为政,竞争压力以及更新速度上都比较慢。手机上的应用反而更好一些,最起码更新速度很快。不管是地图数据,还是应用体验,都在不停的发新版本。

如果在汽车上加一个中控台,类似于iphone的那种可以放到的外置音响上的底座,汽车中间的显示屏通过某个协议和接口跟手机通信,可以在上面显示信息,这样就可以直接用智能手机进行导航听音乐之类的了,没有必要单独实现一套,这个系统就是提供显示屏和音响,软件方面交给手机,手机放上去也可以充电,再制定一套基本的通信协议,比如方向盘上的按钮输入,显示屏亮度和声音大小的调节等,也没有必要像现在单独使用蓝牙接口来接听电话,手机放上去之后,车载的这些系统就是输入输出,而手机则统一控制,通过底座连接通信,某些应用甚至可以通过获取汽车的运行状态信息,生成报表统计。

这样汽车厂商就解放出来,只用专心做汽车机械部分就行了,这些上层的部分,还是交给IT公司来做好一些,IT公司对于新想法新事物接受和实现速度都快很多,而且独立出来以后,可以随时更新升级,产品体验也会好很多,不同的软件产品可以根据喜好换着使用。某些用户可能觉得林志玲语音版的导航软件听起来不错,另一些用户希望通过语音识别发送指令,还有的用户想要有旅程的各种距离,油耗,时间和和路径记录等数据统计,那直接装上相应app就可以了,app要是不好用,还有其他厂商的可以替代,这是一个完全开放竞争化的环境。