首页 > 解决方案 > 绘制 OpenStreetMap 关系不会生成连续线

问题描述

全部,

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

我能够像这样从 OSM 立交桥 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")

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

我处理“rel”对象以获得这样的 pandas.DataFrame:

elements = pd.DataFrame(rel.toJSON()['elements'])

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

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

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

OSM 关系的经纬度图 6750628

如果我们将其与关系在openstreetmap.org本身上的显示方式进行比较,我们会发现它出错了(关注路径的中间、东部)。我有很多这样的例子,尽管也有很多关系可以正确显示。

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

标签: pythonplotleafletopenstreetmap

解决方案


如果我选择仅在彼此之上绘制不同的方式,我确实会得到一个连续的图(索引包含每个方式的所有节点的索引):

所有方式单独绘制

在数据库中,我宁愿对节点进行排序,因为我可以使用它们即时制作 GPX 文件。但我想我确实用这种方法回答了我自己的问题,谢谢@scai 让我朝这个方向发展。


推荐阅读