我正在尝试制作一个 PHP 脚本,当 GPS 设备(跟踪器)进入具有预定义位置的“地理围栏”时,该脚本可以执行某些操作。我找到的大部分帮助都使用半正弦公式,但大多数都试图从一个点获得最近的位置。我非常需要相反的东西。
设备和“围栏位置”坐标在 MySQL 数据库中,我能够成功提取它们。现在我需要设置围栏位置中心周围的半径,从该点开始的任何方向都应该是 10 米。
每当设备进入这个 10m 半径范围内时,PHP 就会做一些事情。
所以点 A(lat,lon) 周围有 10m 的半径,设备 B 正在将其纬度、经度发送到 SQL 数据库中,只要 A 点和 B 点之间的距离在 10m 以内,就会发生一些事情。
我从哪说起呢? haversine 在我的情况下有用吗?
我认为 PHP 可以计算 A 和 B 的距离差,只要该距离小于 10 米,PHP 就会执行某些操作。
我认为这可以完成这项工作。
function haversineGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
最佳答案
因此,将其全部放入一个完整的答案中:
使用类似于@Gudz Daniel 链接的函数来计算与任意给定点的实际距离:https://www.geodatasource.com/developers/php .这会在该点周围绘制一个有效的“地理围栏”圆圈,因为您可以从任何入射角度测量您的距离。
function distance($lat1, $lon1, $lat2, $lon2, $unit) {
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit = strtoupper($unit);
if ($unit == "K") {
return ($miles * 1.609344);
} else {
return $miles;
}
}
然后,您只需比较您希望设备标记下一个进程的距离,正如@Mark B 所指出的:
$distance = distance($lat1, $lon1, $lat2, $lon2, "M");
if ($distance <= 1) {
// Now you know your truck/device is
// within 1 mile of the center-point.
send_alert("You've arrived!");
}
关于php - 在PHP中计算纬度/经度GPS点周围的半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33696685/