我在桌面上下载了一个 OpenStreetMap 文件,并且在 jupyter notebook 中使用了我的 OSM 文件。
我的代码:
import xml.etree.cElementTree as ET
osm_file = "ahmedabad_india.osm"
for event, elem in ET.iterparse(osm_file, events=("start",)):
print(elem)
# prints the Element 'osm' at 0x03A7DC08>
#<Element 'bounds' at 0x03A7DDA0>
#<Element 'node' at 0x03A7DE90>
#<Element 'tag' at 0x03A7DF08> and so on ...
我想查看所有
tags
的内容,即<'node', 'id', 'name', ...>
等等。我尝试使用
elem
标签,但它什么也不打印。谁能帮我弄清楚,谁来获取节点、方式等标签的内容?
最佳答案
您可以通过 PyOsmium (用于处理 OpenStreetMap 数据的快速灵活的 C++ 库)从 .osm
文件中提取所有数据,然后使用 Pandas 处理它:
代码:
import osmium as osm
import pandas as pd
class OSMHandler(osm.SimpleHandler):
def __init__(self):
osm.SimpleHandler.__init__(self)
self.osm_data = []
def tag_inventory(self, elem, elem_type):
for tag in elem.tags:
self.osm_data.append([elem_type,
elem.id,
elem.version,
elem.visible,
pd.Timestamp(elem.timestamp),
elem.uid,
elem.user,
elem.changeset,
len(elem.tags),
tag.k,
tag.v])
def node(self, n):
self.tag_inventory(n, "node")
def way(self, w):
self.tag_inventory(w, "way")
def relation(self, r):
self.tag_inventory(r, "relation")
osmhandler = OSMHandler()
# scan the input file and fills the handler list accordingly
osmhandler.apply_file("muenchen.osm")
# transform the list into a pandas DataFrame
data_colnames = ['type', 'id', 'version', 'visible', 'ts', 'uid',
'user', 'chgset', 'ntags', 'tagkey', 'tagvalue']
df_osm = pd.DataFrame(osmhandler.osm_data, columns=data_colnames)
df_osm = tag_genome.sort_values(by=['type', 'id', 'ts'])
输出:
关于python - 如何在 Python 中从 OSM 文件中提取和可视化数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45771809/