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

OSM Overpass技术问询:如何在OSM relation定义区域中使用area filter查询

如何在OSM中基于Relation定义的区域应用Area Filter

嘿,刚好对这个问题熟得很,我来一步步给你讲清楚怎么操作:

核心思路:把Relation转换成Area对象

OSM里的Relation(比如行政边界、城市范围这类Multipolygon类型的Relation)本身不能直接作为区域过滤器用,得先把它转换成对应的Area ID,或者直接在查询语句里自动转换,两种方法都好使:

方法1:手动计算Area ID

OSM有个固定的转换规则:

  • 如果你的Relation ID是正数,Area ID = Relation ID + 2400000000
  • 如果是负数(很少见,一般是临时或测试用的Relation),Area ID = Relation ID - 2400000000

举个例子:假设你要查的是ID为123456的城市边界Relation,那对应的Area ID就是24000123456。

之后在Overpass QL里就可以直接用这个Area ID来过滤了,比如查询该区域内的所有咖啡馆:

[out:json][timeout:25];
// 先把目标Area存为变量
area(24000123456)->.targetArea;
// 过滤区域内的咖啡馆节点
node["amenity"="cafe"](area.targetArea);
// 输出结果
out body;
>;
out skel qt;

方法2:自动转换Relation到Area(更省心)

如果你不想手动算ID,可以直接在查询语句里通过Relation的属性找到它,再用map_to_area命令自动转换成Area对象。比如查询名为"维也纳"的行政边界内的餐馆:

[out:json][timeout:25];
// 先找到目标Relation
relation["name"="维也纳"]["type"="boundary"]["boundary"="administrative"]["admin_level"="4"];
// 自动转换为Area
map_to_area->.targetArea;
// 查询区域内的餐馆
node["amenity"="restaurant"](area.targetArea);
out body;
>;
out skel qt;

注意事项

  • 只有Multipolygon类型的Relation才能被转换成Area对象,像公交路线、公交站点这类非区域类的Relation是没法转的,得先确认你的Relation类型是type=multipolygon或者type=boundary(行政边界类)。
  • 如果用osmium工具处理本地OSM数据,可以用osmium area --relation-id=你的ID命令直接生成对应的Area文件,方便本地查询。

这样操作下来,就能轻松把Relation定义的区域作为过滤条件,查询里面的特定对象啦!

内容的提问来源于stack exchange,提问作者Örom Loidl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:34:32