91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php怎么實現搜索附近的人

發布時間:2020-10-23 14:09:30 來源:億速云 閱讀:151 作者:小新 欄目:編程語言

php怎么實現搜索附近的人?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!

php實現搜索附近的人的方法:首先聲明一個函數,用作計算經緯度的范圍;然后從數據庫中查找所有在這個經緯度范圍內符合條件的記錄;最后查詢經緯度在“$radius”范圍內的電站的詳細地址即可。

最近的一個項目要求根據用戶當前位置的經緯度來查詢該用戶方圓十公里以內的人,這個功能并不是什么很有技術含量的實現(當然,我們僅僅指的是該功能本身和數據量較小的時候,并不包括長期以來其派生出來的其他問題 ),但由于種種考慮,我還是決定將其記錄下來。
以后不管我們從事APP服務端開發,還是做WEB開發,可能經常會有客戶要求實現這樣的功能,所以我們還是要掌握其原理。

【問題的提出】

我們該如何思考這個問題 ? 可能有的小伙伴要說了:“ 既然我們已經知道了當前用戶的經緯度,我們從數據庫里面查詢用戶的經緯度,然后一一計算,篩選出所有符合條件的用戶。”

我也曾想當然的這樣認為,并沒有考慮到數據庫的感受,當你操作的是一個十萬,百萬級別的數據庫時,這樣的做法帶來的問題將是災難性的,那么我們到底該如何做呢 ?

【實現思路】

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

【具體實現】

那么到此,想要獨立思考完成的小伙伴可以不要繼續往下看了。

上面我們提到該功能的一個實現原理,接下來我們就講解一下具體的實現步驟。

我們先聲明一個函數,用作計算經緯度的范圍:

/**
 * 根據經緯度和半徑計算出范圍
 * @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` < '.$scope['maxLat'].' and `Latitude` > '.$scope['minLat'].' and `Longitude` < '.$scope['maxLng'].' 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);
}

我們在之前已經計算出了附近符合條件的所有人的經緯度,那么我們可以將每一個人的經緯度和當前中心點的經緯度作為參數傳入該函數,最終計算出每個人符合條件的人與該中心點的距離。

為了保證程序的嚴謹性,我必須做出以下說明:

經緯度范圍的計算方法是在百度上查找的,目前尚沒有找到標準的計算工具,因此該算法無法求證,但大多數帖子基本上采用的這種計算方式。
經緯度距離的計算方式是在 Google 上查找的,計算結果與大多數計算工具結果相近。之所以在 Google 中查找,是因為我曾在百度上查找過多種計算方式,結果都不盡人意。
通過半徑和經緯度計算范圍時,半徑的單位是m;計算距離時,得到的結果是km。因此,要注意單位變化。
我依然在努力求證,尋求有關專業的幫助,獲得更精確的計算結果。

感謝各位的閱讀!看完上述內容,你們對php怎么實現搜索附近的人大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

舟山市| 祁阳县| 阳泉市| 泾川县| 定南县| 崇左市| 新干县| 江陵县| 射洪县| 双柏县| 柳江县| 丰县| 徐水县| 泾阳县| 清水县| 凯里市| 崇义县| 沙湾县| 招远市| 噶尔县| 临漳县| 张家港市| 吉木乃县| 于都县| 平武县| 高阳县| 东乡县| 新丰县| 四会市| 保康县| 安仁县| 黄石市| 阳西县| 仙桃市| 东方市| 双桥区| 齐河县| 金坛市| 兰州市| 绵竹市| 海伦市|