当前位置: 首页 > 知识库问答 >
问题:

如何从OpenStreetMap数据中找到街道交叉口列表?

靳彦
2023-03-14

我正在寻找一种从OpenStreetMap(OSM)数据中准确检索街道交叉口的方法。我知道有人问过和回答过类似的问题,但我可以从建议的方法中检索到的数据并不十分准确。

首先,我知道以下问题:

  • 如何从OpenStreetMap查找十字路口?

上述问题的答案建议:

“查询给定边界框中的所有方式,并查找由两个或多个方式共享的节点,如另一个答案中所述。”

我遵循这个建议,编写了一个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
...

(我用过http://www.darrinward.com/lat-long/ 显然,数据包含一些不是交点的节点(它们可能是朝向两个STEET的存储

我做错了什么,还是这是我能从OSM得到的最好的“交叉”数据?我感谢你的帮助和意见。

最好的

共有1个答案

洪宇定
2023-03-14

第一个Tipp:

不要只与谷歌地图进行比较,主要是与OpenStreetMap可视化进行比较。特别是复杂的街道交叉口,尽管它们代表同一条道路,但可以建立不同的模型。

2) 当前位置如果你真的使用了正确的方式:那是步行道,混合了街道吗?有各种不同的类型,具有不同的网络属性:可供车辆访问,等等。在谷歌地图中,白色道路是指可供车辆访问的道路

3) 进一步看,如果你没有得到房子的多边形混合。

 类似资料:
  • 我一直在玩API、XAPI和OSM的天桥。但我无法获得所需的一些信息:获取街道的所有信息节点。 这里有一个例子:http://www.openstreetmap.org/browse/way/5671291 这提供了一种称为“瓦茨街”(在纽约)的方式的信息,但它不是所有的街道,只是其中的一部分。 另一部分:http://www.openstreetmap.org/browse/way/461163

  • 如何通过API OpenStreetMap从GPS坐标中找到地址? 我可以使用任何语言(javascript,java,...)

  • 问题内容: 我已经安装在Windows机器上的Go 1.2,写了一个虚拟的程序和设置环境变量,并以“AMD64”及“LINUX”。 当我发出“ ”命令时,出现错误: 这是什么意思? 问题答案: 它告诉您需要先构建所有工具,然后才能使用它们。 如果您的Windows GOARCH是amd64,则可以通过运行以下小批处理程序来“构建”所有必需的工具: 如果成功,那么您应该能够执行您所描述的操作(只使用

  • 我正在开发一个Java应用程序,它给定一个街道名称列表,必须获得每条街道名称的路线和信息,如每条街道所在的城市。这是一个在桌面上为Android应用程序做的预处理。 为此,我必须处理来自OSM等地图源的数据。我需要以编程方式轻松访问街道和其他一些点的数据,以选择我想要的数据。 我需要用Java来做。有一些Java库吗?

  • 问题内容: 实际输出: 预期输出: 我们如何在两个列表上实现布尔AND操作(列表交集)? 问题答案: 如果顺序不重要,并且你不必担心重复,则可以使用set相交:

  • 通过从左到右遍历数组并插入每个元素,创建了一个二叉搜索树。这棵树可能不是一棵平衡的树。给定一个具有不同元素的二元搜索树,打印所有可能导致该树的数组。 为了回答这个问题,我编写了以下代码。尽管如此,它似乎并没有打印出所有可能导致所有情况下的树的所有可能数组。你认为应该修改什么?