发现城市

今天给G2Rail数据库里面更新了四千多个城市的信息,是时候回顾一下G2Rail城市数据的演进历史了。

G2Rail在2017年第一个网页版上线的时候只能提供基于车站的搜索,原因很简单,因为铁路公司主要面对的旅客是本国旅客,本国旅客只会关心从哪个车站上下车。而铁路公司提供的数据也仅仅是车站列表,出来从车站名字,基本不会有其他的城市信息。

但是G2Rail主要用户是海外旅客和海外旅行社,对于海外旅客来说,他们根本不会知道,佛罗伦萨中央火车站其实是佛罗伦萨圣母玛利亚车站。欧洲之星其实到达布鲁塞尔南站而不是布鲁塞尔中央火车站。所以有了一个想法,为什么不引入城市搜索,旅客只需要输入城市名称,具体映射到这个城市中的哪个车站的逻辑应该放到G2Rail这里。所以我们上线了第一版城市搜索。

版本 I – 人肉

既然火车公司没有这方面数据,只好自己想办法,采用了最蠢的方法:人肉。所以拍脑袋列出来德国最重要的二三十个城市以及相对应的中央火车站。同时为了展示并不限于德国火车票,也找了意大利、瑞士、法国、奥地利、荷比卢等国家的二三十个城市。

上线之后订票数量马上就有了提升。看来这个玩法有效!

下一步该思考如何把这个想法应用到更多国家的更多的城市。可是接下来的挑战是

如何去发现每个国家有哪些城市?

更甚一步是,每个国家的城市的定义是什么?

版本 II – Flixbus

当然可以利用类似于维基百科等公开数据,但是这个跟当时的G2Rail相关性不强,因为其实我们只是需要哪些我们系统所对接铁路覆盖的国家。如果能够找到一些同行业玩家的相关数据就会更加省力一些。很幸运的是G2Rail是为数不多的几个接通Flixbus API的集成商,而Flixbus的API参数设计与铁路公司不同,Flixbus搜索函数输入的是城市名称英文而不是具体车站名称(思考一下原因:Flixbus的车站更多是汽车站,而且车站变化比较快,汽车站名字更加奇怪,因此用城市搜索会更加简单,更具有可扩充性)。这就意味着我们其实可以借用Flixbus的城市列表,开始建立G2Rail的城市数据库。经过数据清洗、整理、与车站映射之后,一下子数据扩充到欧洲的两千个城市了。

Flixbus欧洲覆盖

其中Flixbus对于城市的一个处理方法给了我们一个很不错的AHA。Flixbus会把机场作为一个城市,比如法兰克福机场。这个处理方法对于旅客很友善,因为很多旅客会使用空铁联运,说白了就是从机场转乘火车,而且机场往往有几个车站,有机场的提示,就会更方便很多。所以G2Rail又根据机场城市把车站做了专门的处理。

这个版本的问题是国家城市分布不均匀,比如英国只有伦敦,西班牙的覆盖比较弱。

版本 II – Flixbus扩充版

2019年G2Rail又对接了美国的Amtrak,因此过去的以欧洲城市为主的城市列表就显得不全。碰巧Flixbus的版图也在不断扩大,扩充了更多的东欧,在美国也开始覆盖了几百个车站,所以又一轮清洗、整理、导入,扩充了几百个城市,主要覆盖东欧和美国。

版本 III – 阿里飞猪

2019年年末,阿里希望在海外有更广(国家、城市、运营商)、更深(车站数目)、更有竞争力的的供应商,而原先2015年对接的供应商不能够满足要求,所以找上G2Rail,希望打掉重练。阿里的要求会高很多,G2Rail原先的城市覆盖已经不够。恰好阿里的数据基础设施包括一个覆盖全世界的地址树,为了实现行程搜索以及与飞猪的机票、酒店、海外用车等实现数据互联,相互导流,必须在G2Rail的城市和车站数据与阿里的地址树直接建立映射关系。而这正好也给了G2Rail一个契机,可以利用这部分地址树在映射的同时,充实G2Rail的地址系统。

第一遍首先是根据国家以及城市的名称匹配,同时人肉去Review,尤其关注重点城市。这时候丰富了日本、韩国的城市信息。

名字匹配之后很快发现新的问题。

首先,诺因基兴(Neunkirchen)就有五个,分别在德国的莱茵河流域巴列丁奈特、萨尔州、巴伐利亚州、奥地利的下奥地利州、还有一个在法国。更恐怖的是法国St-Michel有几十个,St-Raphael有上百个,有的是城市、有的是城镇、有的是村子。更有甚者,St-Raphael还可能是Saint Raphael, St. Raphael, St-Räphäel, St—Raphael。。。

其次,东欧和北欧的城市也出了很多状况,就像瑞典的Jönköping,但是阿里数据只有英文和中文,就匹配不上。

再次,发现阿里全球地址树尽管看似很全,但是不少重复、缺失和错误。

版本 III – 阿里飞猪 Fix

看似名称和国家匹配可能会出现不少错误之后,下一个思路是利用GPS排查。这意味着G2Rail首先需要把车站数据库中的GPS采用统一标准(不同铁路公司提供的GPS采用的标准也不尽相同),修正错误。

GPS修正之后,与地址树通过GPS计算距离进一步校准。但是对于名字没有完全匹配的部分还是没有想到太好的方法。

版本 IV – Serendipity

直到开始开发Serendipity App (Apple Store, Google Play)。Serendigity整套数据基于全球五百多万个地址。Serendipity能够提供这些地方的介绍、Tour、景点信息等。G2Rail的基于车站和城市的地址信息系统也需要和这套数据打通,而这其实也给我们提供了另外一个建立全球地址树,以及通过三套地址系统交叉映射检查原先地址树问题的机会。

通过三套地质系统的交叉映射,很快就会发现缺少的城市以及确实的映射,城市数量一下子扩充了一倍。同时在三套系统直接实现了打穿,可以方便的互相传导信息。因此在G2Rail Help的城市页面,比如巴黎城市页面可以同时展示巴黎的景点、Tour、吃喝玩乐、也能展示巴黎的火车信息。

而旅客购买了到达巴黎的车票,巴黎地区景点、旅游产品的推送也变得可能。

Share