python OSM xml立交桥

时间:2014-09-29 10:20:07

标签: python xml openstreetmap

从overpass-API读取数据,获取基本字段没有问题。从下面的例子中,lat和lon很容易阅读。我无法管理的是用K = xxxx读取各种标签,v = yyyyy;我需要读一个k =" name"以便建立一个城市名称列表,lat,lon。

本文档中包含的数据来自www.openstreetmap.org。数据在ODbL下提供。

<node id="31024030" lat="51.0763933" lon="4.7224848">
  <tag k="is_in" v="Antwerpen, Belgium, Europe"/>
  <tag k="is_in:continent" v="Europe"/>
  <tag k="is_in:country" v="Belgium"/>
  <tag k="is_in:province" v="Antwerp"/>
  <tag k="name" v="Heist-op-den-Berg"/>
  <tag k="openGeoDB:auto_update" v="population"/>
  <tag k="openGeoDB:is_in" v="Heist-op-den-Berg,Heist-op-den-Berg,Mechelen,Mechelen,Antwerpen,Antwerpen,Vlaanderen,Vlaanderen,Belgique,Belgique,Europe"/>

我的代码:

import xml.etree.cElementTree as ET
tree = ET.parse('target.osm')
root = tree.getroot()
allnodes=root.findall('node')
for node in allnodes:
 lat=node.get('lat')
 lon=node.get('lon')
 cityname='' # set default in case proper tag not found
 for tag in node.getiterator():
    print tag.attrib
    # add code here to get the cityname
 print lat,lon,cityname

2 个答案:

答案 0 :(得分:1)

您需要迭代每个节点的所有子节点并搜索具有k="name"属性的元素:

for tag in node.findall('tag'):
    if tag.attrib['k'] == 'name':
        cityname = tag.attrib['v']

或者使用get()方法:

for tag in node.findall('tag'):
    if tag.get('k') == 'name':
        cityname = tag.get('v')

请注意,名称中的节点不一定代表OSM中的城市。相反,城市会有其他标签,例如place=*

答案 1 :(得分:0)

您可能需要考虑使用现有的OP-API wrapper

如果不这样做,您可以使用SAX XML界面来提高性能。因此,您将创建一个解析器类并注册XML子元素的回调。