【问题标题】:Calculate bounding box based on given coordinates and distance/radius根据给定的坐标和距离/半径计算边界框
【发布时间】:2014-11-27 21:53:44
【问题描述】:

在一个 PHP 脚本中,我有一个 SPARQL 查询,它返回另一个点的给定距离内的 POI。这是查询中处理地理过滤的行:

FILTER (?long > " . ($resource_long - $search_radius) . " && ?long <  " . ($resource_long + $search_radius) . " && ?lat >  " . ($resource_lat - $search_radius) . "  && ?lat <  " . ($resource_lat + $search_radius) . "  )

目前我一直在使用整数(变量 $search_radius)来限制我的结果,这将转化为度数。然而,这有两个问题。首先,使用度数作为参数对用户来说不是很友好,并且更喜欢公里数。其次,离赤道越远,两个经度之间的距离就越窄。这反过来会导致返回的结果更少。所以,问题是;给定一个纬度/经度坐标,如何根据给定的半径/公里距离计算边界框?

【问题讨论】:

    标签: php math coordinates sparql latitude-longitude


    【解决方案1】:

    一切都使用弧度

    然后

       $radius = $distance/ 6371.01; //6371.01 is the earth radius in KM
       $minLat = $lat - $radius;
       $maxLat = $lat + $radius;
       $deltaLon = asin(sin($radius) / cos($lat));
       $minLon = $lon - $deltaLon;
       $maxLon = $lon + $deltaLon;
    

    然后根据需要转换回度数。

    如果越界,这将不起作用。有一些课程可以提供帮助

    https://github.com/anthonymartin/GeoLocation.php

    例如

    这就是外部边界,您可以通过将 $radius 乘以 cos(M_PI_4) 获得 top lat,sin(M_PI_4) for top lon,cos(3*M_PI_4) for bottom lat 和 sin (3*M_PI_4) 用于底部 Lon

    【讨论】:

    • 最终会给出一个与起点等距的点的边界框(或圆)吗?似乎仍然存在高纬度点之间的距离小于低纬度点之间的距离的问题。不过我的三角已经生锈了,所以我可能遗漏了一些东西。
    • 给出一个边界框(如果也使用了底部的边界框,则为 2)。因为它处理了绝大多数点
    • 感谢您的回答,但我没有得到预期的结果。我设置了一个带有地图和网格的测试环境,以及一个在点之间画线的函数,以便它给我一个我正在创建的盒子的视觉表示。在纬度/经度 0 度时,它给了我一个漂亮的正方形。我最初担心的是,与它的宽度相比,它会是一个越来越高的矩形,我离赤道越远。然而,我现在看到的结果是各种形状的矩形。在某些时候,我还从 PHP 中获得了一个 NAN 值(不是数字?)。
    • 我不记得/理解很多数学,所以调试这个对我来说有点困难。您有任何参考资料可以帮助我理解它吗?你也可以用我的地图原型做个测试:link 随便玩弄参数,它就会画出方框,并在中心放置一个标记。
    • 你在使用那个库吗?
    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2010-10-27
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多