如何在Python中从OSM文件中提取和可视化数据
我在我的桌面上下载了一个OpenStreetMap文件,并在jupyter笔记本中使用了我的OSM文件 我的代码:如何在Python中从OSM文件中提取和可视化数据,python,pandas,openstreetmap,osmium,Python,Pandas,Openstreetmap,Osmium,我在我的桌面上下载了一个OpenStreetMap文件,并在jupyter笔记本中使用了我的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 0x03A7DC
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 ...
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'])
将xml.etree.cElementTree作为ET导入
osm_file=“ahmedabad_india.osm”
对于事件,ET.iterparse(osm_文件,事件=(“开始”),中的元素:
打印(elem)
#在0x03A7DC08处打印元素“osm”>
#
#
#等等。。。
我想查看所有标签的内容,即。
等等
我尝试使用elem
标记,但它不打印任何内容
可以帮助我找出,谁得到标签的内容,比如节点、方法等等?< /P> < P>你可以从<代码> .OSM < /C>文件中提取所有数据,通过<强> < />(一个快速灵活的C++库来处理OpenStudioMeta数据),然后用<强> < /强>:< /P>处理它。
代码:
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 ...
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'])
输出:
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 ...
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'])
我首先关心的是如何获取.osm文件。有没有一种自动化的pythonic方法来获取这样的文件?此外,在访问数据的过程中,是否不必下载一些消耗系统资源的物理文件就可以直接访问数据?您只需访问osm网站,选择一个小区域并将其导出。如何获取元素的纬度和经度?@VictorMarconi如果您编写print(elem)在tag_库存定义下方,您可以看到坐标的存储方式如下location=8.786805/53.074942
,这意味着elem.location将为您提供该值