国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

搜索附近的人PHP實現(xiàn)代碼

2024-05-05 00:02:20
字體:
供稿:網(wǎng)友

本文實例為大家分享了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)的電站的詳細地址 */  $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;}

擴展:

直到現(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);}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 奉化市| 潜江市| 古浪县| 嘉义市| 礼泉县| 宁国市| 巴彦淖尔市| 广东省| 高安市| 双柏县| 罗源县| 平定县| 顺平县| 夏津县| 黎平县| 白玉县| 名山县| 平和县| 平乡县| 安溪县| 苍南县| 玉龙| 福贡县| 邵东县| 大理市| 和平区| 宣恩县| 慈溪市| 循化| 天柱县| 龙海市| 黔西县| 南通市| 西乡县| 凯里市| 松桃| 牡丹江市| 瑞金市| 海安县| 衡水市| 临江市|