造了一个查找地铁换乘的轮子

2016-08-03 18:55:56 +08:00
 jasonlee

最近需要频繁出差,于是用 Python 和 JavaScript 造了一个寻找最短路径的工具,托管在 https://metro.lihanming.me/。界面看起来像这样:

它具有以下的功能:

  1. 站点提示(输入站名、线路名,可以提示一些车站)
  2. 根据当前位置寻找最近的车站,并提示怎么走过去(感谢高德地图)
  3. 寻找路径(支持按最短时间、换乘较少等模式查询)
  4. 提示行车时间(目前京沪穗三个地方支持实际时间,其他城市支持估算时间)

目前支持中国内地所有有地铁的城市、香港(不含轻铁和电车)、台北和东京(两大地铁和 JR 部分线路)。伦敦正在写。线路保存在 JSON 文件中,可以随时扩展。

比较有趣的细节:

  1. 支持虚拟换乘。虚拟换乘站会提示,并且会有不需要虚拟换乘的方案提供。(南京西路、上海火车站)
  2. 支持不同运营商或票务系统。如果行程需要转乘会提示。(如龙阳路、三元桥、青衣等)

目前几个需要努力的地方:

  1. 优化变量名。尽可能做到没有文档也能看懂;
  2. 连续多个换乘站的处理(四惠-四惠东、中环-金钟等);
  3. 提升算法性能。目前使用的算法在初始化时需要的时间比较长;
  4. 多语言支持。目前都是使用本地文字;
  5. 用户界面优化。城市太多了需要想个办法呈现;
  6. 几个城市合在一起做一个大的系统,并且包括一些城际线路(珠三角、长三角)
  7. 其它(包括你们的意见和建议);

最后欢迎大家试试,希望它能在你们旅行出差的时候帮到你们,也欢迎你们提出意见和建议。

网址: https://metro.lihanming.me/

源码: https://github.com/DaZui/MetroSearch/

Jason

5417 次点击
所在节点    分享创造
47 条回复
niboy
2016-08-03 19:37:29 +08:00
提个问题吧,比如在上海的金海路到世纪大道,其实有 2 种路线,实际搜出来的只有一种
SourceMan
2016-08-03 19:39:00 +08:00
最优路径的算法思路大概怎么样的?
moult
2016-08-03 19:51:14 +08:00
杭州的,江陵路到客运中心,虽然 1 号线直达,但是换成一下 4 号线,就算加上换成时间,也比直达的快。
jasonlee
2016-08-03 19:56:19 +08:00
@niboy 有哪两种?提点一下
jasonlee
2016-08-03 20:16:58 +08:00
@SourceMan Floyd 算法。冷启动的时候生成距离矩阵,之后直接查矩阵。
jasonlee
2016-08-03 20:17:36 +08:00
@moult 这和时间计算方法有关。我设定的换乘的时间是 5 分钟。实际时间可能会短一些。
niboy
2016-08-03 21:12:49 +08:00
@jasonlee
1. 12 号线金海路--》到大连路换 4 号线 --》世纪大道,起点站,胜在一路有座
2. 12 号线金海路--》到巨峰路换 6 号线--》世纪大道,比路线 1 少一站,但站内换乘走路时间长,而且不一定有座

可以和百度地图、腾讯地图等的路线对比一下
jasonlee
2016-08-03 21:33:41 +08:00
@niboy 我看了一下。估计是因为大连路那里需要过黄浦江,列车运行时间长一些。 Floyd 算法的主要缺点就是你找不到第二长的线路。我看看广度优先搜索能不能找到。谢了啊。
jasonlee
2016-08-03 21:37:01 +08:00
@moult 我新增了一个“换乘多”的模式,将换乘时间缩短为 2 分钟。主要是我不知道各个地方的列车间隔。如果列车衔接妥当,那么换乘所花的时间就短。
niboy
2016-08-03 22:49:10 +08:00
我下载了 Android 客户端,看起来就是网站,请问 lz 是用什么封装成 APK 的?难道就是一个 webview 加载了 bootstrap 的网站?
jasonlee
2016-08-03 23:23:49 +08:00
@niboy 正解。我写了一个 webView 。专门为 Android 写客户端的原因是因为一部分 Android 浏览器获取的地理位置不正确,所以无奈之下封装了。如果你是用 Chrome 等可以添加到桌面的浏览器,那我觉得不用下客户端也没事。
wdlth
2016-08-03 23:31:26 +08:00
我认为如果只有一个结果的话就不要写换乘多了……
jasonlee
2016-08-03 23:36:50 +08:00
@wdlth 好主意。我在想这一块应该怎么展示。有什么建议吗?
franklinyu
2016-08-04 01:10:39 +08:00
@jasonlee 弗洛伊德算法是不是可以一次性找到所有「站點對」的最短路徑?而不用在收到請求的時候實時計算?
jasonlee
2016-08-04 08:01:49 +08:00
@franklinyu 是的,這就是原因。但 Floyd 這個演算法不能找到第二長的路徑,十分頭疼。
kenshin
2016-08-04 10:54:59 +08:00
挺棒的想法,前阵子去上海正好有这样的需求,当时的想法是自己有时间撸一个,没想到已经有成品了。

提个建议:
之前在上海的时候,想去迪士尼,出发地点附近有两个地铁线:老西门站与小南门站;通过地图 APP ,告诉我老西门站距离较慢 /较远,建议小南门站;结果发现,小南门的确时间或许比较少,但是需要换乘 n 站,结果这个 APP 就没有计算出每个换乘站需要走多久,需要等下趟车多久。

所以,能否再加入一些人工干预,比如:
- 各个换乘站步行时间
- 每趟车的间隔时间
- 从出发点到地铁站的时间
lgh
2016-08-04 12:23:32 +08:00
jasonlee
2016-08-04 12:35:05 +08:00
@kenshin 不显示换乘时间的考虑就是这个。这个程序的好处就是简单。如果要显示这么细的话,就变成地图了(笑)。列车间隔也很难搞,因为不同时候的间隔不同。不过多个首站确实值得考虑,我设计一下流程来。
jasonlee
2016-08-04 12:45:06 +08:00
@lgh 所以说是造了轮子嘛。
jasonlee
2016-08-04 12:46:57 +08:00
@kenshin 我用我的查了一下,小南门出发确实多换一次。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296910

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX