2015-11-13 69 views
1

我試圖讓一個PHP腳本,可以做一些事情時,GPS設備(跟蹤)進入「地理圍欄」預定義的位置。我發現的大部分幫助都使用半正式公式,但大多數人都試圖從某一點獲得最近的位置。我非常需要相反​​的東西。
設備和「籬笆位置」座標是在MySQL數據庫中,我能拉他們成功地。現在我需要在圍欄位置中心周圍設置半徑,從該點開始任何方向的距離應該是10米。
只要設備在這個10米範圍內進入,PHP就會做一些事情。
所以點A(LAT,LON)周圍有10米半徑,裝置B發送其緯度,經度到SQL數據庫,每當點A和B是相互的10m以內,有事。 我從哪裏開始?在我的情況下,任何用途都有嗎? 我認爲PHP可以計算出A和B的距離差異,只要這個距離小於10m,PHP就會做一些事情。計算繞經/緯度GPS點半徑在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更新分貝時,它會做一個選擇來計算A和B之間的距離,例如, '如果(dist($ A,$ B)<10){do_something(); }' –

回答

0

所以,把它全部變成一個完整的答案:

使用一個類似的@Gudz丹尼爾鏈接到任何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; 
    } 
} 

然後,你只需做一個比較,無論距離,你想的設備標誌你的下一個過程,正如@馬克乙指出:

$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!"); 
}