在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)来限制我的结果,这会转化为度数。但是,这有两个问题。首先,使用度数作为参数不是非常用户友好,而公里则更喜欢。其次,距离赤道越远,两度经度之间的距离越窄。这反过来会导致返回的结果更少。所以,问题是;给定纬度/经度坐标,如何根据给定的半径/距离(公里)计算边界框?
答案 0 :(得分: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),顶部lon的sin(M_PI_4),底部lat和sin的cos(3 * M_PI_4)得到内边界底部Lon(3 * M_PI_4)