Maison >développement back-end >Problème PHP >Comment implémenter la recherche de personnes à proximité en php
Comment implémenter la recherche de personnes à proximité en PHP : déclarez d'abord une fonction pour calculer la plage de longitude et de latitude, puis recherchez tous les enregistrements qui remplissent les conditions dans cette plage de longitude et de latitude dans la base de données ; la longitude et la latitude en "$radius ". Les adresses détaillées des centrales électriques situées à proximité suffisent.
Recommandé : "Tutoriel vidéo PHP》
Un projet récent nécessite d'interroger les personnes à moins de dix kilomètres de l'utilisateur en fonction de la longitude et de la latitude de l'emplacement actuel de l'utilisateur. Cette fonction n'est pas une implémentation très technique (bien sûr, nous faisons uniquement référence au. Lorsque la fonction elle-même et la quantité de données sont petites, cela n'inclut pas les autres problèmes qui en découlent depuis longtemps), mais pour diverses considérations, j'ai décidé de l'enregistrer.
À l'avenir, que nous soyons engagés dans le développement de serveurs APP ou dans le développement WEB, les clients pourront souvent demander la mise en œuvre d'une telle fonction, nous devons donc encore maîtriser ses principes.
[Problème soulevé]
Comment devrions-nous penser à ce problème ? Certains amis voudront peut-être dire : « Maintenant que nous connaissons déjà la longitude et la latitude de l'utilisateur actuel, nous interrogeons la longitude et la latitude de l'utilisateur dans la base de données, puis les calculons un par un pour filtrer tous les utilisateurs qualifiés
Je l'ai pris une fois pour acquis et je n'ai pas pris en compte les sensations de la base de données. Lorsque vous exploitez une base de données à l'échelle de cent mille ou d'un million, les problèmes causés par une telle approche seront donc catastrophiques. que devons-nous faire ? [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 plage que nous allons rechercher, pouvons-nous calculer une fourchette ? 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]Ça y est, les amis qui veulent penser de manière indépendante et le compléter, ne lisez pas plus loin. Nous avons mentionné ci-dessus un principe de mise en œuvre de cette fonction. Ensuite, 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 à rechercher dans la base de données tous les enregistrements qui remplissent les conditions dans cette plage de latitude et de longitude :
/** * 根据经纬度和半径查询在此范围内的所有的 * @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; }[Extended]Jusqu'à présent, nous savons déjà 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); }Nous avons préalablement calculé la longitude et la latitude de toutes les personnes à proximité qui remplissent les conditions, nous pouvons ensuite combiner la longitude et la latitude de chaque personne avec le point central actuel La longitude et la latitude sont transmises à la fonction en tant que paramètres, et la distance entre chaque personne qualifiée et le point central est finalement calculée. Afin de garantir la rigueur du programme, je dois faire l'explication suivante : La méthode de calcul de la plage de latitude et de longitude a été trouvée sur Baidu. Il n'existe pas encore d'outil de calcul standard. , donc cet algorithme Impossible à vérifier, mais la plupart des articles utilisent essentiellement cette méthode de calcul.
La méthode de calcul de la distance de latitude et de longitude a été trouvée sur Google, et les résultats du calcul sont similaires à ceux de la plupart des outils de calcul. La raison pour laquelle j'ai cherché sur Google était parce que j'avais recherché diverses méthodes de calcul sur Baidu, mais les résultats n'étaient pas satisfaisants.
Lors du calcul de la portée par rayon, latitude et longitude, l'unité de rayon est m lors du calcul de la distance, le résultat est km. Soyez donc conscient des changements d’unités.
Je travaille toujours dur pour vérifier et demander l'aide d'un professionnel pour obtenir des résultats de calcul plus précis.
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!