2017-06-05 4 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、緯度および経度を持つユーザー表があるとします。以下は、指定された緯度と経度から、半径がのユーザーを50マイルにするSQLクエリです。

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

このクエリ方法は、Googleマップ店舗検索APIの基本です。

このウェブサイトをご参照ください:

みましょうあなたは緯度とLANG $ LATの変数を持っていると言います。 $ lng;

これらの変数にはその座標があるものとします。クエリで

は、次の操作を行います。ID、緯度、LNG(3959の* ACOS(COS(ラジアン($ LAT))* COS(ラジアン(LAT))* COS(ラジアン(LNG)

は、SELECT - ラジアン(ラジアン))))AS距離遠方のマーカー距離がある< = 50 ORDER BY距離;

結果は、50マイル以下のid、lat、およびlng座標を返します。

P.S 3959はマイルを返す単位です。