交大的校园巴士时刻表都只能在车站的站牌上查看。这对于需要出行的学生来说非常不方便,无法合理做好出行的安排。为了解决这个问题,我和同一个套件的两位同学一起完成了这个简单的app。这篇博客将简要介绍这个web应用是如何实现的。以下是效果图,实际的效果请到http://sjtubus.sinaapp.com查看。

SJTU-Bus

完成这个应用的主要步骤:

  1. 申请百度地图API访问权限
  2. 添加校园巴士车站
  3. 绘制校园巴士路径
  4. 弹出校园巴士时刻表

1.申请百度地图API访问权限

百度地图JavaScript API免费对外开放。自v1.5版本起,您需先申请密钥(ak)才可使用,接口(除发送短信功能外)无使用次数限制。

因此我们需要先申请密钥,过程非常简单,几步就完成,在此就不多赘述了。申请完毕你就得到了属于自己的ak,接下来就可以建立如下的hello world网页了哦!别忘了把ak=您的密钥这部分改称你申请好的密钥。

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
    body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
    <title>地图展示</title>
</head>
<body>
    <div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
    // 百度地图API功能
    var map = new BMap.Map("allmap");    // 创建Map实例
    map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);  // 初始化地图,设置中心点坐标和地图级别
    map.addControl(new BMap.MapTypeControl());   //添加地图类型控件
    map.setCurrentCity("北京");          // 设置地图显示的城市 此项是必须设置的
</script>

2.添加校园巴士车站

首先本应用所有的数据都存储在一个data.json文件中,其中校园巴士车站存储的数据结构如下。数组中每一个子数组代表一个车站,子数组的三个元素分别代表站点名和经纬度。

{
    "stopList":[
        ["东川路地铁站", 121.426814, 31.023853],
        ["菁菁堂", 121.436534, 31.02475],
        ["校医院", 121.439911, 31.025764],
        ["东上院", 121.445463, 31.028007],
        ["东中院", 121.444457, 31.030127],
        ["新图书馆", 121.443954, 31.03155],
        ["行政B楼", 121.447601, 31.032742],
        ["电信学院", 121.448751, 31.03155],
        ["凯旋门", 121.452308, 31.029431]
    ]
}

在设计好了上面的数据结构后,添加车站就非常容易了:

for (var i = 0; i < stopList.length; i++) {
    var point = new BMap.Point(stopList[i][1], stopList[i][2]);
    var marker = new BMap.Marker(point);
    var label = new BMap.Label(stopList[i][0],{offset:new BMap.Size(20,-10)});
    marker.setLabel(label);
    map.addOverlay(marker);
}

3.绘制校园巴士路径

校园巴士行车路径存储的数据结构如下,就是由一堆点的经纬度构成的。

{
    "lineList": [
        [121.436534, 31.02475],
        [121.439911, 31.025764],
        [121.445535, 31.027412],
        [121.445301, 31.027984],
        [121.444331, 31.030104],
        [121.443774, 31.031605],
        [121.448373, 31.033121],
        [121.448319, 31.032285]
    ]
}

在设计好了上面的数据结构后,依样画葫芦,我们就能得到想要的路径了:

//绘制路线
var pointArr = [];
for (var i = 0; i < lineList.length; i++) {
    pointArr.push(new BMap.Point(lineList[i][0], lineList[i][1]));
}
var polyline = new BMap.Polyline(pointArr, {strokeColor:"blue", strokeWeight:5, strokeOpacity:0.5});
map.addOverlay(polyline);

4.弹出校园巴士时刻表

校园巴士行车时刻表存储的数据结构如下,就是由一堆点的经纬度构成的。

{
    "stopTime":{
        "东川路地铁站": {
            "direct1": "07:24 07:39 07:54 08:09 17:03 17:28 17:58 18:43 19:28 20:28",
            "festival_direct1": "8:24 16:58 17:43 18:28",
        },
        "菁菁堂": {
            "direct1": "07:30 07:45 08:00 08:15 08:25 08:40 09:00 09:20 09:40 10:00",
            "direct2": "08:30 08:50 09:10 09:30 10:00 10:30 11:00 11:30 12:30 13:30",
            "festival_direct1": "08:30 09:30 10:30 11:30",
            "festival_direct2": "09:00 10:00 11:00 12:00"
        },
        "校医院": {
            "direct1": "07:30 07:45 08:00 08:15 08:25 08:40 09:00 09:20 09:40 10:00",
            "direct2": "08:50 09:10 09:30 09:50 10:20 10:50 11:20 11:50 12:50 13:50",
            "festival_direct1": "08:30 09:30 10:30 11:30",
            "festival_direct2": "09:20 10:20 11:20 12:20"
        }
    }
}

在设计好了上面的数据结构后,对之前添加巴士站点的代码稍加修改以下就搞定了,具体要添加的内容还比较多,可以移步源码查看。

还有哪些工作?

  1. 东川路站的经纬度需要修正
  2. 支持小屏手机的访问
  3. 有兴趣的同学可以fork我的项目

反馈与建议

  1. 本应用是由几位交大的同学利用课余时间制作,有什么问题可以及时反馈给我们。
  2. 所有的反馈建议请在issue版提交
  3. 或者直接在本博客留言

参考资料

  1. 关于调整校园巴士运行线路及运行时刻的通知