绘制 OpenStreetMap 关系不会生成连续线

Fre*_*eek 5 python plot openstreetmap leaflet

全部,

我一直在研究全球所有山地车路线的索引。我是一个 Python 人,所以对于涉及的所有步骤,我尝试使用 Python 模块。

我能够从 OSM Overpass API 获取关系,如下所示:

from OSMPythonTools.overpass import Overpass
overpass = Overpass()

def fetch_relation_coords(relation): 
    rel = overpass.query('rel(%s); (._;>;); out;' % relation)
    return rel

rel = fetch_relation_coords("6750628")
Run Code Online (Sandbox Code Playgroud)

我选择这个特定的关系 (6750628),因为它是导致不连续(或其他错误)绘图的几个关系之一。

我处理“rel”对象以获得 pandas.DataFrame,如下所示:

elements = pd.DataFrame(rel.toJSON()['elements'])
Run Code Online (Sandbox Code Playgroud)

“元素”看起来像这样: 元素数据框

元素 pandas.DataFrame 包含“relation”类型的行(本例中为 1)、一些“way”类型的行和许多“node”类型的行。据我了解,我将使用“关系”行、“成员”列来提取路径的顺序(指向节点),并使用该顺序创建节点的纬度和经度列表(以便稍后在传单中使用),按照正确的顺序,即导致地图上连续路径的顺序。

然而,事实并非如此。对于这种特定的关系,我最终得到以下图:

OSM 关系的纬度和经度图 6750628

如果我们将其与openstreetmap.org本身显示关系的方式进行比较,我们会发现它出了问题(重点关注路径的中部、东部部分)。我有很多发生这种情况的例子,尽管也有很多关系确实显示正确。

所以我想知道,我错过了什么?是否有带有标签的节点需要忽略?我已经尝试了几件事,包括省略带有任何标签的节点,这没有帮助。我的处理在某个地方是错误的,但我不明白在哪里。

sca*_*cai 2

您需要自己对关系内部的方式进行排序。只有少数关系类型需要排序成员,例如一些路由关系,例如route=busroute=tram。其他人可能有排序成员,例如等route=hikingroute=bicycle但他们不需要它们。各种其他关系,例如边界关系 ( type=boundary),通常没有排序成员。

我很确定已经有各种工具用于对关系成员进行排序,显然这包括 openstreetmap.org 网站,该网站可以正确显示此关系。不幸的是,我无法向您指出这些工具,但我想一点点研究就会揭示其他工具。