目前已有资料:
- 停车场的经纬度和停车位的数量
- 城区路网
目的:将停车场加入到城市路网中
step1:将停车场经纬度信息生成为sumo中的x,y坐标
import csv
import pandas as pd
import sumolib
import csv
def read_sumo_net():
path = r'D:\Pycharm\shp_to_sumo\suzhou.net.xml'
net = sumolib.net.readNet(path, withInternal=True)
return net
def LonLat2XY():
net = read_sumo_net()
df = pd.read_csv('parkingarea.csv', encoding='gbk')
sumo_x = []
sumo_y = []
for i in range(df.shape[0]):
lon = df.loc[i, 'Longitude']*0.000001 # 给的经纬度数据没加小数点
lat = df.loc[i, 'Latitude']*0.000001
x, y = net.convertLonLat2XY(lon, lat)
sumo_x.append(x)
sumo_y.append(y)
df['sumo_x'] = sumo_x
df['sumo_y'] = sumo_y
df.to_csv(r'D:\Pycharm\苏州古城停车场转换\parking_sumo.csv',encoding='gbk')
if __name__ == "__main__":
LonLat2XY()
这里直接调用了sumo中的net.convertLonLat2XY函数,将经纬度信息转换为了x,y
得到新的csv文件
step2: 删除不可通行车辆的道路
此步骤是用了netconvert函数中剔除边的操作,输入netconvert --help可以查找netconvert的功能。
可以看到,可以通过选择道路种类的方法来进行道路移除。
如-s net.xml -o noservice.net.xml --remove-edge.by-type "highway.service,highway.pedestrian"
step3:通过sumo中的最近邻匹配来进行操作:
import pandas as pd
import numpy as np
import sumolib
import csv
import xml.etree.cElementTree as ET
import xml.dom.minidom as minidom
def read_sumo_net():
# 这里的net剔除车辆不能行走的车道
path = r'D:\Pycharm\for_sumo_gui\suzhou_noservice.net.xml'
net = sumolib.net.readNet(path, withInternal=True)
return net
def read_parking():
net = read_sumo_net()
df = pd.read_csv('parking_sumo.csv', encoding='gbk')
df1 = df
radius = 20
sumo_x = (df.values[:, 9]).tolist()
sumo_y = (df.values[:, 10]).tolist()
num_parking = (df.values[:, 8].tolist())
all_edge_list = []
all_dist_list = []
for i in range(df.shape[0]):
x = sumo_x[i]
y = sumo_y[i]
edges = net.getNeighboringEdges(x, y, radius)
is_neighboring_sequence = False
if len(edges) >= 2 and is_neighboring_sequence:
edge_list = []
dist_list = []
for item in edges:
edge = item[0].getID()
dist = item[1]
edge_list.append(edge)
dist_list = list.append(dist)
all_df = pd.DataFrame({'edge': edge_list, 'dist': dist_list})
closestEdge = all_df.loc[all_df['dist'].idmin(), 'edge']
min_dist = all_df['dist'].min()
all_edge_list.append(str(closestEdge))
all_dist_list.append(min_dist)
elif len(edges) > 0:
edge_list = []
dist_list = []
for item in edges:
edge = item[0].getID()
dist = item[1]
edge_list.append(edge)
dist_list.append(dist)
all_df = pd.DataFrame({'edge': edge_list, 'dist': dist_list})
closestEdge = all_df.loc[all_df['dist'].idxmin(), 'edge']
min_dist = all_df['dist'].min()
all_edge_list.append(str(closestEdge))
all_dist_list.append(min_dist)
else:
# 如果搜索不到:len(edges)=0 说明 没有搜索到最近的边 返回 None
all_edge_list.append('None')
all_dist_list.append('None')
df1['edge'] = all_edge_list
df1['distance'] = all_dist_list
df1.drop(index=df1.loc[df['edge'] == 'None', :].index, inplace=True)
df1.to_csv(r'D:\Pycharm\苏州古城停车场转换\map_match.csv', encoding='gbk')
return df1
def write_xml():
DF = pd.read_csv(r'D:\Pycharm\苏州古城停车场转换\map_match.csv', encoding='gbk')
num_parking = (DF.values[:,9]).tolist()
all_edge_list = (DF.values[:,12]).tolist()
sumo_x = (DF.values[:,10]).tolist()
sumo_y = (DF.values[:,11]).tolist()
print(DF.shape[0])
# num_parking, all_edge_list, all_dist_list, sumo_x, sumo_y = read_parking()
dom = minidom.getDOMImplementation().createDocument(None, 'additional', None)
additional = dom.documentElement
for i in range(len(all_edge_list)):
parkingArea = dom.createElement("parkingArea")
parking_id = 'id'+str(i)
lane = all_edge_list[i]+'_2'
parkingArea.setAttribute("id", str(parking_id))
parkingArea.setAttribute('lane', str(lane))
parkingArea.setAttribute('roadsideCapacity', "0")
additional.appendChild(parkingArea)
x1 = sumo_x[i]
y1 = sumo_y[i]
for k in range(num_parking[i]):
space = dom.createElement('space')
space.setAttribute("x", str(x1))
space.setAttribute("y", str(y1))
space.setAttribute("width", str(4))
space.setAttribute("length", str(8))
parkingArea.appendChild(space)
with open(r"D:\Pycharm\for_sumo_gui\additional.add.xml", 'w') as f:
dom.writexml(f, addindent='\t', newl='\n', encoding='utf-8')
'''
再写一个停车位批量生成的
'''
def many_parking_space():
x_l = 2530 # 左边界
x_r = 2618 # 右边界
y_up = 2340 # 上边界
y_down = 2260 # 下边界
X = np.arange(x_l, x_r, 7)
Y = np.arange(y_down, y_up, 9)
dom = minidom.getDOMImplementation().createDocument(None, 'additional', None)
additional = dom.documentElement
parkingArea = dom.createElement("parkingArea")
parking_id = 'ParkingArea1'
lane = '793885079_2'
parkingArea.setAttribute("id", str(parking_id))
parkingArea.setAttribute('lane', str(lane))
parkingArea.setAttribute('roadsideCapacity', "0")
additional.appendChild(parkingArea)
for x in X:
for y in Y:
space = dom.createElement('space')
space.setAttribute("x", str(x))
space.setAttribute("y", str(y))
space.setAttribute("width", str(4))
space.setAttribute("length", str(8))
parkingArea.appendChild(space)
with open(r"D:\Pycharm\for_sumo_gui\additional_manyparkingspace.add.xml", 'w') as f:
dom.writexml(f, addindent='\t', newl='\n', encoding='utf-8')
if __name__ == "__main__":
'''
运行的时候先只运行read_parking(),第二次运行再运行其余两个
'''
# write_xml()
many_parking_space()
#read_parking()
效果: