overpass language 笔记

本文详细介绍Overpass Turbo的XML查询语言,涵盖基本查询结构、边界框查询、标签查询、模糊检索、联合查询及递归操作,适用于地理信息系统数据检索。

原创链接:https://blog.youkuaiyun.com/sakuya_kazuya/article/details/72306979

overpass turbo的query语言分为QL和XML两种,所获得的结果是一样的。

XML语言需要以<osm-script></osm-script>包围,<osm-script output="json">可以定义输出数据的格式。

—— query

任何检索都要以query开始,<query></query>,通过<query type="node/way/relatipn/area">定义搜索数据的类型。

如果<query></query>缺失,则默认为<query type="node"></query>

—— bbox

<query>
<!-- replace by an effective query type; if this element is missing, a default <query type="node"> is assumed -->
    <bbox-query s="51.0" w="7.0" n="52.0" e="8.0"/>
</query>

通过定义bounding box选择了这个范围内的所有地理信息, w=left  |  e=right |  n=top |  s=bottom

<osm-script>
  <query type="way">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
  </query>
  <print/>
</osm-script>

完整query代码,选择了bounding box下所有way的数据, node, way, relation, area都可以通过这种方式获取

—— tags

有时候我们不想通过bbox查找,而想通过一些我们已知的属性(property)进行查找,必须我们要搜索整个密云水库( 不造为啥选了这里当试验点XD)的相关数据:

 

通过openstreetmap我们知道密云水库是一个relation,并且知道它的一些关键属性,比如name="密云水库",  natural="water"等,下面我们喜欢通过这些属性搜索到密云水库的相关数据。

<osm-script>
  <query type="relation">
    <has-kv k="name" v="密云水库"/>
  </query>
  <print/></osm-script>

 

这样我们提取了密云水库这个relation下的所有数据,但是查看结果发现数据全是way的,没有node(这也是浪费了几天时间折腾爬虫的原因),这个时候我们需要一个recurse的过程,具体方法下面再讲。

当然,也可以同时使用bbox和tag作为条件进行检索:

 

<osm-script>
  <query type="relation">
    <has-kv k="name" v="密云水库"/>
    <bbox-query e="116.9254" n="40.5111" s="40.4851" w="116.8770"/>
  </query>
  <print/>
</osm-script>

 

 

以及多个tag作为条件的检索:

<osm-script>
  <query type="node">
    <has-kv k="highway" v="bus_stop"/>
    <has-kv k="shelter" v="yes"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/></osm-script>

反向选择:

<osm-script>
  <query type="way">
    <has-kv k="highway" modv="not" regv="."/>
    <bbox-query e="7.18" n="50.75" s="50.74" w="7.17"/>
  </query>
</osm-script>

选择了不包含highway tag的way数据

 

—— tags特别篇,关于针对name的检索

 

有时候并不清楚某个地点的确切名称,这时候需要使用模糊检索的功能(其实就是正则表达式啦):

<has-kv k="name" regv="holtorf"/>

选择了包含holtorf的所有结果。

<has-kv k="name" regv="^Holtorf"/>

选择了holtorf作为名字开头的所有结果

<has-kv k="name" regv="Holtorf$"/>

holtorf作为名字结尾。

 <has-kv k="name" regv="holtorf|Gielgen"/>
名为holtorf或gielgen的都符合搜索条件。

—— union operator

union顾名思义,起到的是集合的作用。我们使用<query></query>进行检索的时候,一次只能选择一种数据类型:<query type="node">,union的作用就是将多个query集合起来。

<osm-script>
  <union>
    <query type="node">
      <has-kv k="amenity" v="fire_station"/>
      <bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
    </query>
    <query type="way">
      <has-kv k="amenity" modv="" v="fire_station"/>
      <bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
    </query>
    <query type="relation">
      <has-kv k="amenity" modv="" v="fire_station"/>
      <bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
    </query>
  </union>
  <union>
    <item/>
    <recurse type="down"/>
  </union>
  <print/>
</osm-script>

注意第一个union中三个query的排列顺序,这和第二个union有关。

在第二个union中定义了递归(recurse),即将node、way和relation的数据根据层级相互绑定,并规定了递归的模式为down,意为从顶部开始递归。

——————————————————————————————

<osm-script>
  <union>
    <query type="node">
      <has-kv k="name" v="密云水库"/>
    </query>
    <query type="way">
      <has-kv k="name"  v="密云水库"/>
    </query>
    <query type="relation">
      <has-kv k="name"  v="密云水库"/>
    </query>
  </union>
  <union>
    <item/>
    <recurse type="down"/>
  </union>
  <print/>
</osm-script>

 

### Overpass Turbo 使用指南 #### 了解 Overpass Turbo 的基本概念 Overpass Turbo 提供了一个直观的 Web 界面,使用户能够在不需要编程技能的情况下构建和执行复杂的 Overpass 查询[^2]。这使得无论是初学者还是高级用户都能方便地测试查询、查看结果以及导出所需的数据。 #### 构建第一个查询 为了快速入门,可以从简单的查询开始学习如何使用 Overpass Turbo 进行地理空间数据分析: 1. 打开 [Overpass Turbo](https://overpass-turbo.eu/) 并点击页面中央的地图区域来设置边界框。 2. 输入如下所示的基础查询语句以检索特定类型的对象: ```plaintext node["amenity"="cafe"](around:500); out body; ``` 此查询将在地图中心位置周围半径500米范围内查找所有的咖啡馆节点,并显示它们的信息。 #### 利用高级特性优化查询效率 对于更复杂的需求,可以利用一些特有的功能提高查询性能与灵活性。例如,在长时间运行的任务中可设定超时参数防止请求被意外中断[^3]: ```plaintext [out:csv(::id, ::lat, ::lon, name; true; ",")][timeout:60]; node(around:1000)["shop"]; out skel qt; ``` 这段代码不仅设置了最大等待时间为60秒,还指定了输出格式为CSV表格形式,便于后续分析处理。 #### 结合其他工具扩展应用场景 除了直接操作 OSM 原始数据外,还可以借助第三方库如 `osmtogeojson` 将其转化为更加通用的空间矢量格式——GeoJSON,从而更好地服务于各类 GIS 应用场景中的展示需求[^4]: ```javascript const osmtogeojson = require('osmtogeojson'); // Assume 'data' contains valid OSM XML content fetched via API or file upload. let geojsonData = osmtogeojson(data); console.log(JSON.stringify(geojsonData)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值