如何通过Overpass API筛选指定时间范围内新建的节点?
解决Overpass API筛选创建时间而非更新时间的节点问题
你遇到的问题其实是对newer参数的理解偏差——这个参数筛选的是节点最后被修改的时间,而不是节点最初被创建的时间,所以才会出现那些多年前创建、但后来被编辑过的节点也被返回的情况。
要获取真正在指定时间点之后创建的amenity=atm节点,有两种可行的方案:
方案一:客户端过滤(简单易实现)
先获取指定区域内所有ATM节点的完整元数据,之后在客户端代码里过滤创建时间:
[out:json][timeout:30]; node[amenity=atm]({{bbox}}); out meta;
这个查询返回的JSON结果中,每个节点的meta字段里会包含created_at属性,你只需要遍历结果,保留created_at值大于2018-04-01T00:00:00Z的节点即可。
方案二:Overpass查询内直接过滤(无需客户端处理)
利用Overpass QL的foreach和条件判断语法,在查询阶段就筛选出符合创建时间要求的节点:
[out:json][timeout:30]; node[amenity=atm]({{bbox}}); foreach -> .n( if(t["created_at"] >= "2018-04-01T00:00:00Z") { out meta; } );
关键注意点
newer对应的是元数据里的timestamp(最后修改时间),而我们需要的是created_at(创建时间),这是两个完全不同的字段;- 极少数老旧的OSM元素可能缺失
created_at元数据,但这种情况非常罕见,不影响大部分场景的使用。
内容的提问来源于stack exchange,提问作者nex
相关产品推荐
相关产品推荐

