请参考我上一篇文章链接: link
注意的是,为了防止第三步公交信息匹配时匹配到铁路或者自行车道上,我们这里采用 --remove-edges.by-type 来去除不需要的道路
netconvert --osm-files 79.osm -o 79.net.xml --remove-edges.by-type bikelanes,railway,highway.service,highway.cycleway,highway.path,highway.footway,railway.highspeed,railway.rail
方法一:用netconvert自动生成公共交通信息。
netconvert --osm-files osm.xml -o net.net.xml --osm.stop-output.length 20 --ptstop-output additional.xml --ptline-output ptlines.xml
–osm-files osm.xml指向OpenStreetMap 文件
-o net.net.xml指向要生成的SUMO网络文件
–osm.stop-output.length 20定义 PT 停止平台的长度,以米为单位
–ptstop-output additional.xml指向要生成的PT停止文件
–ptline-output ptlines.xml指向定义 PT 行的中间文件。
实践证明,这个方法导出的公交信息少得可怜,不过地铁信息倒是挺全的,遂换方法。
方法二:
去高德/百度自己爬,爬到的数据坐标系为GCJ-02(高德)/bd-09(百度),需要把爬到的数据坐标系转为wgs84,因为openStreetMap的坐标系是wgs84,转换生成的路网也是wgs84坐标系。
方法三:推荐一个库:transbigdata,很好用,而且爬到的经纬度坐标就是wgs84,不需要再转换。
这里采用方法三,代码如下:
import transbigdata as tbd
line,stop = tbd.getbusdata('成都 ','79路')
stop.to_csv('stops_79.csv',index=False,encoding='utf-8_sig')
line.to_csv('lines_79.csv',index=False,encoding='utf-8_sig')
这是最难的一步,可以划分为站点匹配和轨迹匹配,和写入xml文件
路网里面坐标是x,y,而爬取到的数据是经纬度,现在要把它们统一。sumo自带函数里有把经纬度转为x,y坐标的,遂决定把经纬度转换为x,y坐标。
代码如下:
import pandas as pd
import sumolib
data = pd.read_csv('stops_79.csv',encoding='utf-8')
lat = data['lat']
lon = data['lon']
lon = list(map(float,lon))
lat = list(map(float,lat))
x={
}
y={
}
net = sumolib.net.readNet('79.net.xml')
for i in range(len(lon)):
x[i],y[i] = net.convertLonLat2XY(lon[i], lat[i])
dataframe = pd.DataFrame({
'x':x,'y':y})
dataframe.to_csv("station.csv",encoding='utf-8')
1.我一开始想的是把站点看成点,把道路看成直线,然后比较点到各直线的距离,取最短的来匹配。这方法简单粗暴,但是不精确,遂换方法。
2.后来了解到隐马尔科夫模型(HMM),正当我准备自己实现的时候,一位大佬告诉我,sumo自带道路匹配函数:
edges = net.getNeighboringEdges(x, y, radius)
if len(edges) > 0:
distancesAndEdges = sorted([(dist, edge) for edge, dist in edges])
dist, closestEdge = distancesAndEdges[0]
然后用closestEdge.getID()获取道路名称,这样就匹配到道路了。
同样的办法,先转换成x,y坐标,再匹配到道路。
网上有很多写xml文件的教程,这里就不赘述了,放一下我写站点的代码吧。
from xml.dom import minidom
import pandas as pd
file = minidom.Document() # 创建xml文件对象
dom = minidom.Document()
data = pd.read_csv('matching.csv',encoding='utf-8')
x = data['x']
lane = data['lane']
lane_route = lane + '_0'
additional_node = dom.createElement("additional")
file.appendChild(additional_node) # 使其成为根节点
busStop_node = {
}
stop_node = {
}
for i in range(len(x)):
busStop_node[i] = file.createElement('busStop') # 创建第二个节点
busStop_node[i].setAttribute('id','{}'.format(i)) # 设置attrib
# busStop_node[i].setAttribute('name','{}'.format(name[i]))
busStop_node[i].setAttribute('lane','{}'.format(lane_route[i]))
busStop_node[i].setAttribute('startPos','{}'.format(x[i]-20))
busStop_node[i].setAttribute('endPos','{}'.format(x[i]+20))
busStop_node[i].setAttribute('friendlyPos','True')
busStop_node[i].setAttribute('lines','79')
additional_node.appendChild(busStop_node[i]) # 将Maple节点添加到root节点下
with open('stop.add.xml', 'w') as f:
file.writexml(f, indent='', addindent='\t', newl='\n', encoding='UTF-8')
这里的edges.csv
SUMO tools下的自带功能,可以根据一个固定的发车周期及公交线路、站点,生成公交流量,用于SUMO仿真。
python ptlines2flows.py -n 79.net.xml -s stops.xml -l lines.xml -o 79.rou.xml
不知道为啥它要报错,检查半天也没找出哪里有错误。遂放弃,打算自己写.rou.xml文件
站点匹配还挺准确的,但是轨迹匹配点太多,有些会匹配错。大佬告诉我可以先提高匹配精度(减小匹配参数),然后用traci里面的traci.simulation.findRoute()来找路。
但我还不太会用traci,于是就一条路一条路检查,大概花了两个小时,纠错的路段大概有20条。
关于车站停车和流动发车,sumo官方文档里有相关格式,这里也就不多介绍了。
害,还是太菜了啊,看来得多看看官方文档了。
一、官方源码下载https://github.com/qt-creator/qt-creatorhttps://github.com/qt/qtbasehttp://download.qt.io/official_releases/qtcreator/4.8/4.8.2/二、IDE和编译器准备Qt Creator IDE和MSVC 2015编译器组合使用(不想完整安装VS...
题目链接方法一(暴力):这题很容易看出来是个典型的dfs题,只要注意剪枝(把结果一定为0的情况进行剪枝)就能过,下面是代码:#include<cstdio>using namespace std;bool a[1 << 18];int dfs(int n, bool* s) { if (n == 1) return 1; n >>= 1; bool...
2019独角兽企业重金招聘Python工程师标准>>> ...
from :http://www.linuxren.org/article/ebooks/programpython/_chapter%201.htm#python2-CHP-1-SECT-3 Table 1-1. Python Language Features Features Benefits No compile or li...
本章描述了驱动定义功能集群持久性工作的所有需求。功能性集群持久性将在其余部分中引用为“持久性”。autosar中的针对persistency提出了需求和规范定义,其中,持久化应该提供数据存储以及检索等有关的内容,所以其需要处理以下几部分内容:•在启动和点火周期中持续存储数据。•访问持久化存储的数据。•使用唯一标识符访问数据。•从文件中读写数据。•持久数据加密。•错误检测和存储数据的纠正。•监控存储空间。本文从上述几部分开始进行分析需求,持久性应满足以下功能要求。
Swagger快速入门一。Swagger简介1. 前后端分离2. Swagger引入springfox-swagger 2SpringFox 3.0.0 发布swagger3.0 与2.xx配置差异:具体使用教程如下1.导入依赖2.application.yml配置3.配置Swagger API信息4.修改默认API文档显示页面配置Swagger自定义扫描接口自定义扫描接口配置是否启动SwaggerSwagger只在生产环境下使用配置API文档分组1. 设置默认组名2. 配置多个组配置Model实体类只要我
CListCtrl::SetExtendedStyleCListCtrl的成员函数声明 DWORD SetExtendedStyle( DWORD dwNewStyle ); 函数功能设置CListCtrl的扩展样式 dwNewStyle指定的扩展样式 LVS_EX_GRIDLINES //绘制表格,网格线。 LVS_EX
openSUSE的初级设置本文本参考资料: openSUSE帮助文档翻译版 一本叫openSUSE快速入门的书(名字忘了)基本介绍 国际两大商业化Linux版本:REDHAT | SUSESUSE 是GNU/LINUX的流行发行版本,面向企业的版本为以下两个版本:SLES(SUSE Linux Enterprise Server),面向企业用户,高稳定,高可靠,高安
1> if 用于条件判断 例如: int a; int b ; if(a>b){ 如果 a > b 成立时 ,就执行 if 里面的语句 }else{ 如果 a>b 不成立就执行 else 中的语句 } if(a>8){ a>...
一开始看完这道题,第一反应是设置状态为d[i]表示前i个数值的最长列,但是实际上似乎并不行,目标一个状态里包含的东西有点多了,就更改为了第i个数值的最长列。这样这道题就分解成了2个循环过程,第一个过程中嵌套一个对这个数值之前的几个数值的比较并且进行取最大值的过程,得到每一个数值在这个位置的最长列长度,最后进行一次循环取长度最大值。#include #include #include int
在复数类中的运算符重载基础上(1)再定义一目运算符 -,-c相当于0-c。(2)定义Complex类中的>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然。/** Copyright (c) 2015,烟台大学计算机学院* All right reserved.* 作者:邵帅* 文件:Demo.cpp* 完成时间:2015年05月14日* 版