濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 搜索附近的人PHP實(shí)現(xiàn)代碼

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

熱門(mén)標(biāo)簽:長(zhǎng)沙crm外呼系統(tǒng)業(yè)務(wù) 江蘇外呼電銷(xiāo)機(jī)器人報(bào)價(jià) 400電話申請(qǐng)方法收費(fèi) 深圳外呼系統(tǒng)收費(fèi) 南寧高頻外呼回?fù)芟到y(tǒng)哪家好 離石地圖標(biāo)注 專(zhuān)業(yè)電話機(jī)器人批發(fā)商 電話機(jī)器人危險(xiǎn)嗎 400電話辦理福州市

本文實(shí)例為大家分享了PHP實(shí)現(xiàn)搜索附近的人具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)思路:

首先,我們應(yīng)該這樣想: 既然我們知道了用戶(hù)當(dāng)前位置的經(jīng)緯度,又知道我們將要搜索的范圍,我們可不可以計(jì)算出一個(gè)范圍 ?也就是說(shuō),根據(jù)一個(gè)中心點(diǎn)和半徑,計(jì)算出符合條件的經(jīng)緯度的最大值和最小值 。

具體實(shí)現(xiàn):

那么到此,想要獨(dú)立思考完成的小伙伴可以不要繼續(xù)往下看了。
上面我們提到該功能的一個(gè)實(shí)現(xiàn)原理,接下來(lái)我們就講解一下具體的實(shí)現(xiàn)步驟。
我們先聲明一個(gè)函數(shù),用作計(jì)算經(jīng)緯度的范圍:

/**
 * 根據(jù)經(jīng)緯度和半徑計(jì)算出范圍
 * @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)獲取到了范圍,那么我們就可以開(kāi)始從數(shù)據(jù)庫(kù)中查找所有在這個(gè)經(jīng)緯度范圍內(nèi)符合條件的記錄:

/**
 * 根據(jù)經(jīng)緯度和半徑查詢(xún)?cè)诖朔秶鷥?nèi)的所有的電站
 * @param String $lat  緯度
 * @param String $lng  經(jīng)度
 * @param float $radius 半徑
 * @return Array     計(jì)算出來(lái)的結(jié)果
 */
public function searchByLatAndLng($lat, $lng, $radius) {
  $scope = $this->calcScope($lat, $lng, $radius);   // 調(diào)用范圍計(jì)算函數(shù),獲取最大最小經(jīng)緯度
  /** 查詢(xún)經(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);    // 獲取查詢(xún)結(jié)果并返回
  return $res;
}

擴(kuò)展:

直到現(xiàn)在,我們已經(jīng)知道了如何計(jì)算出附近的人,但在實(shí)際需求中,我們往往需要計(jì)算出每一個(gè)人與當(dāng)前中心點(diǎn)的實(shí)際距離。
接著,我們?cè)賮?lái)看一個(gè)方法:

/**
 * 獲取兩個(gè)經(jīng)緯度之間的距離
 * @param string $lat1 緯一
 * @param String $lng1 經(jīng)一
 * @param String $lat2 緯二
 * @param String $lng2 經(jīng)二
 * @return float 返回兩點(diǎn)之間的距離
 */
public function calcDistance($lat1, $lng1, $lat2, $lng2) {
  /** 轉(zhuǎn)換數(shù)據(jù)類(lèi)型為 double */
  $lat1 = doubleval($lat1);
  $lng1 = doubleval($lng1);
  $lat2 = doubleval($lat2);
  $lng2 = doubleval($lng2);
  /** 以下算法是 Google 出來(lái)的,與大多數(shù)經(jīng)緯度計(jì)算工具結(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);
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • php+ajax做仿百度搜索下拉自動(dòng)提示框(有實(shí)例)
  • php啟用sphinx全文搜索的實(shí)現(xiàn)方法
  • php站內(nèi)搜索并高亮顯示關(guān)鍵字的實(shí)現(xiàn)代碼
  • PHP 搜索查詢(xún)功能實(shí)現(xiàn)
  • php 搜索框提示(自動(dòng)完成)實(shí)例代碼
  • jquery+php實(shí)現(xiàn)搜索框自動(dòng)提示
  • ThinkPHP讓分頁(yè)保持搜索狀態(tài)的方法
  • php使用正則表達(dá)式進(jìn)行字符串搜索的方法
  • 利用PHP+JS實(shí)現(xiàn)搜索自動(dòng)提示(實(shí)例)

標(biāo)簽:株洲 濱州 白酒營(yíng)銷(xiāo) 興安盟 南昌 曲靖 南京 太原

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《搜索附近的人PHP實(shí)現(xiàn)代碼》,本文關(guān)鍵詞  搜索,附,近的,人,PHP,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《搜索附近的人PHP實(shí)現(xiàn)代碼》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于搜索附近的人PHP實(shí)現(xiàn)代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    甘泉县| 东平县| 乌海市| 饶河县| 应城市| 安泽县| 江达县| 洛浦县| 日喀则市| 镇安县| 清镇市| 类乌齐县| 永兴县| 雅安市| 天祝| 胶南市| 清苑县| 罗甸县| 宝兴县| 溧水县| 龙井市| 钦州市| 甘孜| 祁连县| 高邑县| 蕲春县| 大新县| 武威市| 衢州市| 镇雄县| 呈贡县| 巫溪县| 仪陇县| 东宁县| 澜沧| 汝南县| 天水市| 张掖市| 彭水| 鞍山市| 西平县|