我正在尝试制作一个PHP脚本,当GPS设备(跟踪器)进入具有预定义位置的"地理围栏"时,该脚本可以执行某些操作。我找到的大多数帮助都使用了haversine公式,但大多数都试图从一个点获得最近的位置。我非常需要相反的东西
设备和"围栏位置"坐标在MySQL数据库中,我可以成功地提取它们。现在,我需要设置围栏位置中心周围的半径,从该点向任何方向都应该是10米
每当设备进入这10米半径内时,PHP就会做一些事情
因此,点A(lat,lon)周围有10米的半径,设备B将其lat,lon发送到SQL数据库中,每当点A和B相距10米以内时,就会发生一些事情。我从哪里开始?在我的情况下,哈维尔辛有用吗?我认为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链接的函数来计算与任何givien点的实际距离: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!");
}