陆向珍,杨丽霞
(1.甘肃省基础地理信息中心,甘肃 兰州 730000)
解决城市交通问题,关键是要树立城市公共交通在城市交通体系中的主导地位,大力优先发展城市的公共交通[1,2]。据统计, 每20辆自行车或4辆小汽车所占用的道路面积与1 辆公共汽车所占的面积一样, 而后者的载客量分别是每辆自行车、小汽车的100倍和30~40倍[1,3]。城市公共交通具有客运量大、相对投资小、占有资源少、效率高、污染相对较少、人均占有道路少等优点。
城市公交是各大城市市民及外来人员出行的首选交通工具,面对错综复杂的交通网络,如何选择最优的乘车线路显得尤为必要。因此,大力发展和建设公交查询系统或者推行基于网络电子地图的公交查询服务显得越来越重要。
在我国城市的公交运行中,公交线路有3种情况:①上下行路线,其往返路线的站点不完全相同;②往返路线, 所经站点完全相同;③环行路线,公交车辆沿着线路环绕行驶。假设公交线路有n( n≥100)条,在n条线路中,公交票价划分为单一票价与分段计价2种,单一票价统一为1元,分段计价的票价为:0~20站1元,21~40站2元,40站以上3元[4]。
公交换乘查询就是要快速、准确地搜索网络上2点之间的最优乘车路径。现有的很多公交换乘算法都是将公交站点、公交线路的地理位置作为属性字段存到关系数据库或文件中,然后采用最短路径算法、矩阵算法、链表查询甚至使用“图论”和空间网路数据库相结合的方法等计算[5,6]。在这些算法中,有的计算复杂、效率低下;有的没有综合考虑上下行路线、环形路线、最优换乘点选择、实际线路情况等问题,与实际情况不相符。基于以上原因,本文采用XML、XSD文件描述和公交站点、公交路线数据相结合的方式实现公交换乘,如图1所示。
1)获取最新公交线路信息。在兰州公交集团网站(http://www.lzbus.com)上获取最新的公交站点信息,将信息按具体线路保存成一个独立的txt文档,文档名称以公交线路名命名,文档内容为具体某一公交线路的公交站点,各站点之间用逗号隔开。如12路车,存为“12.txt”,经过的所有站点用逗号隔开,如图2所示。
2)公交站点入库。编写程序,将获取的公交路线及站点信息批量入库,并同时去重,形成公交站点表。由于一个站点经过多路公交车,如培黎广场站,经过15路、103路、121路等公交车,读取15.txt、72.txt、103.txt、121.txt时培黎广场站都会被写进公交站点表里,这样公交站点表里就有4个站。公交站点表里的站点都是唯一的,所以要将重复站点去重,最后形成的站点表如图3所示。
3)获取公交站点XY坐标。利用百度地图开放API编写代码,调用百度地图上的兰州公交车路线,获取每个公交车站点的坐标,关键代码如下:
-----获取所需公交路线列表,如1~7路公交路线-----
… …
-----获取列表中具体公交线路并在地图上显示-----
function searchBusline(){
var busline = new BMap.BusLineSearch(map,{
renderOptions:{map:map,panel:"results"},
onGetBusListComplete: function(result){
if(result) {var fstLine = result.getBusListItem(0);//获取第一个公交列表显示到map上
busline.getBusLine(fstLine); }
}
});
-----获取具体站点坐标-----
map.enableScrollWheelZoom();
map.addEventListener("click", function(e){
document.getElementById("info").innerHTML =e.point.lng + ", " + e.point.lat;
运行界面如图4所示。
4)公交站点空间化。点击具体某路公交车线路,可获取每个公交车站点的X、Y坐标。获得全部公交线路的站点坐标后,在ArcMap里用X、Y字段将属性坐标空间化,定义空间参考系和投影,叠置兰州市地理地图做底图,链接公交线路。
5)拓扑检查。首先在catolog中创建一个拓扑类;然后在ArcMap中打开拓扑层,进入编辑状态。在创建过程中,拓扑规则点都在线上point must be covered by line(即公交站点要在公交线上),不在线路上的公交站点会在图上显示出来。选择Snap(捕捉)、Trim(修剪)、Extend(延伸)3个工具,对拓扑检查出来的问题进行修正,保证每一个公交站点都在公交线路上,如图5所示。
拓扑查错后,确定线路的上下行。如1路车,“兰州车站—兰州西站”,如果“兰州车站—兰州西站”是上行路线,那么“兰州西站—兰州车站”就是下行路线。上下行路线重合,方向相反,在ArcMap里设置路线的上下行[7]。
将公交点数据(lzBusPoint.shp)、公交线路数据(lzBusLine.shp)基于Geo MapWorld进行公交模型建模,实现公交线路查询、公交换乘查询,关键代码如下[7,8]:
-----公交线路查询 -----
function(features){
var busStationInfo = getBusStationInfoByBusLine(feat ures[0]);
document.getElementById("queryLineResult").innerHTML = "
查询到10路公交车经过的站点:" +busStationInfo.slice(0, busStationInfo.length - 1);};
公交线路查询运行结果如图6所示,公交换乘查询运行结果如图7所示。
[1]刘娜.优先发展城市公共交通的必要性与措施[J].河北工程技术高等专科学校学报,2009,3(1):21-23
[2]公共交通连接世界 城市通卡走向国际[EB/OL].http://www.holichip.com/NewsDetail.aspx?i=166, 2013-06-28
[3]陈林菁.公交优先!现代城市交通的选择[J].城市道桥与防洪,2001 (4):52-53
[4]钱萌,彭张节,程树林,等.基于综合评价指数的城市公交线路选择优化模型[J].吉林大学学报:信息科学版,2008,l26 (2):180-185
[5]付仲良,张文元,孟庆祥.基于GIS的公交数据模型研究及换乘算法实现[J].测绘通报,2010(7):15-18
[6]翁敏,毋河海,杜清运,等.基于公交网络模型的最优出行路径选择的研究[J].武汉大学学报:信息科学版,2004,29 (6):500-503
[7]武大吉奥信息技术有限公司. GeoGlobe4.5_公交换乘数据要求[S].2011
[8]武大吉奥信息技术有限公司.C01 Geo MapWorld SDK开发指南[S].2011