根据特定的纬度和经度获取半径50英里的纬度和经度

时间:2017-06-05 07:47:50

标签: php geolocation

我有纬度和经度值,想在50英里处找到另一个lat长值。怎么做?任何公式或自定义函数来获取它?

2 个答案:

答案 0 :(得分: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 :(得分:1)

此查询方法基于Google地图商店定位器API。

  

请参阅本网站:

     

假设你有一个lat和lang变量 $纬度; $ LNG;

让我们假设这些变量有其坐标。

在您的查询中执行以下操作:

SELECT id,lat,lng(3959 * acos(cos(弧度($ lat))* cos(弧度(纬度))* cos(弧度(lng) - 弧度($ lng))+ sin(弧度($ lat))* sin(弧度(纬度))))AS距离FROM距离<= 50 ORDER BY距离;

结果将返回小于或等于50英里的id,lat和lng坐标。

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