2018-07-11 13:27:56 1361瀏覽
搜索附近的人這項功能對我們來說已經(jīng)不在陌生了,那么搜索附近的人怎么用PHP實現(xiàn)呢?本篇文章扣丁學(xué)堂PHP培訓(xùn)小編就帶讀者們來了解一下PHP搜索附近的人如何用代碼實現(xiàn)。
本文實例為大家分享PHP實現(xiàn)搜索附近的人具體代碼,供大家參考,具體內(nèi)容如下。
實現(xiàn)思路:
首先,我們應(yīng)該這樣想: 既然我們知道了用戶當(dāng)前位置的經(jīng)緯度,又知道我們將要搜索的范圍,我們可不可以計算出一個范圍 ?也就是說,根據(jù)一個中心點和半徑,計算出符合條件的經(jīng)緯度的最大值和最小值 。
具體實現(xiàn):
那么到此,想要獨立思考完成的小伙伴可以不要繼續(xù)往下看了。
上面我們提到該功能的一個實現(xiàn)原理,接下來我們就講解一下具體的實現(xiàn)步驟。
我們先聲明一個函數(shù),用作計算經(jīng)緯度的范圍:
/** * 根據(jù)經(jīng)緯度和半徑計算出范圍 * @param string $lat 緯度 * @param String $lng 經(jīng)度 * @param float $radius 半徑 * @return Array 范圍數(shù)組 */ 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; // 最小經(jīng)度 $maxLng = $lng + $radiusLng; // 最大經(jīng)度 /** 返回范圍數(shù)組 */ $scope = array( 'minLat' => $minLat, 'maxLat' => $maxLat, 'minLng' => $minLng, 'maxLng' => $maxLng ); return $scope; }
返回的數(shù)組中包含了在 $radius 范圍內(nèi),符合條件的最大最小經(jīng)緯度。既然我們已經(jīng)獲取到了范圍,那么我們就可以開始從數(shù)據(jù)庫中查找所有在這個經(jīng)緯度范圍內(nèi)符合條件的記錄:
/** * 根據(jù)經(jīng)緯度和半徑查詢在此范圍內(nèi)的所有的電站 * @param String $lat 緯度 * @param String $lng 經(jīng)度 * @param float $radius 半徑 * @return Array 計算出來的結(jié)果 */ public function searchByLatAndLng($lat, $lng, $radius) { $scope = $this->calcScope($lat, $lng, $radius); // 調(diào)用范圍計算函數(shù),獲取最大最小經(jīng)緯度 /** 查詢經(jīng)緯度在 $radius 范圍內(nèi)的電站的詳細(xì)地址 */ $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); // 獲取查詢結(jié)果并返回 return $res; }
擴(kuò)展:
直到現(xiàn)在,我們已經(jīng)知道了如何計算出附近的人,但在實際需求中,我們往往需要計算出每一個人與當(dāng)前中心點的實際距離。接著,我們再來看一個方法:
/** * 獲取兩個經(jīng)緯度之間的距離 * @param string $lat1 緯一 * @param String $lng1 經(jīng)一 * @param String $lat2 緯二 * @param String $lng2 經(jīng)二 * @return float 返回兩點之間的距離 */ public function calcDistance($lat1, $lng1, $lat2, $lng2) { /** 轉(zhuǎn)換數(shù)據(jù)類型為 double */ $lat1 = doubleval($lat1); $lng1 = doubleval($lng1); $lat2 = doubleval($lat2); $lng2 = doubleval($lng2); /** 以下算法是 Google 出來的,與大多數(shù)經(jīng)緯度計算工具結(jié)果一致 */ $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); }
以上就是扣丁學(xué)堂PHP在線學(xué)習(xí)小編為大家簡單分享的搜索附近的人怎么用PHP實現(xiàn),希望對小伙伴們有所幫助,想要了解更多內(nèi)容的小伙伴可以登錄扣丁學(xué)堂官網(wǎng)咨詢??鄱W(xué)堂不僅有專業(yè)的PHP培訓(xùn)班供學(xué)員學(xué)習(xí),還有與時俱進(jìn)的課程體系和大量的PHP在線視頻供學(xué)員免費學(xué)習(xí)。想要學(xué)好PHP開發(fā)的小伙伴現(xiàn)在就行動吧??鄱W(xué)堂PHP技術(shù)交流群:374332265。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】
查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>