Я пытаюсь создать скрипт PHP, который может что-то делать, когда устройство GPS (трекер) входит в «геозону» с предопределенной позицией. Большая часть помощи, которую я нашел, использует формулу haversine, но большинство пытается найти ближайший пункт из точки. Мне очень нужно обратное.
Координаты устройства и «ограждения» находятся в базе данных MySQL, я могу их успешно вытащить. Теперь мне нужно установить радиус вокруг центра локации забора, который должен составлять 10 метров в любом направлении от этой точки.
Всякий раз, когда устройство входит в радиусе 10 м, PHP что-то делает.
Таким образом, точка A (широта, долгота) имеет радиус 10 м вокруг, устройство B отправляет свой широту в базу данных 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!");
}
Других решений пока нет …