国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 搜索附近的人PHP實現代碼

搜索附近的人PHP實現代碼

2019-10-21 11:38等他從上海回來 PHP教程

這篇文章主要為大家詳細介紹了搜索附近的人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` < '.$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);
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产高清一区二区三区 | 欧洲一区二区三区 | 综合网日韩 | 天天射天天干 | 中文字幕一区二区三 | 国产视频在线播放 | 91成人免费看 | 91久久精品国产91久久性色tv | 久久不卡 | 国产片性视频免费播放 | 三区视频| 欧美视频精品 | 国产精品综合一区二区 | 久久久亚洲精品一区二区三区 | 中文字幕亚洲一区二区va在线 | 日本久久成人 | 国内自拍视频在线观看 | 日本免费视频 | 欧美激情五月 | 在线看亚洲 | 久久久成人网 | 性色av一区二区三区 | 亚洲欧美中文日韩在线 | 国产精品对白一区二区三区 | 青娱乐91 | 精品视频一区二区三区 | 91麻豆精品国产91久久久资源速度 | 99热这里有| 成人久久久 | 精品久| 91精品国产91久久久 | 精品91 | 国产欧美日韩综合精品一区二区 | 欧美成人高清视频 | 中文久久久久 | 亚洲精品在线视频观看 | 狠狠操av| 黄网在线观看 | 免费观看一区二区三区毛片软件 | 国产精品久久久久久久一区探花 | 日本a v在线播放 |