mysql — вычисляет радиус вокруг точки GPS широта / долгота в переполнении стека

Я пытаюсь создать скрипт 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;
}

1

Решение

Итак, чтобы поставить все в полный ответ:

Используйте функцию, аналогичную функции, связанной @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!");
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]