用PHP做出搜尋附近的人功能

php中世界最好的语言
發布: 2023-03-26 16:44:01
原創
1749 人瀏覽過

這次帶給大家用PHP做出搜尋附近的人功能,用PHP做出搜尋附近的人功能注意事項有哪些,以下就是實戰案例,一起來看一下。

實現想法:

首先,我們應該這樣想: 既然我們知道了使用者目前位置的經緯度,又知道我們將要搜尋的範圍,我們可不可以計算出一個範圍?也就是說,根據一個中心點和半徑,計算出符合條件的經緯度的最大值和最小值 。

具體實現:

那麼到此,想要獨立思考完成的夥伴可以不要繼續往下看了。
上面我們提到該功能的一個實作原理,接下來我們就來講解一下具體的實作步驟。
我們先宣告一個函數,用作計算經緯度的範圍:

/**
 * 根据经纬度和半径计算出范围
 * @param string $lat 纬度
 * @param String $lng 经度
 * @param float $radius 半径
 * @return Array 范围数组
 */
private function calcScope($lat, $lng, $radius) {
  $degree = (24901*1609)/360.0;
  $dpmLat = 1/$degree;
  $radiusLat = $dpmLat*$radius;
  $minLat = $lat - $radiusLat;    // 最小纬度
  $maxLat = $lat + $radiusLat;    // 最大纬度
  $mpdLng = $degree*cos($lat * (PI/180));
  $dpmLng = 1 / $mpdLng;
  $radiusLng = $dpmLng*$radius;
  $minLng = $lng - $radiusLng;   // 最小经度
  $maxLng = $lng + $radiusLng;   // 最大经度
  /** 返回范围数组 */
  $scope = array(
    'minLat'  => $minLat,
    'maxLat'  => $maxLat,
    'minLng'  => $minLng,
    'maxLng'  => $maxLng
    );
  return $scope;
}
登入後複製

傳回的陣列中包含了在 $radius 範圍內,符合條件的最大最小經緯度。
既然我們已經取得了範圍,那麼我們就可以開始從資料庫中尋找所有在這個經緯度範圍內符合條件的記錄:

/**
 * 根据经纬度和半径查询在此范围内的所有的电站
 * @param String $lat  纬度
 * @param String $lng  经度
 * @param float $radius 半径
 * @return Array     计算出来的结果
 */
public function searchByLatAndLng($lat, $lng, $radius) {
  $scope = $this->calcScope($lat, $lng, $radius);   // 调用范围计算函数,获取最大最小经纬度
  /** 查询经纬度在 $radius 范围内的电站的详细地址 */
  $sql = 'SELECT `字段` FROM `表名` WHERE `Latitude` < &#39;.$scope[&#39;maxLat&#39;].&#39; and `Latitude` > '.$scope['minLat'].' and `Longitude` < &#39;.$scope[&#39;maxLng&#39;].&#39; and `Longitude` > '.$scope['minLng'];
  $stmt = self::$db->query($sql);
  $res = $stmt->fetchAll(PDO::FETCH_ASSOC);    // 获取查询结果并返回
  return $res;
}
登入後複製

擴充:

直到現在,我們已經知道瞭如何計算出附近的人,但在實際需求中,我們往往需要計算出每一個人與當前中心點的實際距離。
接著,我們再來看一個方法:

/**
 * 获取两个经纬度之间的距离
 * @param string $lat1 纬一
 * @param String $lng1 经一
 * @param String $lat2 纬二
 * @param String $lng2 经二
 * @return float 返回两点之间的距离
 */
public function calcDistance($lat1, $lng1, $lat2, $lng2) {
  /** 转换数据类型为 double */
  $lat1 = doubleval($lat1);
  $lng1 = doubleval($lng1);
  $lat2 = doubleval($lat2);
  $lng2 = doubleval($lng2);
  /** 以下算法是 Google 出来的,与大多数经纬度计算工具结果一致 */
  $theta = $lng1 - $lng2;
  $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;
  return ($miles * 1.609344);
}
登入後複製

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

php使用redis長連接有哪些步驟

php應用程式容器化與部署使用詳解

以上是用PHP做出搜尋附近的人功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板