sumo笔记(十)—— 批量生成停车场

目前已有资料:

  1. 停车场的经纬度和停车位的数量
    停车场信息
  2. 城区路网
    sumo.net
    目的:将停车场加入到城市路网中
    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文件
添加sumo坐标的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()


效果:
批量生成停车位
停车场里停车位叠加在一起

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值