多年来我一直在 MySQL 中执行此操作,但如何在 PHP 中执行此操作?
坐标数组示例:http://pastebin.com/grVsbgL9
我想返回给定坐标 100 英里范围内的所有坐标。
function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
//
return $resultArray;
}
在 MySQL 中,我通常使用如下查询:
SELECT *, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance FROM table HAVING distance < $radius ORDER BY distance;
如何在 PHP 中执行相同的操作?
最佳答案
在下面的代码中,我假设您的坐标对象仅存储为两个元素数组(既用于 $center 参数,又用于 $coordinateArray 中的坐标>)。如果不是,那么您需要更改的内容应该相当明显。
function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
$resultArray= array();
$lat1 = $center[0];
$long1 = $center[1];
foreach ($coordinateArray as $coordinate) {
$lat2 = $coordinate[0];
$long2 = $coordinate[1];
$distance = 3959 * acos(cos(radians($lat1)) * cos(radians($lat2)) * cos(radians($long2) - radians($long1)) + sin(radians($lat1)) * sin(radians($lat2)));
if ($distance < $radius) $resultArray[] = $coordinate;
}
return $resultArray;
}
代码只是循环遍历所有坐标,计算距中心点的距离,如果小于给定的$radius,则将坐标添加到$resultArray>.
我还没有检查$distance计算 - 这基本上只是从你的mysql查询中剪切和粘贴,所以我假设这是正确的。
上面的代码还假设存在一个弧度函数。如果您没有,您可以添加如下:
function radians($deg) {
return $deg * M_PI / 180;
}
假设坐标以度为单位。
关于php - 如何在纯 PHP 中返回半径内的坐标? (没有MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17285964/