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
相关产品推荐
相关产品推荐

