Php 基于给定坐标和距离/半径计算边界框
在PHP脚本中,我有一个SPARQL查询,返回另一个点的给定距离内的POI。这是查询中处理地理过滤的行:Php 基于给定坐标和距离/半径计算边界框,php,math,coordinates,sparql,latitude-longitude,Php,Math,Coordinates,Sparql,Latitude Longitude,在PHP脚本中,我有一个SPARQL查询,返回另一个点的给定距离内的POI。这是查询中处理地理过滤的行: FILTER (?long > " . ($resource_long - $search_radius) . " && ?long < " . ($resource_long + $search_radius) . " && ?lat > " . ($resource_lat - $search_radius) . " &&a
FILTER (?long > " . ($resource_long - $search_radius) . " && ?long < " . ($resource_long + $search_radius) . " && ?lat > " . ($resource_lat - $search_radius) . " && ?lat < " . ($resource_lat + $search_radius) . " )
FILTER(?.long>“($resource\u long-$search\u radius)。”&&?long<“($resource\u long+$search\u radius)。“&&?lat>”($resource\u lat-$search\u radius)。“&&?lat<”($resource\u lat+$search\u radius)。)
目前,我一直在使用一个整数(变量$search_radius)来限制我的结果,这将转化为度。然而,这有两个问题。首先,使用度作为参数对用户来说不是很友好,而公里是首选。其次,离赤道越远,两个经度之间的距离越窄。这将反过来导致更少的返回结果。所以问题是,;给定纬度/长坐标,如何根据给定的半径/距离(以km为单位)计算边界框?使用弧度表示一切 然后 然后,如果需要,将其转换回度数 如果越过边界,这就不起作用。有一些课程可以提供帮助 比如说
这是外部边界,你可以通过将$radius乘以cos(M_PI_4)得到内部边界的平方,cos(3*M_PI_4)表示顶部lat,sin(M_PI_4)表示顶部lon,cos(3*M_PI_4)表示底部lat,sin(3*M_PI_4)表示底部lon这是否最终给出了一个与起点等距的点的边界框(或圆)?它似乎仍然存在一个问题,即高纬度点之间的距离小于低纬度点之间的距离。我的三角架生锈了,所以我可能遗漏了一些东西。给出了一个边界框(如果也使用了底部的边界框,则为2)。因为它处理了绝大多数的问题谢谢你的回答,但我没有得到预期的结果。我设置了一个带有地图和网格的测试环境,以及一个在点之间画线的函数,这样它就可以直观地表示我正在创建的长方体。在0度纬度/长度时,它给了我一个漂亮的正方形。我最初担心的是,它将是一个长方形,它比它的宽度越来越高,离赤道越远。然而,我现在看到的结果是各种形状的矩形。在某个时候,我还从PHP中得到了一个NAN值(不是一个数字?),我不记得/不理解很多数学知识,所以我很难调试它。你有什么可以帮助我理解它的推荐信吗?你也可以用我的地图原型做一个测试:只要玩弄一下参数,它就会画出一个方框,并在中间放一个标记。你在用那个库吗?
$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;