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

Oct 22, 2020 am 09:56 AM
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.

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

CakePHP travaillant avec la base de données CakePHP travaillant avec la base de données Sep 10, 2024 pm 05:25 PM

Travailler avec la base de données dans CakePHP est très simple. Nous comprendrons les opérations CRUD (Créer, Lire, Mettre à jour, Supprimer) dans ce chapitre.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

Journalisation CakePHP Journalisation CakePHP Sep 10, 2024 pm 05:26 PM

Se connecter à CakePHP est une tâche très simple. Il vous suffit d'utiliser une seule fonction. Vous pouvez enregistrer les erreurs, les exceptions, les activités des utilisateurs, les actions entreprises par les utilisateurs, pour tout processus en arrière-plan comme cronjob. La journalisation des données dans CakePHP est facile. La fonction log() est fournie

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

See all articles