概要
本文希望做一个基于OSM地图数据对哈尔滨博物馆站站周围1公里的交通分配(可以以此类推)
步骤
交通分配流程–四阶段法
-
交通生成: 首先,在OpenStreetMap中选择指定区域,导出地图数据,并通过OSM2GMNS获取符合GMNS标准的路网信息和POI数据。由于OpenStreetMap作为全球性质的开源地图,存在信息遗漏和错乱的部分,我们需要根据本土地图(天地图、高德和百度地图)中的信息,手动修订存在空缺的POI的建筑物类型信息并整合得出每个分级道路的最大流量和平均车速信息。
-
交通分布: 接下来,由于在不同出行目的下,各建筑物类型的交通发生量和吸引量不同。我们需要设置在不同出行目的下的交通产生率和吸引率。 Grid2demand可以根据建筑物的吸发率和占地面积,计算各POI点的交通发生量和吸引量。此外,对于进出研究范围的道路边界点,默认交通发生量和吸引量为1000。
-
交通分配: 利用Grid2demand得到区域间的出行分布后,利用path4gnms去进行交通分配。
-
**结果分析:**最后,记录每条路径(link)的基本信息以及分配的交通量(volume)、在该Link上所需行驶时间(travel_time)、在该Link上的预估行驶速度(speed)、每个Link的能力利用率(VOC)。利用GIS工具QGIS,将交通分配结果进行可视化展示,直观地呈现交通流量的分布和变化。
涉及QGIS,OSM,python,gmns等等
交通生成
- 从OpenStreetMap (OSM) 获取地图模型,即map.osm
https://www.openstreetmap.org/
- 利用osm2gmns工具将OSM数据转换为GMNS格式,为后续的交通模型构建提供基础数据。
- 安装
pip install osm2gmns
- 代码实现
import osm2gmns as og
# load network from osm file ('auto','bike','walk')多模式交通网
net = og.getNetFromFile("bowuguan_zhongxin.osm", network_types=('auto','bike','walk'), POI=True, default_lanes=True, default_speed=True)
'''复杂交叉口简化功能'''
og.consolidateComplexIntersections(net, auto_identify=True)
‘’‘没有zone.csv 先不要这两行代码‘’‘
'''生成活动信息 activity_type' ''
og.generateNodeActivityInfo(net, zone_file='zone.csv')
'''将POI和流量网络连接'''
og.connectPOIWithNet(net)
'''构建多模式交通网络'''
og.buildMultiResolutionNets(net)
og.outputNetToCSV(net)
- 生成
注意:利用3个步骤获得最终有POI信息的node.csv
- 注释掉那两行代码因为没有zone.csv,此时node.csv中没有poi相关信息
'''生成活动信息 activity_type' ''
og.generateNodeActivityInfo(net, zone_file='zone.csv')
'''将POI和流量网络连接'''
og.connectPOIWithNet(net)
- 随后运行grid2demand时,会生成zone.csv
- 最后在运行带了那两行代码的osm2gnms代码,就可以得到有POI信息的node.csv
交通分布
关于grid2demand,引用这个博主的文章,文章链接。https://blog.youkuaiyun.com/python_n/article/details/115918540
如果从osmgnms和grid2demand得到的node.csv,我们要修改path4gnms代码中的utils.py的四处设置
1、
# prefix = 'LINESTRING ('
# postfix = ')'
prefix = 'POLYGON (('
postfix = '))'
2、
bs_ = bs[b:e]
vs = [x.strip() for x in bs_.split(',')] # x.strip()
3、
# nodes = line['activity_nodes']
nodes = line['node_id_list']
if not nodes:
continue
4、
try:
# node_ids = [int(x) for x in nodes.split(';') if x]
node_ids = ast.literal_eval(nodes)
交通分配
改完这四处代码,就可以运行path4gnms中的tutorial.ipynb,进行交通分配了。
可视化
利用QGIS实现可视化,得到的link_performance.csv,参数有volume和VOC
小结
- 向周学松老师致敬
https://github.com/xzhou99
- b站有周学松老师的视频,可以搜DTAlite。
- 这位大佬Path4GMNS的解读简洁易懂, 牛!
https://github.com/gaotianze/Path4GMNS_Learning