Overpass按区域邻近性查询:水域码头搜索难题
解决Overpass查询水域边界码头的问题
你遇到的情况很常见——码头通常附着在水域边缘,而非完全落在水域的OSM区域范围内,所以直接用nwr(area.mywater)会返回空结果。下面提供两种可行的解决思路:
方法一:空间邻近性查询(捕捉水域周边码头)
利用Overpass的around过滤器,搜索水域周边特定距离内的码头,灵活适配边界场景。
示例代码:
[out:json][timeout:180]; // 获取目标水域 wr["name"]["natural"="water"]["water"!="river"]["boat"!="no"](if: length() > 3000)( 46.762191510926186, -92.08509489611468, 46.76367911337914, -92.08318778203628 )->.mywater; // 搜索水域周边20米范围内的码头(可按需调整距离) nwr["man_made"="pier"](around.mywater:20); // 输出结果 (._;>;); out body; >; out skel qt;
说明:around.mywater:20表示检索距离水域元素20米内的码头,距离数值可根据实际场景调整(如10米、50米)。
方法二:精准匹配边界接触的码头
先获取边界框内的所有码头,再通过touches筛选出与水域边界直接接触的对象,精准匹配你的场景。
示例代码:
[out:json][timeout:180]; // 获取目标水域 wr["name"]["natural"="water"]["water"!="river"]["boat"!="no"](if: length() > 3000)( 46.762191510926186, -92.08509489611468, 46.76367911337914, -92.08318778203628 )->.mywater; // 筛选边界框内与水域接触的码头 nwr( 46.762191510926186, -92.08509489611468, 46.76367911337914, -92.08318778203628 )["man_made"="pier"](if: touches(mywater)); // 输出结果 (._;>;); out body; >; out skel qt;
说明:touches(mywater)会精准筛选出与水域元素边界直接接触的码头,完全适配码头位于水域边缘的情况。
补充提示
- Overpass的
area仅针对带有area=yes标签或闭合way生成的区域,若目标水域未标记为区域类型,直接用area.mywater会失效。 - 优先推荐方法二,因为
touches无需调整距离参数,能精准匹配边界接触场景,避免无关结果。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

