2017-06-05 93 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是返回里程的单位。