为什么这两种方法在 OSM 对象中产生不同数量的方式?

Why do these 2 approaches produce different amount of ways in OSM Object?

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

按照定义方式:

定义了一种方式:

A way is an ordered list of nodes which normally also has at least one tag or is included within a Relation. A way can have between 2 and 2,000 nodes, although it's possible that faulty ways with zero or a single node exist. A way can be open or closed. A closed way is one whose last node on the way is also the first on that way. A closed way may be interpreted either as a closed polyline, or an area, or both.

节点定义为:

Nodes can be used to define standalone point features, but are more often used to define the shape or "path" of a way.

<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 == highway 从 osm 对象中提取所有路径,然后使用函数 find_down 查找连接到方式:

find_down finds all elements downwards the hierarchy:

node -> node way -> way + node relation -> relation + way + node

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种关系

在这种方法中,我 select 具有 k==higway 的所有节点和 find_up 连接到这些节点的所有路径。

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 finds all elements upwards the hierarchy:

node -> node + way + relation way -> way + relation relation -> relation

我是不是漏掉了什么?

非常感谢您,

此致, 安德烈亚斯

在我看来...

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

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

所以这些确实是非常不同的集合,没有理由假设结果是相同的。特别是,find_down 会给你 all 节点你传递的方式。它不应该记住你应用于方式的 key-based 过滤器和也将其应用于节点。 (对于 v2 中的 find_up,反之亦然。)