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

