是否有任何用于 OpenStreetMap 的 API 允许我获取距参考位置一定距离(例如 10 英里)内的 POI 列表?
3 回答
据我所知,API 不直接支持这一点。最简单的方法是选择一个适合您的圆圈的(准)矩形边界框,并使用它来检索您的兴趣点。然后,您可以对每个兴趣点进行距离计算,并丢弃超出您半径的那些。这将删除靠近框角的一小部分 POI,因此不在您的圈子内。您希望按此顺序执行此操作,以便您只需在相对较少的目标位置上进行距离计算。
不要忘记边界框是由纬度/长角定义的,所以它不是真正的矩形。经线在两极处汇合,因此盒子的顶部与底部的宽度不同。这对您的影响程度取决于您与电线杆的距离(长度的度数 ~= (40000km / 360) * cos (lat))。
如果您不需要极高的精度,那么您可以使用毕达哥拉斯定理计算距离,记住经度的余弦变化和因子 2 单位差(经度 360 度,但纬度只有 180 度)。如果您确实需要准确性,那么您就进入了球面三角学的领域,并且还需要考虑椭球体。这是一个在线计算器,包含方程式和开源代码,在这方面很有帮助。
是的。Overpass API 有一个“Around”功能,可以做到这一点(搜索给定点半径内的项目)。您可以将其与其他要求结合起来(例如,获取特定项目类型的列表):
http://wiki.openstreetmap.org/wiki/Overpass_API#Around
例如使用 OverPass Turbo Api(列出“西班牙曼萨纳雷斯”附近的所有城镇,经纬度半径为 150 公里,现场试用!):
<osm-script output="json" timeout="25">
<id-query {{nominatimArea:Spain}} into="area"/>
<query type="node">
<has-kv k="place" modv="" v="town"/>
<around lat="38.996507" lon="-3.371946" radius="150000"/>
</query>
<print e="" from="_" geometry="skeleton" limit="" mode="body" n="" order="id" s="" w=""/>
</osm-script>