编辑 / 本刊记者 汪玚 文章摘选编辑于微信公众号“一览众山小-可持续城市与交通”
地铁那些事儿
编辑 / 本刊记者 汪玚 文章摘选编辑于微信公众号“一览众山小-可持续城市与交通”
在“互联网+”充斥的大数据时代,你是否想过自己的位置信息变化将会给城市带来怎样的影响?一个编码员通过颜色、集聚度的变化,发现地铁系统不同线路之间的效率差异,以帮助优化改善今后地铁运营的排班调度计划。听起来很疯狂?更疯狂的还在后面——废旧地铁车厢如何被用来打造成为一座人工岛?为了看挖掘机将18吨重的地铁车厢扔到深海里,就远航到公海边缘,并且坚持拍摄了三年——直至项目被终止,疯狂的摄影师用照片记录了那些远涉重洋最有意义的瞬间。
这不是传统的新闻报道,而是充满生活与行业趣味的小文。别客气,请“享用”。
你是否曾在乘坐公共交通上下班时感觉自己像一颗乒乓球?被拥挤的人流、各种行李以及无休止的自动扶梯上弹来弹去?一个名叫Will Gallia的编码员研究出了一种新的可视化数据显示方式,将伦敦地铁一天里通勤工作的上班族们,简化为一个个繁忙的小像素。
Gallia基于2009年某一天的伦敦地铁数据创造了可视化信息。他选取来自地铁交通卡(Oyster card)中5%的行程样本信息来确定大约每56万乘客的行程起点和终点。(BBC去年报道到每天有350万英国人乘坐地铁。)接着他设计了一个路径算法来预测这些上班族乘坐的线路。最后他将这些出行线路叠加在伦多地铁系统的地图上,通过这些细小如像素般的乘客移动显示出地铁每天的变化。
从这个生动逼真的地铁数据可视化也得到了一些有趣的收获。例如,早上大约8:40和晚上6:10左右开始的一段时间,是这些小像素越来越繁忙的时段。但是也有一些地铁线路地区一直保持着较低的活跃度:例如在Hainault环线的远端角落(Hainault 位于伦敦东北部的红桥周边。那里是伦敦城郊化发展比较早的地区),即使是在通勤高峰时段也几乎没有乘坐地铁的人经过。由此可见,所有的地铁线路的交通流量并不相同。
通过研究2009年某个星期内来自交通卡(Oyster-card)中5%的样本行程信息,实现了伦敦地铁网络中562,145个行程的可视化。
这个研究其实早在2012年就开始了,但是直到2015年才完成。这个想法是为了将人们了解的地铁交通具象化为真正的伦敦地铁数据图。我想将所有的出行都编入着色器。最初我认为,我可以将每一条行程路线(或者人)作为一个像素,通过使用GLSL像素着色器(GLSL:Green Light Stimulated Luminescence)跟踪这些像素,从而得到他们最终的运动轨迹图像。
这个研究经历了很多阶段。首先是处理伦敦交通局(TFL:Transport for London)提供的庞大的CSV格式的出行数据文件(CSV:Comma Separated Values)。我去掉了所有非地铁出行的数据,例如那些轻轨列车(DLR:Docklands Light Railway )、国内铁路等。并使用Unix的线工具命令,例如grep命令(UNIX工具程序,可做文件内的字符串查找)。CSV文件下每行就呈现出:3,‘Tue’,‘LUL’,‘Uxbridge’,‘Holborn’,‘1001’,‘16:41’,‘1032’,‘17:12’。
下一步是编写行程路线程序(行程规划器:行程规划器是特指一个特别的电子搜索引擎以找到两个地点之间使用某种交通方式的最佳路线)。为此我在Python(Python:是一种面向对象、直译式计算机程序设计语言)中使用图遍历算法,通过深度优先搜索的优化版本来寻找最短路线。一旦它与伦敦交通局的最佳行程路线相匹配,那么这项工作步骤就完成了。在这之后,我对最佳行程路线做了一个扩展功能:一个路线查找器。它可以产生一系列可以描摹的特定的行程点。
“综上所述,我最初的想法是使用像素着色器,使得行程中每一个点在着色器下都有自己的属性(这样最长的一条行程线路会有12个点)。”将所有这些点通过像素属性数列输入到着色器中。“这个方法相当有效,但是这种方法帧速率负荷不了,并且我对于每个行程线路所显示出的单一像素图像并不满意。它看起来像这样——”
伦敦地铁日信息变身2分钟动画
一年半之后,笔者对编程有了更多的了解。对整体负载做了调整使物体的速度增加。首先,将最佳行程路线的速度提高了50倍;平均每一条行程线路只需要0.003s。接着,将所有的路线信息保存为二进制文件,这样把他们输入到C++程序时可以运行更快。“现在我也使用Open Frameworks,就像之前我在OpenGL做的一样。”最后,重写了应用在片段着色器上的所有计算方法。当然,片段着色器的改变并不能被看见,它只是用来计算行程路线在某一时刻的点的位置。
使用片段分离器有很多的优势:首先,它使这些行程线路更加快速且更加灵活。例如,片段分离器随着时间的推移可以产生自我摩擦使得其工作效果趋于完美。另外我可以在帧缓冲(FBO:Frame Buffer Object)中输入任何命令并且可以用更多有趣的方式展现缓冲区内的肌理。最后,这意味着我不局限于使用单一像素表现每个行程线路,通过将所有数据加载到一个VBO(Vertex Buffer Object)中,我可以用方形表达它们。这使得这些行程线路不仅看起来更加清晰,同时保持了“一个像素对应一条行程线路”的美学要求。
用Photoshop软件从地铁地图中移除这些线路并且把作为行程路线的底图。最后,做了一些音效对在动画中移动的像素们做出补充。这样,一个约2分钟的动画就完成了。(文/ Aarian Marshall 翻译/GBABEJY)