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

藏色散人
Libérer: 2023-03-06 19:16:02
original
2594 Les gens l'ont consulté

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.

Comment implémenter la recherche de personnes à proximité en php

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;
}
Copier après la connexion

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 = &#39;SELECT `字段` FROM `表名` WHERE `Latitude` < &#39;.$scope[&#39;maxLat&#39;].&#39; and `Latitude` > &#39;.$scope[&#39;minLat&#39;].&#39; and `Longitude` < &#39;.$scope[&#39;maxLng&#39;].&#39; and `Longitude` > &#39;.$scope[&#39;minLng&#39;];    $stmt = self::$db->query($sql);    $res = $stmt->fetchAll(PDO::FETCH_ASSOC);       // 获取查询结果并返回
    return $res;
}
Copier après la connexion

[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);
}
Copier après la connexion

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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal