如何从 OpenStreetMap 数据中找到街道交叉口的列表?
Posted
技术标签:
【中文标题】如何从 OpenStreetMap 数据中找到街道交叉口的列表?【英文标题】:How can I find a list of street intersections from OpenStreetMap data? 【发布时间】:2013-02-05 20:39:33 【问题描述】:我正在寻找一种从 OpenStreetMap (OSM) 数据中准确检索街道交叉口的方法。我知道有人提出并回答了类似的问题,但我可以从建议的方法中检索到的数据不是很准确。
首先,我知道以下问题:
how to find intersections from OpenStreetMap? Detection of Intersections in the maps上述问题的答案表明:
“查询给定边界框中的所有方式,并查找由两个或多个方式共享的节点,如另一个答案中所述。”
我按照这个建议编写了一个 python 脚本,它从我从OpenStreetMap 下载的 xml 文件(osm 文件)中提取节点元素。以下是代码:
try:
from xml.etree import cElementTree as ET
except ImportError, e:
from xml.etree import ElementTree as ET
def extract_intersections(osm, verbose=True):
# This function takes an osm file as an input. It then goes through each xml
# element and searches for nodes that are shared by two or more ways.
# Parameter:
# - osm: An xml file that contains OpenStreetMap's map information
# - verbose: If true, print some outputs to terminal.
#
# Ex) extract_intersections('WashingtonDC.osm')
#
tree = ET.parse(osm)
root = tree.getroot()
counter =
for child in root:
if child.tag == 'way':
for item in child:
if item.tag == 'nd':
nd_ref = item.attrib['ref']
if not nd_ref in counter:
counter[nd_ref] = 0
counter[nd_ref] += 1
# Find nodes that are shared with more than one way, which
# might correspond to intersections
intersections = filter(lambda x: counter[x] > 1, counter)
# Extract intersection coordinates
# You can plot the result using this url.
# http://www.darrinward.com/lat-long/
intersection_coordinates = []
for child in root:
if child.tag == 'node' and child.attrib['id'] in intersections:
coordinate = child.attrib['lat'] + ',' + child.attrib['lon']
if verbose:
print coordinate
intersection_coordinates.append(coordinate)
return intersection_coordinates
如果我使用从 OSM 导出的数据运行此代码(例如,我使用从导出区域导出的数据:Min Lat:38.89239,Max Lat:38.89981,Min Lon:-77.03212,和 Max Lon: -77.02119.),它会打印出如下所示的坐标:
38.8966440,-77.0259810
38.8973430,-77.0280900
38.9010391,-77.0270309
38.8961050,-77.0319620
...
如果我在 Google 地图上绘制这些坐标,它看起来像:
(我使用http://www.darrinward.com/lat-long/ 绘制数据。)显然数据包含一些不是交叉点的节点(它们可能是面向两条街道的商店。)
我做错了什么,或者这是我可以从 OSM 获得的最佳“交集”数据吗?感谢您的帮助和 cmets。
最好的,
【问题讨论】:
我正在尝试做与您类似的事情。目前,我从高速公路类型的高速公路的“方式”标签中提取所有节点(稍后我将包括在其他高速公路类型中——主要、次要等)。 (在一个python字典中,键是id,值是节点列表)使用你的帖子,我遇到了和你一样的问题。你能否让我知道我怎样才能获得道路类型----Highway---仅限高速公路的所有相交节点?任何帮助将不胜感激:) 这是另一个关于***的类似问题:***.com/questions/12965090/… 【参考方案1】:第一个提示:
不仅要与谷歌地图进行比较,还要将您的坐标主要与 OpenStreetMap 可视化进行比较。尤其是复杂的街道交叉口,虽然它们代表相同的道路,但可以进行不同的建模。
2):看看你是否真的使用了正确的方式:那是人行道,与街道混合吗?有各种不同的类型,具有不同的属性:车辆可通行等。在 Google 地图中,白色道路是车辆可通行的道路
3) 进一步看,如果你没有混入房屋多边形。
【讨论】:
嗨,AlexWien,非常感谢! (1) 是的,我会记住这一点。 (2) 和 (3) 你是对的,我混合了不同类型的方式。我提取了街道,现在它得到了修复 :) 再次感谢 :) @Kotaro:你最后是怎么解决这个问题的?提取街道的方法是什么? @statBeginner :在上面提取<way>
元素的代码中,我最终过滤掉了不必要的高速公路元素(例如,footway
)。更具体地说,我使用motorway
、trunk
、primary
、secondary
、tertialy
和 residential
。见wiki.openstreetmap.org/wiki/Key:highway以上是关于如何从 OpenStreetMap 数据中找到街道交叉口的列表?的主要内容,如果未能解决你的问题,请参考以下文章
获取 Tilemill 以显示带有英文标题的 openstreetmap 地图