设计一个地铁路线规划小工具

概述

最近在找房子,因为想找一个去几个地方都相对方便的位置,自己去地图上看还挺麻烦的,所以想做个小工具,本文就简单介绍一下实现过程。目前的功能还比较简单,主体方法就是根据一个输入的始发站,列出其他所有站点到这个地方的站数最少路线。

数据获取

从网上找了高德地图的接口数据: http://map.amap.com/service/subway?_1469083453978&srhdata=1100_drw_beijing.json . 对拿到的json串进行解析,其中包含每条地铁线路的信息,并依次列出线路上的每个站点。

通过解析数据,要得到的主要就是各个站点的信息,站点定义的数据结构如下:

    private String id;
    private String name;
    private Set<String> lines = new HashSet<String>(); //所在线路
    private String position;
    private String pinyin;
    private Set<String> nextStations = new HashSet<String>(); //相邻站点

所有站点汇总后可以看做一张图,nextStations字段就是用来表示边的信息。

路线规划

路线规划算法可以参考Dijkstra算法,由于现有的表现形式下,只是一个无向无权重的图,实现起来还要简单一些。

实现过程描述如下:

  1. 新建两个map, knownPath和waitingPath,分别用来表示已经确定了最短路径的站点列表,和待处理的站点列表。初始化时,knownPath中只包含指定的起点,waitingPath中包含其他所有站点,并将距离设置成无穷大(用MAX = 20000表示)
  2. 指定起点为当前节点
  3. 依次处理当前的相邻节点,更新每个节点的最短距离
  4. 从waitingPath中找到距离最短的节点,作为当前节点,重复第3步,并从waitingPath转移到knownPath

整个过程结束之后,会得到每个节点到起点的最短距离以及路线详情,然后可以根据这些数据计算路线详情的换乘情况。

对于换乘,主体判断逻辑是,如果一个站点的上一站和下一站所在路线不重合,就可以确定在这一站进行了换乘,比如灯市口-东四-朝阳门,灯市口在5号线上,朝阳门在2,6号线上,可以断定在东四肯定作了换乘。不过还有一些特殊情况要处理,比如说西直门到平安里,中间那站如果是车公庄(虽然现实中没人会这么干),实际就是作了换乘的,但是按刚才的逻辑就会判断成未换乘。

最终得到的路线信息中包含以下信息:

    private String stationId;
    private int length;
    private int transferNum; //换乘数
    private List<String> detail = new ArrayList<>(); //详细路径

用途

主体功能在上面已经完成,后边就可以根据需要再去自定义处理了。比如,加入我现在需要找到"距奥林匹克公园站15站以内且距天安门东站7站以内的位置",就可以分别输入奥林匹克公园和天安门东,然后在结果中作相应的过滤,再取交集。

后续计划

目前做的还比较简单,只是简单考虑站数,但是实际上,不同站点的距离、耗时相差会比较大,再一个不同地方的换乘开销差别也很大。所以后续会试试能不能找到换乘站的详情数据,还有两站之间耗时的数据,并应用到算法中。

再一个是要找一个合适的方法做个界面出来,因为一直做的是纯后台,还没考虑清楚用什么合适。

其他的,还在考虑爬一下房价信息。

代码

https://github.com/lcy362/FoxSubway

欢迎提意见。

原文地址: https://lcy362.github.io/posts/13793

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容