Maison  >  Article  >  développement back-end  >  Utilisez PHP pour créer une fonction de recherche pour les personnes à proximité

Utilisez PHP pour créer une fonction de recherche pour les personnes à proximité

php中世界最好的语言
php中世界最好的语言original
2018-05-18 14:49:521682parcourir

Cette fois, je vais vous présenter la fonction de recherche de personnes à proximité en utilisant PHP. Utilisez PHP pour réaliser la fonction de recherche de personnes à proximité Quelles sont les choses à noter Voici un cas pratique. Jetons un coup d'oeil.

Idée de mise en œuvre :

Tout d'abord, nous devrions penser comme ceci : Maintenant que nous connaissons la longitude et la latitude de l'emplacement actuel de l'utilisateur et la distance vers laquelle nous nous dirigeons pour rechercher, pouvons-nous calculer Hors plage ? C'est-à-dire, en fonction d'un point central et d'un rayon, calculer les valeurs maximales et minimales de longitude et de latitude qui remplissent les conditions.

Mise en œuvre détaillée :

À ce stade, les amis qui souhaitent penser de manière indépendante et le terminer peuvent arrêter de lire.
Nous avons mentionné ci-dessus un principe de mise en œuvre de cette fonction, puis nous expliquerons les étapes spécifiques de mise en œuvre.
Nous déclarons d'abord une fonction pour calculer la plage de latitude et de longitude :

/**
 * 根据经纬度和半径计算出范围
 * @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;
}

Le tableau renvoyé contient la latitude et la longitude maximale et minimale qui remplissent les conditions dans la plage $radius.
Maintenant que nous avons obtenu la plage, nous pouvons commencer à trouver tous les enregistrements qui répondent aux critères dans cette plage de latitude et de longitude à partir de la base de données :

/**
 * 根据经纬度和半径查询在此范围内的所有的电站
 * @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` < &#39;.$scope[&#39;maxLat&#39;].&#39; and `Latitude` > '.$scope['minLat'].' and `Longitude` < &#39;.$scope[&#39;maxLng&#39;].&#39; and `Longitude` > '.$scope['minLng'];
  $stmt = self::$db->query($sql);
  $res = $stmt->fetchAll(PDO::FETCH_ASSOC);    // 获取查询结果并返回
  return $res;
}

Extension :

Jusqu'à présent, nous savions comment calculer les personnes à proximité, mais dans les besoins réels, nous devons souvent calculer la distance réelle de chaque personne par rapport au point central actuel.
Ensuite, regardons une autre méthode :

/**
 * 获取两个经纬度之间的距离
 * @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);
}

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur PHP. Site chinois !

Lecture recommandée :

Quelles sont les étapes pour utiliser la connexion longue Redis en PHP

Explication détaillée de la conteneurisation des applications PHP et déploiement

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn