【问题标题】:Why do these 2 approaches produce different amount of ways in OSM Object?为什么这两种方法在 OSM 对象中产生不同数量的方式?
【发布时间】:2020-08-17 12:33:43
【问题描述】:

为什么这两种方法会产生不同数量的方式?

根据方式定义:

定义了一种方式:

路是一个有序的节点列表,通常也至少有一个 标记或包含在关系中。一种方式可以有 2 到 2,000 个节点,尽管零或 单节点存在。一条路可以是开放的,也可以是封闭的。封闭的方式是一种 其途中的最后一个节点也是该途中的第一个节点。封闭的方式 可以被解释为封闭的折线,或区域,或两者兼而有之。

节点定义为:

节点可用于定义独立的点特征,但更常用于定义路径的形状或“路径”。

<node id="25496583" lat="51.5173639" lon="-0.140043" version="1" changeset="203496" user="80n" uid="1238" visible="true" timestamp="2007-01-28T11:40:26Z">
<tag k="highway" v="traffic_signals"/>

因此,如果我首先基于 key == 高速公路从 osm 对象中子集所有路径,然后使用函数 find_down 查找连接到路径的所有节点:

find_down 查找层次结构向下的所有元素:

节点->节点方式->方式+节点关系->关系+方式+节点

highway_subset_v1highway_subset_v2 至少应该产生相同数量的路数。

但结果却不同。

library("osmar")
src <- osmsource_api(url = "https://api.openstreetmap.org/api/0.6/")
muc_bbox <- center_bbox(11.575278, 48.137222, 1000, 1000)
muc <- get_osm(muc_bbox, src)

highway_subset_v1 <- subset(muc, way_ids = find(muc, way(tags(k == "highway"))))
highway_subset_v1 <- find(highway_subset_v1, way(tags(k == "name")))
highway_subset_v1 <- find_down(muc, way(highway_subset_v1))
highway_subset_v1 <- subset(muc, ids = highway_subset_v1)

highway_subset_v1 奥斯马尔对象 2678 个节点,504 种方式,0 个关系

在这种方法中,我选择具有 k==higway 的所有节点,并查找连接到这些节点的所有路径。

highway_ids_v2 <- find(muc, node(tags(k == "highway")))
highway_subset_ids_v2 <- osmar::find_up(muc, osmar::node(highway_ids_v2))
highway_subset_v2 <- subset(muc, ids = highway_subset_ids_v2)

highway_subset_v2 奥斯马尔对象 136 个节点,113 种方式,23 种关系

find_up 查找层次结构向上的所有元素:

节点->节点+方式+关系方式->方式+关系 关系 -> 关系

我错过了什么吗?

非常感谢您,

最好的问候, 安德烈亚斯

【问题讨论】:

  • 我在使用 get_osm 时收到错误 error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version,可能是因为迁移到 R 4.0。 osmar 的最新更新是 2015 年 2 月,可能不再是最新的了。
  • hmm..奇怪,我也使用 R 4.0,它对我的​​工作方式与我在问题中提到的完全一样。
  • 您的系统上的 ssl 似乎存在一些问题。 get_osm 对 ssl 没有做任何可能出错的特殊操作.. 我认为

标签: r dplyr openstreetmap tidyr osrm


【解决方案1】:

在我看来……

  • v1 将找到标记为 highway=* 的方法。
  • v2 将找到包含标记为 highway=* 的节点的方法。

大多数用于定义标记为highway=* 的道路形状的节点将本身带有highway=* 标记,事实上许多道路根本不包含这样的节点。 (标记为highway=* 的节点示例包括十字路口、停车标志、路灯和mixed bag of various other features。)

所以这些是非常不同的集合,没有理由假设结果会相同。特别是,find_down 将为您提供您传入方式的所有 个节点。它不应该记住您应用于方式的基于键的过滤器并将其应用于节点。 (对于 v2 中的 find_up,反之亦然。)

【讨论】:

  • 非常感谢您的回复 Tordanik。问题仍然是寻找汽车的路径是否有任何区别。我更喜欢使用较小的数据集,并且我假设为汽车建造的道路至少有一个带有标签高速公路的节点。所以从某种意义上说,它可能是一个过滤器..不是一个错误:)因为我假设至少有一个十字路口或标志在路上?你说大多数方式不会有一个带有标签高速公路的节点?
  • 它会有所作为。即使是为汽车建造的道路也通常没有标记为高速公路的节点。发生这种情况的原因有很多:因为人行横道之类的东西没有绘制地图(常见于没有标记交叉路口的较小道路,或者只是地图尚未完成的地方),因为它们被分成多种方式(方式被分割每次即使一个属性发生变化,即使只是路面或宽度的变化),或者因为对象被映射到道路旁边而不是道路的一部分(例如,路灯被放置在道路旁边)。
  • 具有 6 个节点的道路的随机示例,其中没有一个节点根本没有任何标签:osm.org/way/38332817 如果您想将结果限制在适合汽车的高速公路上,您需要查看在高速公路标签的价值(例如路径或人行道对您来说不会感兴趣,但高速公路、主要、住宅......)会。
  • 我已经只测试了可用于汽车的蟾蜍。所以没有行人。我进行了测试,至少在我测试的部分中,这两种方法之间的路由行为没有区别。唯一的区别是:如果我通过选择方式然后找到所有节点来使用“正确”方法,那么由于数据更多,路径查找会更慢。否则在路线创建上没有区别。
  • 是否有 100% 安全的方法(例如 A 键)来识别节点是否是描述方式的节点?
猜你喜欢
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多