2017-06-05 69 views

回答

1

在php中,你可以通過獲取記錄並使用下面的公式來實現。 但我想你使用查詢來解決這個問題。它更高效。

function getNearestUsers($givenLat,$givenLng) 
{ 
    $res = []; 
    $recs = getAllTheRecordsFromDb(); 
    foreach($recs as $r) 
    { 
     $distance = sqrt(POW((69.1 * ($r['lat'] - $givenLat)),2) + POW((69.1 * ($givenLng - $r['lng']) * cos($r['lat']/57.3)),2)); 
     if($distance<=50) //50 miles 
     { 
      //some code 
     } 
    } 
} 

假設您的用戶表具有userId,緯度和經度。以下是sql查詢,獲取距離給定經度和緯度的半徑爲50英里的用戶。

SELECT userId, latitude, longitude, SQRT(
    POW(69.1 * (latitude - [givenLat]), 2) + 
    POW(69.1 * ([givenLng] - longitude) * COS(latitude/57.3), 2)) AS distance 
FROM TableName HAVING distance < 50 ORDER BY distance; 

你可以從參考以下鏈接獲得更多回答: latitude/longitude find nearest latitude/longitude - complex sql or complex calculation

1

這種查詢方法是在谷歌地圖商店定位器API的基礎。

請參考以下網站:

讓說你的緯度和郎可變 $緯度; $ lng;

讓我們假設那些變量有它的座標。

在查詢做到這一點:

SELECT ID,緯度,經度(3959 * ACOS(COS(弧度($ LAT))* COS(弧度(LAT))* COS(弧度(LNG) - 弧度($ lng))+ sin(弧度($ lat))* sin(弧度(lat))))距標記的距離距離< = 50 ORDER BY距離;

結果將返回小於或等於50英里的id,lat和lng座標。

P.S 3959是返回里程的單位。