Python讀取excel資料進行SUMO模擬
阿新 • • 發佈:2019-01-01
在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、模擬
然後編輯配置檔案,執行進行模擬即可。