之前向大家介绍过一款获取路网信息的python依赖库——osm2gmns(【神器】你想要的交通网络数据,三行代码搞定!)。成功获取路网数据后,交通规划应该怎么做?当然是从需求开始。
出行需求是交通规划的根基,其产生与土地性质密切相关。以校园为例,上课前的主要出行需求是从宿舍区至教学区,下课后则反之;而在承办大型赛事期间,校园场馆附近的交通量则会明显增加。
放到城市中,甚至是更大范围的区域中也是一样。一次出行总存在一个出发地 (Origin) 和一个目的地 (Destination)。在不同的出行目的下,居住、商业、工业等不同属性的用地有不同的交通产生率和吸引率。
为把需求进一步做细到建筑物 (Point Of Interest),近段时间与美国亚利桑那州立大学ASU Trans AI Lab团队合作开发了一款快速获取出行需求的python依赖库——grid2demand。利用osm2gmns生成的poi.csv,即可根据建筑物属性和出行率表(可自定义)得到指定出行目的下的出行需求,进而利用经典重力模型即可生成OD矩阵。
话不多说,这就教你怎么用
【Step 0.1】安装grid2demand
打开电脑Command Prompt或Anaconda Prompt,输入如下命令行,通过pip安装。
pip install grid2demand
【Step 0.2】下载区域路网
在OpenStreetMap (www.openstreetmap.org) 中选择指定区域,将地图数据导出。

【Step 0.3】利用osm2gmns获取路网信息和POI数据
启动Python编程环境,运行以下代码即可获取路网信息和POI数据。
输出的node.csv和poi.csv将作为grid2demand的输入。
import osm2gmns as og
net = og.getNetFromOSMFile(map.osm,network_type=(railway,aeroway,auto),POIs=True,default_lanes=True,default_speed=True)
og.connectPOIWithNet(net)
og.generateNodeActivityInfo(net)
og.outputNetToCSV(net)
若还未安装osm2gmns,可在Command Prompt或Anaconda Prompt中用pip安装(【神器】你想要的交通网络数据,三行代码搞定!)。
pip install osm2gmns
『注意』
由于OpenStreetMap为开源地图,POI信息可能存在空缺或不准的情况,需要手动修订。

若poi.csv中name列为乱码,可能存在编码错误,请检查系统编码语言和读取csv的软件编码语言是否一致,或直接清空name列内容再运行grid2demand。

install grid2demand as gd
gd.ReadNetworkFiles()

与传统的交通小区不同,我们将研究区域划分为方格网。用户可自定义单元格数量或每个单元格的宽度和高度(米)。因须与地理坐标系匹配,在给定单元格尺寸的时候还需给定研究区域的纬度。
在研究区域外围还设立有虚拟小区,用于描述进出研究区域的交通量。
gd.PartitionGrid(number_of_x_blocks=None,number_of_y_blocks=None,cell_width=1000,cell_height=1000,latitude=30)

不同出行目的下,同一建筑物的吸发率可能不同。用户可自定义出行率表poi_trip_rate.csv和出行目的。

gd.GetPoiTripRate(trip_purpose=1)

对于POI点,根据不同建筑物的吸发率和建筑物的占地面积(也可手动修改poi.csv中的area属性为建筑面积、停车位、人数等测量单位)可计算各点的交通发生量和吸引量。
对于进出研究范围的道路边界点(卡口),默认交通发生量和吸引为1000。
gd.GetNodeDemand()

默认根据小区质心间的直线距离计算,用户也可在accessibility.csv中自定义小区间的可达性为时间、费用等。
gd.ProduceAccessMatrix(latitude=30)


用户可自定义出行目的及阻抗函数的系数,得到小区间的出行分布。
gd.RunGravityModel(trip_purpose=1, a=None, b=None, c=None)

【Step 7】生成点到点的需求 (optional)
为便于后续做路径规划和交通分配,根据上一步得到的小区间的OD分布,随机获取各小区内的点,生成点到点的需求。
gd.GenerateAgentBasedDemand()

【Step 8】可视化 (optional)
在QGIS中添加图层,导入输出的demand.csv,zone.csv等。

右键已添加的demand图层,选择“Properties”,设置“Symbology”为“Graduated”,选择“Value”为“volume”,即可实现根据出行量的可视化。

方格网边界外的需求则表示道路边界点产生、吸引的虚拟小区需求。

为什么是网格状的交通小区?
传统的交通小区通常沿铁路、河流等天然屏障划分,遵循行政区划,以便交通调查和统计资料的获取,但难以克服空间异质性。
以美国国家植物园所在的交通小区为例,统计调查中的小区 (census tract) 为下图中的红色边框。传统的交通模型多是将这样的census tract作为交通小区 (Traffic Analysis Zone)进行需求分析,而忽视了小区内实际客流吸发点的分布。
通过划分方格网,可以将小区的交通吸发量与实际客流吸发点很好地结合,一定程度上降低了空间异质的影响,使OD出行分布更加精准。

最后,感谢合作者Entai Wang@BJTU, Taehooie Kim@ASU近段时间的共同付出!

测试案例、最新版本及更多详细信息,请参见:
https://github.com/Anjun93/grid2demand
https://pypi.org/project/grid2demand/
本次推出的【内测版】供大家尝鲜,快动手试试自己熟悉的地方吧!
天下熙熙,皆为利来;天下攘攘,皆为利往。欢迎留言反馈!
往 期 精 彩
轨道 航空:中国正走出一条前所未有的城镇化道路
【神器】你想要的交通网络数据,三行代码搞定!
Amazing! 一小时有51列车经中野开往新宿、74列车驶入都心!
【交通观察】度假区的交通系统可以有多厉害?
CR沪昆 VS JR东海道