OverpassQL两点关联道路查询的正确性验证及反例咨询
嘿,我来帮你捋一捋这个问题~
首先拆解下你写的查询逻辑:你想用A - (A - B)的方式模拟集合交集(也就是同时出现在way(around:1,x1,y1)和way(around:1,x2,y2)里的道路),这个数学逻辑是对的,确实等价于求两个道路集合的交集。但这个查询不一定总能返回唯一的道路,甚至可能返回多条或者空结果,我给你举几个常见的反例:
反例1:十字路口区域的两个点
假设你选的x1,y1和x2,y2都在一个十字路口的中心1米范围内(比如两个点相距0.5米,都靠近十字中心)。这时候,组成十字路口的四条道路(东西向、南北向各两条)都会被两个around查询同时命中,你的查询就会返回这四条道路,而非唯一一条。
反例2:近距离平行道路间的两个点
如果有两条平行的城市支路,间距只有1.5米(小于你设置的around:1半径的两倍),你选的x1,y1和x2,y2分别在两条道路之间的不同位置,且每个点到两条道路的距离都小于1米。这种情况下,两条平行道路都会被两个around查询捕获,你的查询结果就会包含这两条道路。
反例3:道路分叉/汇合处的两个点
比如一条主路在某个位置分出两条支路,你选的两个点都在分叉区域的1米范围内。这时候主路和两条支路都会同时出现在两个around的结果里,你的查询就会返回三条道路。
另外还要补充一点:如果两个点距离足够远,没有任何一条道路能同时覆盖这两个点的1米范围,那你的查询会返回空结果,这也是需要注意的情况。
如果你的需求是精准找到同时经过两个指定节点的道路,或许可以换个思路:先定位这两个节点,再查询同时包含它们的道路,示例查询结构如下:
[out:json]; // 如果你知道节点ID node(id:node1_id, node2_id); way(bn); // 找包含这些节点的道路 out geom;
要是你只有坐标,也可以先通过坐标定位节点,再关联道路,这样能避免around半径带来的范围误差问题。
备注:内容来源于stack exchange,提问作者Federico di Geronimo

