IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> python将osm文件转换为可应用于matsim的network文件 -> 正文阅读

[开发工具]python将osm文件转换为可应用于matsim的network文件

参考了许多文章,包括b站up主老程序员老关csdn:Liu Zhian等等。

1.将osm文件有效数据提取到csv

osm文件有两大部分,分开操作,将其分为两个文件
在这里插入图片描述
分成两个文件:
在这里插入图片描述
下面是两个文件

<?xml version='1.0' encoding='UTF-8'?>
<nodes>
  <node id='-101752' lat='40.6592449' lon='109.7662487' />
  <node id='-101753' lat='40.6587893' lon='109.7727179' />
  <node id='-101755' lat='40.6585103' lon='109.7767641' />
  <node id='-101756' lat='40.6581603' lon='109.7838497' />
  <node id='-101757' lat='40.6581441' lon='109.7841119' />
  <node id='-101758' lat='40.6459848' lon='109.886676' />
  <node id='-101759' lat='40.6456042' lon='109.8865427' />
  <node id='-101760' lat='40.6426309' lon='109.8838162' />
  <node id='-101761' lat='40.6425291' lon='109.8836902' />
  <node id='-101762' lat='40.6424558' lon='109.8835789' />
  <node id='-101763' lat='40.6424222' lon='109.8833187' />
  <node id='-101764' lat='40.6426996' lon='109.8780347' />
</nodes>
<?xml version='1.0' encoding='UTF-8'?>
<links>
  <way id='-101783' action='modify'>
    <nd ref='-101752' />
    <nd ref='-101753' />
    <nd ref='-101755' />
    <nd ref='-101756' />
    <nd ref='-101757' />
    <tag k='highway' v='primary' />
    <tag k='osm_id' v='13456925' />
    <tag k='z_order' v='7' />
  </way>
  <way id='-101785' action='modify'>
    <nd ref='-101758' />
    <nd ref='-101759' />
    <nd ref='-101760' />
    <nd ref='-101761' />
    <nd ref='-101762' />
    <nd ref='-101763' />
    <nd ref='-101764' />
    <nd ref='-101767' />
    <nd ref='-101768' />
    <nd ref='-101769' />
    <nd ref='-101771' />
    <nd ref='-101772' />
    <nd ref='-101773' />
    <nd ref='-101774' />
    <nd ref='-101775' />
    <nd ref='-101777' />
    <nd ref='-101778' />
    <tag k='highway' v='primary' />
    <tag k='osm_id' v='13457299' />
    <tag k='z_order' v='7' />
  </way>
</links>

下面是python处理代码:

#生成nodes部分
import xml.etree.ElementTree as ET
tree = ET.parse('nodes.xml')#输入xml文档树
print(type(tree))#xml.etree.ElementTree.ElementTree
root = tree.getroot()#root是根元素
print(type(root))#xml.etree.ElementTree.ElementTree
print(root.tag) #notes
with open("nodes.txt","w")as f:
    for index,child,in enumerate(root):
        f.write('{0}'.format(child.attrib))
        f.write('\n')       
#生成links部分
from xml.dom.minidom import parse
def readXML():
    domTree = parse("./links.xml")
	# 文档根元素
    rootNode = domTree.documentElement
    print(rootNode.nodeName)
	# 所有顾客
    links = rootNode.getElementsByTagName("way")
    with open("links.txt","w")as f:
        f.write("****所有way信息****")
        f.write('\n')
        for way in links:
            ways = way.getElementsByTagName("nd")
            if way.hasAttribute("id"):
                f.write('\n')
                f.write('id:{0}'.format(way.getAttribute("id")))
                # name 元素
                for nd in ways:
                    if nd.hasAttribute("ref"):                    
                        f.write('ref:{0}'.format(nd.getAttribute("ref")))
if __name__ == '__main__':
    readXML()

将生成的结果处理一下,去掉无用字符,就得到数据啦,再把数据做成逗号分隔格式,就可存入csv保存了。

2.将提取出的数据转换为xml格式

提取出的数据中,nodes部分需要将地理坐标系转换为投影坐标系;links部分需要将站点编号与地理坐标对应,从而求出每条路径长度。

nodes与links的目标格式:
在这里插入图片描述在这里插入图片描述

link部分的from-to数据处理:

from xml.etree.ElementTree import Element, ElementTree, tostring,SubElement
from itertools import islice   #方便csv文件去表头工作
import argparse
import os
import csv

with open('links.txt','r')as f:
    reader = csv.reader(f)
    #line_count=0
    
    count=len(open(r"links.txt",'rU').readlines())#获取行数
    print("行数:",count)
    
    rows=[row for row in  reader]
    print(rows[0])
    print(len(rows[0]))
    print(type(rows[0]))
    print(rows[0][1])
    
    with open ("links2.txt","w")as f:
        for i in range(count):
            length=len(rows[i])-1
            for j in range(length):
                f.write('{0}'.format(rows[i][j])+','+'{0}'.format(rows[i][j+1]))
                f.write('\n')

下午再写

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:48:22  更:2022-03-22 20:49:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:25:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码