You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Overpass API如何获取所有sustenance类amenity设施数据?

你之前的3种写法都不符合Overpass QL的语法规则/OSM的标签规则:

  • 写法"amenity"="pub;bar;restaurant"是精确匹配标签值,OSM中不存在标签值为pub;bar;restaurant的amenity元素,因此无结果
  • 写法"amenity"="sustenance"中的sustenance是OSM wiki对amenity的分类组名,不是实际打在元素上的标签值,因此无结果
  • 写法"amenity"="pub~restaurant~bar"混淆了正则操作符和值分隔符:Overpass中多值正则的分隔符是|,正则匹配操作符是~,不能把~放在值内部

方案1:逐个列出目标值(推荐,性能更高)

如果需要查询的amenity类型数量少,直接在查询块中并列多个条件即可,示例查询({{bbox}}为查询区域占位符,可替换为具体的经纬度范围):

[out:json][timeout:25];
(
  // 匹配所有节点类型的目标amenity
  node["amenity"="pub"]({{bbox}});
  node["amenity"="bar"]({{bbox}});
  node["amenity"="restaurant"]({{bbox}});
  // 匹配所有路径类型的目标amenity
  way["amenity"="pub"]({{bbox}});
  way["amenity"="bar"]({{bbox}});
  way["amenity"="restaurant"]({{bbox}});
  // 匹配所有关系类型的目标amenity
  relation["amenity"="pub"]({{bbox}});
  relation["amenity"="bar"]({{bbox}});
  relation["amenity"="restaurant"]({{bbox}});
);
// 输出结果
out body;
>;
out skel qt;

方案2:正则匹配(适合批量查询同组分类)

如果需要查询整个sustenance组下的所有amenity,可以用正则匹配批量处理,不需要逐个列条件,正确写法如下:

[out:json][timeout:25];
(
  node["amenity"~"^(pub|bar|restaurant|cafe|fast_food|ice_cream|food_court|biergarten)$"]({{bbox}});
  way["amenity"~"^(pub|bar|restaurant|cafe|fast_food|ice_cream|food_court|biergarten)$"]({{bbox}});
  relation["amenity"~"^(pub|bar|restaurant|cafe|fast_food|ice_cream|food_court|biergarten)$"]({{bbox}});
);
out body;
>;
out skel qt;

正则说明:

  • ~ 是Overpass的正则匹配操作符,写在键后面
  • 多个匹配值用|分隔
  • 开头的^和结尾的$是全匹配标识,避免匹配到包含上述字符串的其他标签值
  • 如果需要忽略大小写,可在正则引号后加i,即["amenity"~"正则"i]

内容的提问来源于stack exchange,提问作者Stephen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:24:02