在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)来限制我的结果,这将转换为度数。但是,这有两个问题。首先,使用度作为参数不是很用户友好,公里是首选。其次,离赤道越远,两度经度之间的距离就越窄。这反过来会导致返回的结果减少。所以,问题是;给定经纬度/经度坐标,如何根据给定的半径/距离(以公里为单位)计算边界框?
对所有内容都使用弧度
然后
$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) 表示顶部纬度、sin(M_PI_4) 表示顶部纬度、cos(3*M_PI_4) 表示底部纬度和 sin(3*M_PI_4) 表示底部纬度来获得内边界平方