3

我正在尝试通过 Overpass API 查询 OpenStreetMaps。

我想查询的是边界框内的道路,上面有任何类型的桥梁,如铁路桥梁等。

我找到了这个例子,这正是我需要的:http: //maxheight.bplaced.net/overpass/map.html

所以,我得到的查询如下所示:

铁路桥梁视图在立交桥涡轮

<osm-script output="json" timeout="25">

  <!-- Railway bridges -->
  <query type="way">
    <has-kv k="bridge" regv="^(yes|viaduct)$"/>
    <has-kv k="railway" />      
    <bbox-query {{bbox}}/>
  </query>

  <!-- Find roads below the above railway bridges -->
  <query type="way">
    <around radius="0" />
    <has-kv k="highway" regv="^((primary|secondary|tertiary|trunk)(_link)?|service|residential|unclassified)$"/>
    <has-kv k="maxheight" modv="not" regv="." />
    <has-kv k="maxheight:physical" modv="not" regv="." />
    <has-kv k="tunnel" modv="not" regv="." />
  </query>

  <union>
    <item />
    <recurse type="way-node"/>
  </union>

  <!-- print results -->
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton" order="quadtile"/>
</osm-script>

Overpass Turbo 中的其他桥视图

<osm-script output="json" timeout="25">

  <!-- Bridges -->
  <query type="way">
    <has-kv k="bridge" regv="^(yes|viaduct)$"/>
    <has-kv k="railway" modv="not" regv="." />      
    <bbox-query {{bbox}}/>
  </query>

  <!-- Find roads below the above bridges -->
  <query type="way">
    <around radius="0" />
    <has-kv k="highway" regv="^((primary|secondary|tertiary|trunk)(_link)?|service|residential|unclassified)$"/>
    <has-kv k="maxheight" modv="not" regv="." />
    <has-kv k="maxheight:physical" modv="not" regv="." />
    <has-kv k="tunnel" modv="not" regv="." />
  </query>

  <union>
    <item />
    <recurse type="way-node"/>
  </union>

  <!-- print results -->
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton" order="quadtile"/>
</osm-script>

问题是第二个查询。它应该找到穿过道路的桥梁,以及下面的伴随道路。

它现在所做的是返回所有桥梁,除了铁路桥梁 - 这意味着它突出显示了一条下面有自行车道的道路,一条穿过湖泊的道路 - 这是它不应该的。

我今天注意到了这一点,当我开车经过一个突出显示的位置时,发现它只是路下的一条自行车道。

4

2 回答 2

3

正确的查询是这样的。它不仅能正确处理过马路的桥梁,而且还能将两者合二为一。

我在OSM Truck QA Map上监控了网络,抓取了对 Overpass API 的请求的 POST 数据。

我使用Overpass QL 转换器将其转换为 XML。

在 Overpass Turbo 中查看查询

<osm-script output="json" timeout="20">
  <union into="_">
    <union into="_">
      <union into="_">
        <query into="_" type="way">
          <bbox-query {{bbox}}/>
          <has-kv k="bridge" modv="" regv="^(yes|viaduct)$"/>
          <has-kv k="railway" modv="" v=""/>
        </query>
        <query into="_" type="way">
          <around from="_" into="_" lat="" lon="" radius="0"/>
          <has-kv k="highway" modv="" regv="^((primary|secondary|tertiary|trunk)(_link)?|service|residential|unclassified)$"/>
          <has-kv k="maxheight" modv="not" regv="."/>
          <has-kv k="maxheight:physical" modv="not" regv="."/>
          <has-kv k="tunnel" modv="not" regv="."/>
        </query>
      </union>
      <recurse from="_" into="_" type="down"/>
    </union>
    <union into="_">
      <union into="_">
        <query into="_" type="way">
          <bbox-query {{bbox}}/>
          <has-kv k="bridge" modv="" regv="^(yes|viaduct)$"/>
          <has-kv k="railway" modv="" v=""/>
        </query>
        <query into="_" type="way">
          <around from="_" into="_" lat="" lon="" radius="0"/>
          <has-kv k="highway" modv="" regv="^((primary|secondary|tertiary|trunk)(_link)?|service|residential|unclassified)$"/>
          <has-kv k="maxheight" modv="not" regv="."/>
          <has-kv k="maxheight:physical" modv="not" regv="."/>
          <has-kv k="tunnel" modv="not" regv="."/>
        </query>
      </union>
      <recurse from="_" into="_" type="down"/>
    </union>
    <union into="_">
      <union into="_">
        <query into="_" type="way">
          <bbox-query {{bbox}}/>
          <has-kv k="bridge" modv="" regv="^(yes|viaduct)$"/>
          <has-kv k="railway" modv="" v=""/>
        </query>
        <query into="_" type="way">
          <around from="_" into="_" lat="" lon="" radius="0"/>
          <has-kv k="highway" modv="" regv="^((primary|secondary|tertiary|trunk)(_link)?|service|residential|unclassified)$"/>
          <has-kv k="maxheight" modv="not" regv="."/>
          <has-kv k="maxheight:physical" modv="not" regv="."/>
          <has-kv k="tunnel" modv="not" regv="."/>
        </query>
      </union>
      <recurse from="_" into="_" type="down"/>
    </union>
    <union into="_">
      <union into="_">
        <query into="_" type="way">
          <bbox-query {{bbox}}/>
          <has-kv k="bridge" modv="" regv="^(yes|viaduct)$"/>
          <has-kv k="railway" modv="" v=""/>
        </query>
        <query into="_" type="way">
          <around from="_" into="_" lat="" lon="" radius="0"/>
          <has-kv k="highway" modv="" regv="^((primary|secondary|tertiary|trunk)(_link)?|service|residential|unclassified)$"/>
          <has-kv k="maxheight" modv="not" regv="."/>
          <has-kv k="maxheight:physical" modv="not" regv="."/>
          <has-kv k="tunnel" modv="not" regv="."/>
        </query>
      </union>
      <recurse from="_" into="_" type="down"/>
    </union>
  </union>
  <print from="_" limit="" mode="body" order="id"/>
</osm-script>
于 2014-03-19T13:21:46.837 回答
3

关于上述提议的方法的一些评论:

  • Maxheight Map希望帮助找到缺少最大高度信息的街道,这对于卡车路线非常重要。如果我的用例正确,您想了解桥梁交叉的所有道路。目前,您的查询不会显示任何已维护最大高度信息的道路。如果您在查询中删除对两个标签“maxheight”和“maxheight:physical”的限制,这很容易解决。

  • 如前所述,Maxheight Map 将多个图层合并为一个查询。但它也会将一个大的边界框(bbox)分解成更小的部分。上面发布的 XML 查询在 UNION 操作中有 4 个相同的部分,这使得事情看起来过于复杂。事实上,就您的用例而言,您可以采用更简单的方法(见下文)。

  • 您不必将查询转换为 XML 格式。Overpass QL(查询语言)非常适合 Overpass API 和 Overpass Turbo。

  • 根据过去使用 Maxheight Map 的经验,如果不对结果进行后处理,Overpass API 不会为您提供您要求的解决方案。如果您熟悉 OpenLayers,您可能想看看我使用的逻辑。基本上你只需要在内部点上找到交叉点,类似于 PostGIS 函数 st_crosses 所做的那样。此外,您还必须以每个方式的“层”信息为例。

一个非常精简的版本(用于 Overpass Turbo)可能看起来像这样。但是,您需要确保实际的高速公路/桥梁类型符合您的要求,当然不要忘记对结果进行后处理。没有它,您的查询结果将包含相当多的误报。

((way({{bbox}})[bridge~"^(yes|viaduct)$"];way(around:0)[highway~"^((primary|secondary|tertiary|trunk)(_link)?|service|residential|unclassified)$"][tunnel!~"."]);>;);out;
于 2014-04-18T08:22:14.730 回答