2015-11-13 2 views
1

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

PHP работает на сервере. как именно он узнает, где это устройство gps, и что он делает? –

+0

Координаты A и B хранятся в базе данных SQL. A всегда является одним и тем же координатором (он не перемещается), B перемещает и обновляет свое местоположение в базе данных каждые X секунд, поэтому самая новая запись в базе данных - это последняя позиция B. У меня уже есть все это. – Fid

+0

поэтому, когда php обновляет db, он выбирает для вычисления расстояния между A & B, например. 'if (dist ($ A, $ B) <10) {do_something(); } ' –

ответ

0

Таким образом, чтобы поместить все это в полный ответ:

Используйте функцию, аналогичную той, связанной с помощью @Gudz Daniel рассчитать фактическое расстояние от любой точки givien: https://www.geodatasource.com/developers/php. Это привлекает эффективный круг «Geo-fence» вокруг этой точки, поскольку вы можете измерить расстояние от любого входящего угла.

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!"); 
} 
Смежные вопросы