Heim Backend-Entwicklung PHP-Tutorial Bringen Sie Ihnen bei, wie Sie PHP verwenden, um Personen in der Nähe zu finden, die Sie suchen

Bringen Sie Ihnen bei, wie Sie PHP verwenden, um Personen in der Nähe zu finden, die Sie suchen

Oct 22, 2020 am 11:49 AM
php

Kürzlich gab es ein Geschäftsszenario, bei dem Personen in der Nähe gefunden wurden. Daher habe ich die relevanten Informationen überprüft und eine technische Zusammenfassung der verschiedenen Möglichkeiten und spezifischen Implementierungen zur Verwendung von PHP zur Implementierung verwandter Funktionen erstellt Lesen Sie es. Bringen Sie Kommentare und Korrekturen mit und kommen wir zur Sache:

LBS (Location-Based Service)

Das Finden von Menschen in der Nähe hat einen größeren Begriff namens LBS (Location-Based Service), LBS bezieht sich auf Es ist Ein Mehrwertdienst, der die Standortinformationen von Benutzern mobiler Endgeräte über das Funkkommunikationsnetz von Telekommunikations-Mobilfunkbetreibern oder externe Positionierungsmethoden erhält und Benutzern mit Unterstützung der GIS-Plattform entsprechende Dienste bereitstellt. Daher muss zuerst der Standort des Benutzers ermittelt werden. Der Standort des Benutzers kann über GPS, Basisstation des Betreibers, WLAN usw. ermittelt werden. Im Allgemeinen erhält der Client die Längen- und Breitenkoordinaten des Standorts des Benutzers und lädt diese auf den Anwendungsserver hoch Der Anwendungsserver speichert die Benutzerkoordinaten und den Client. Beim Abrufen der Daten von Personen in der Nähe greift der Anwendungsserver auf die Datenbank zu, um sie basierend auf dem geografischen Standort des Anforderers und bestimmten Bedingungen (Entfernung, Geschlecht, aktive Zeit usw.) zu filtern und zu sortieren.

Wie finde ich den Abstand zwischen zwei Punkten basierend auf Längen- und Breitengrad?

Wir alle wissen, dass die Koordinaten zweier Punkte in ebenen Koordinaten mit der Formel für den Abstand der ebenen Koordinaten berechnet werden können, aber Längen- und Breitengrad sind sphärische Koordinatensysteme, die die sphärische Oberfläche des dreidimensionalen Raums verwenden, um den Raum auf der Erde zu definieren . Unter der Annahme, dass die Erde in Bezug auf den Kugelabstand eine perfekte Kugel ist, lautet die Berechnungsformel wie folgt:

Bringen Sie Ihnen bei, wie Sie PHP verwenden, um Personen in der Nähe zu finden, die Sie suchen

Wenn Sie sich für den spezifischen Inferenzprozess interessieren, empfehle ich diesen Artikel: [Mathematische Formel und Ableitung] Berechnen Sie den Abstand zwischen zwei Punkten auf dem Boden basierend auf Längen- und Breitengrad

Der PHP-Funktionscode lautet wie folgt:

/**
     * 根据两点间的经纬度计算距离
     * @param $lat1
     * @param $lng1
     * @param $lat2
     * @param $lng2
     * @return float
     */
    public static function getDistance($lat1, $lng1, $lat2, $lng2){
        $earthRadius = 6367000; //approximate radius of earth in meters
        $lat1 = ($lat1 * pi() ) / 180;
        $lng1 = ($lng1 * pi() ) / 180;
        $lat2 = ($lat2 * pi() ) / 180;
        $lng2 = ($lng2 * pi() ) / 180;
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        return round($calculatedDistance);
    }
Nach dem Login kopieren

Der MySQL-Code lautet wie folgt:

SELECT  
  id, (  
    3959 * acos (  
      cos ( radians(78.3232) )  
      * cos( radians( lat ) )  
      * cos( radians( lng ) - radians(65.3234) )  
      + sin ( radians(78.3232) )  
      * sin( radians( lat ) )  
    )  
  ) AS distance  
FROM markers  
HAVING distance < 30  
ORDER BY distance  
LIMIT 0 , 20;
Nach dem Login kopieren

Zusätzlich zur Berechnung der sphärischen Abstandsformel oben können wir ihn erhalten Verwenden Sie bestimmte Datenbankdienste wie Redis und MongoDB:

Redis 3.2 bietet eine GEO-Funktion für geografische Standorte, mit der nicht nur die Entfernung zwischen zwei Standorten, sondern auch eine Sammlung geografischer Standorte innerhalb eines Standortbereichs ermittelt werden kann. Redis-Befehlsdokumentation

1. Einen geografischen Standort hinzufügen

GEOADD key longitude latitude member [longitude latitude member ...]
Nach dem Login kopieren

3. Ermitteln Sie die Entfernung zwischen zwei geografischen Standorten

GEOPOS key member [member ...]
Nach dem Login kopieren

4 Breitengrad

GEODIST key member1 member2 [unit]
Nach dem Login kopieren

5. Holen Sie sich die Standortsammlung mit geografischen Informationen des angegebenen Mitglieds

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
Nach dem Login kopieren

MongoDB hat einen Geodatenindex speziell für diese Art von Abfrage erstellt. Die Indizes 2d und 2dsphere gelten für Ebenen bzw. Kugeln.

MongoDB-Dokument

1. Erstellen Sie einen Index

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
Nach dem Login kopieren

3. Finden Sie die maximale Entfernung und die maximale Anzahl von Elementen

db.location.insert( {uin : 1 , loc : { lon : 50 , lat : 50 } } )
Nach dem Login kopieren

5 Ergebnisse Der Abstand zwischen einem Punkt und dem Abfragepunkt

db.location.ensureIndex( { loc : "2d" } )
Nach dem Login kopieren

6. Verwenden Sie geoNear mit Abfragebedingungen und einer Rückgabenummer. GeoNear verwendet den runCommand-Befehl und unterstützt nicht die Funktion zum Begrenzen und Überspringen von Parametern im Zusammenhang mit Paging in der Suchabfrage

Mehrere PHP-Methoden und spezifische Implementierungen

1. Basierend auf MySql

Methode zum Hinzufügen von Mitgliedern:

db.location.find( { loc :{ $near : [50, 50] } )
Nach dem Login kopieren

Abfrage von Personen in der Nähe (unterstützt Abfragebedingungen und Paging):

db.location.find( { loc : { $near : [50, 50] , $maxDistance : 5 } } ).limit(20)
Nach dem Login kopieren
2. Basierend auf Redis (3.2 oder höher)

PHP kann die

redis

-Erweiterung mit Redis installieren oder die

predis

-Klassenbibliothek über Composer installieren. In diesem Artikel wird die Redis-Erweiterung verwendet, um sie zu implementieren.

Methode zum Hinzufügen von Mitgliedern:

db.runCommand( { geoNear : "location" , near : [ 50 , 50 ], num : 10, query : { type : "museum" } } )
Nach dem Login kopieren

Personen in der Nähe abfragen (Abfragebedingungen und Paging werden nicht unterstützt):

3. Basierend auf MongoDBPHP-Erweiterungen, die MongoDB verwenden, umfassen

mongo

(

Document

) und

mongodb

(

Dokumentation

) Um eine gute Erweiterung auszuwählen, müssen Sie die entsprechende Dokumentation überprüfen. Da es sich bei der Mongodb-Erweiterung um eine neue Version handelt, wird in diesem Artikel die Mongodb-Erweiterung ausgewählt. Angenommen, wir erstellen die Datenbankbibliothek und die Standortsammlung. Legen Sie den Index fest:

Methode zum Hinzufügen von Mitgliedern:
public function geoNearFind($lon, $lat, $maxDistance = 0, $where = array(), $page = 0)
{
    $pdo = $this->getPdo();
    $sql = "SELECT  
              id, (  
                3959 * acos (  
                  cos ( radians(:lat) )  
                  * cos( radians( lat ) )  
                  * cos( radians( lon ) - radians(:lon) )  
                  + sin ( radians(:lat) )  
                  * sin( radians( lat ) )  
                )  
              ) AS distance  
            FROM markers";

    $input[&#39;:lat&#39;] = $lat;
    $input[&#39;:lon&#39;] = $lon;

    if ($where) {
        $sqlWhere = &#39; WHERE &#39;;
        foreach ($where as $key => $value) {
            $sqlWhere .= "`{$key}` = :{$key} ,";
            $input[":{$key}"] = $value;
        }
        $sql .= rtrim($sqlWhere, &#39;,&#39;);
    }

    if ($maxDistance) {
        $sqlHaving = " HAVING distance < :maxDistance";
        $sql .= $sqlHaving;
        $input[&#39;:maxDistance&#39;] = $maxDistance;
    }

    $sql .= &#39; ORDER BY distance&#39;;

    if ($page) {
        $page > 1 ? $offset = ($page - 1) * $this->pageCount : $offset = 0;
        $sqlLimit = " LIMIT {$offset} , {$this->pageCount}";
        $sql .= $sqlLimit;
    }

    $stmt = $pdo->prepare($sql);
    $stmt->execute($input);
    $list = $stmt->fetchAll(PDO::FETCH_ASSOC);

    return $list;
}
Nach dem Login kopieren
Fragen Sie Personen in der Nähe ab (Rückgabeergebnisse haben keine Entfernung, unterstützen Sie Abfragebedingungen, unterstützen Sie Paging)

public function geoAdd($uin, $lon, $lat)
{
    $redis = $this->getRedis();
    $redis->geoAdd(&#39;markers&#39;, $lon, $lat, $uin);
    return true;
}
Nach dem Login kopieren

Fragen Sie Personen in der Nähe ab (Ergebnisse mit Entfernung zurückgeben, Abfragebedingungen unterstützen, Anzahl der Zahlungsrückgaben, Paging nicht unterstützen):

public function geoNearFind($uin, $maxDistance = 0, $unit = &#39;km&#39;)
{
    $redis = $this->getRedis();
    $options = [&#39;WITHDIST&#39;]; //显示距离
    $list = $redis->geoRadiusByMember(&#39;markers&#39;, $uin, $maxDistance, $unit, $options);
    return $list;
}
Nach dem Login kopieren

Hinweise:

1 Wählen Sie eine gute Erweiterung, die Schreibmethoden von Mongo- und Mongodb-Erweiterungen sind sehr unterschiedlich

2. Wenn beim Schreiben von Daten keine Antwort angezeigt wird, überprüfen Sie bitte die Schreibbestätigungsebene.

3 Die mit „find“ abgefragten Daten müssen die Entfernung selbst berechnen, und die mit „geoNear“ abgefragten Daten unterstützen kein Paging.

Die abgefragte Entfernung Die Verwendung von geoNear muss mithilfe der sphärischen und distanceMultiplier-Parameter in km umgewandelt werden. Die obige Demo kann hier angeklickt werden: Demo. Zusammenfassung: Das Obige stellt drei Möglichkeiten vor, die Funktion zum Abfragen von Personen in der Nähe zu implementieren B. relativ wenige Datenzeilen, reicht MySQL aus, um die Entfernung zwischen einem Benutzer und mehreren Städten abzufragen. Wenn Sie jedoch eine schnelle Antwort in Echtzeit und einen allgemeinen Suchbereich benötigen Da die Datenmenge groß ist und es mehrere Attributfilterbedingungen gibt, ist die Verwendung von Mongo praktischerweise nur Vorschläge. Der spezifische Implementierungsplan muss auf der Grundlage des jeweiligen Unternehmens überprüft werden.

Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen bei, wie Sie PHP verwenden, um Personen in der Nähe zu finden, die Sie suchen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

CakePHP-Protokollierung CakePHP-Protokollierung Sep 10, 2024 pm 05:26 PM

Die Anmeldung bei CakePHP ist eine sehr einfache Aufgabe. Sie müssen nur eine Funktion verwenden. Sie können Fehler, Ausnahmen, Benutzeraktivitäten und von Benutzern durchgeführte Aktionen für jeden Hintergrundprozess wie Cronjob protokollieren. Das Protokollieren von Daten in CakePHP ist einfach. Die Funktion log() wird bereitgestellt

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP-Kurzanleitung CakePHP-Kurzanleitung Sep 10, 2024 pm 05:27 PM

CakePHP ist ein Open-Source-MVC-Framework. Es erleichtert die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich. CakePHP verfügt über eine Reihe von Bibliotheken, um die Überlastung der häufigsten Aufgaben zu reduzieren.

See all articles