1. 程式人生 > >Python讀取excel資料進行SUMO模擬

Python讀取excel資料進行SUMO模擬

在sumo模擬學習過程中,對方提出需求:提供路口交通流資料,按照資料進行模擬。

 

提供資料有:交叉口每個方向車輛資料(5分鐘重新整理一次),路口的Vissim地圖等。

我們要根據提供的資訊來進行基於SUMO的模擬。我們的步驟是:

1、獲取net.xml

2、獲取rou.xml

3、進行模擬

1、獲取net.xml

因為對方提供的是vissm的路網資料。格式為.inpx。雖然說sumo提供了指令可以實現從.inpx到net.xml的實現,但是對於複雜網路,轉換效果並不理想。我們還是直接從OpenStreetMap來下載路網資料。這裡我們擷取我們進行模擬的區域地圖。然後通過netconvert將.osm地圖資料轉化為.net.xml資料。

Netconvert –osm-file filename.osm –o filename.net.xml

2、獲取rou.xml

這裡我們使用flow定義來實現五分鐘內的車流。這裡要做的就是從excel表中將資料篩選出,然後寫入rou.xml檔案。


算了一下將近3000條資料,人工篩選簡直是作死。那麼程式篩選。分析給的資料格式,我們首先將給的車輛資料和車輛行駛方向掛鉤。比如:

北左1:S_E(即北->東方向),北直2:S_N(即北->南方向)………以此類推

然後分析excel表,從第9行開始,其中0、5、10 、13 、18列為總數,不讀取,其他為0 的也不讀取。時間按照每行增加。

相關程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 讀取excel資料
from __future__ import print_function
import xlrd

def generate_routefile():

    data = xlrd.open_workbook('hefei_jinsong3_liuliang_2016-08-25.xls')
    table = data.sheets()[0]
    nrows = table.nrows
    rouNum = 0
    beginTime = 0
    endTime = 3000
    rouReal = (0,'jinsong3_hefei_S_E','jinsong3_hefei_S_N','jinsong3_hefei_S_N','jinsong3_hefei_S_N',
        0,'jinsong3_hefei_E_E','jinsong3_hefei_E_W','jinsong3_hefei_E_W','jinsong3_hefei_E_S',
        0,'jinsong3_hefei_N_W','jinsong3_hefei_N_S',0,'jinsong3_hefei_W_W','jinsong3_hefei_W_S',
        'jinsong3_hefei_W_E','jinsong3_hefei_W_N',0)
	#這裡的語句相當於routes=open("data/cross.rou.xml","w"),開啟檔案並賦值
    with open("hefei_jinsong3_liuliang_2016-08-25.rou.xml", "w") as routes:
	#將以下內容寫入rou.xml檔案中
        print("""<?xml version="1.0" encoding="UTF-8"?>
        <routes>
        <route id="jinsong3_hefei_E_S" edges="384486711#8 384501552#3"/>
        <route id="jinsong3_hefei_E_W" edges="384486711#8 384486711#9 384486711#10"/>
        <route id="jinsong3_hefei_E_N" edges="384486711#8 384486711#9 384501549#2 384501549#3"/>
        <route id="jinsong3_hefei_E_E" edges="384486711#8 384486711#9 384501549#2 384486722#5 384486722#6"/>
        <route id="jinsong3_hefei_S_N" edges="384501549#1 384501549#2 384501549#3"/>
        <route id="jinsong3_hefei_S_W" edges="384501549#1 384486711#10"/>
        <route id="jinsong3_hefei_S_E" edges="384501549#1 384501549#2 384486722#5 384486722#6"/>
        <route id="jinsong3_hefei_S_S" edges="384501549#1 384501549#2 384486722#5 384501552#2 384501552#3"/>
        <route id="jinsong3_hefei_W_N" edges="384486722#4 384501549#3"/>
        <route id="jinsong3_hefei_W_E" edges="384486722#4 384486722#5 384486722#6"/>
        <route id="jinsong3_hefei_W_S" edges="384486722#4 384486722#5 384501552#2 384501552#3"/>
        <route id="jinsong3_hefei_W_W" edges="384486722#4 384486722#5 384501552#2 384486711#9 384486711#10"/>
        <route id="jinsong3_hefei_N_E" edges="384501552#1 384486722#6"/>
        <route id="jinsong3_hefei_N_S" edges="384501552#1 384501552#2 384501552#3"/>
        <route id="jinsong3_hefei_N_W" edges="384501552#1 384501552#2 384486711#9 384486711#10"/>
        <route id="jinsong3_hefei_N_N" edges="384501552#1 384501552#2 384486711#9 384501549#2 384501549#3"/>""", file=routes)

        for i in range(92,nrows):
            for j in range(18):
                if table.row_values(i)[j] > 0:
                    if j in [0,5,10,13]:continue
                    print('        <flow id="js3_hf_%s" route="%s" begin="%d" end="%d" number="%d" departlane = "random"/>' %
                        (rouNum, str(rouReal[j]), beginTime , endTime,table.row_values(i)[j]), file=routes)
                    rouNum += 1
            beginTime = endTime
            endTime += 3000
		#至此,寫完了rou.xml檔案,這裡全部都是隨機生成的
        print("</routes>", file=routes)

if __name__ == '__main__':
	generate_routefile()

最終得到的rou檔案內容(部分)如下:


3、模擬

然後編輯配置檔案,執行進行模擬即可。