Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie die Suche nach Personen in der Nähe in PHP

So implementieren Sie die Suche nach Personen in der Nähe in PHP

藏色散人
藏色散人Original
2020-10-22 09:56:492539Durchsuche

So implementieren Sie die Suche nach Personen in der Nähe in PHP: Deklarieren Sie zunächst eine Funktion zur Berechnung des Längen- und Breitengradbereichs und suchen Sie dann in der Datenbank nach allen Datensätzen, die die Bedingungen innerhalb dieses Längen- und Breitengradbereichs erfüllen im Bereich „$radius“ Die detaillierte Adresse des Kraftwerks reicht aus.

So implementieren Sie die Suche nach Personen in der Nähe in PHP

Empfohlen: „PHP-Video-Tutorial

Ein aktuelles Projekt erfordert die Abfrage von Personen im Umkreis von zehn Kilometern um den Benutzer basierend auf dem Längen- und Breitengrad des aktuellen Standorts des Benutzers Es handelt sich nicht um eine sehr technische Implementierung (natürlich beziehen wir uns nur auf die Funktion selbst und die geringe Datenmenge und schließen lange Zeit keine anderen daraus abgeleiteten Probleme ein), aber aus verschiedenen Gründen habe ich mich für die Aufzeichnung entschieden es Komm runter.
Unabhängig davon, ob wir uns in Zukunft mit der Entwicklung von APP-Servern oder der WEB-Entwicklung befassen, werden Kunden möglicherweise häufig nach solchen Funktionen fragen, sodass wir deren Prinzipien noch beherrschen müssen.

【Problemerhebung】

Wie sollten wir über dieses Problem denken? Einige Freunde möchten vielleicht sagen: „Da wir nun bereits den Längen- und Breitengrad des aktuellen Benutzers kennen, fragen wir den Längen- und Breitengrad des Benutzers aus der Datenbank ab und berechnen sie dann einzeln, um alle qualifizierten Benutzer herauszufiltern.“

Ich habe es auch als selbstverständlich angesehen, dass die Gefühle der Datenbank nicht berücksichtigt werden. Wenn Sie eine Datenbank mit einhunderttausend oder einer Million Ebenen betreiben, werden die Probleme, die durch einen solchen Ansatz verursacht werden, katastrophal sein wir tun?

[Implementierungsidee]

Zunächst sollten wir so denken: Nachdem wir nun den Längen- und Breitengrad des aktuellen Standorts des Benutzers kennen und den Bereich kennen, in dem wir suchen werden, können wir dann einen Bereich berechnen? Das heißt, berechnen Sie basierend auf einem Mittelpunkt und einem Radius die maximalen und minimalen Werte für Längen- und Breitengrad, die die Bedingungen erfüllen.

【Konkrete Umsetzung】

Also hier, Freunde, die unabhängig denken und es fertigstellen möchten, lesen Sie nicht weiter.

Wir haben oben ein Implementierungsprinzip dieser Funktion erwähnt. Als nächstes werden wir die spezifischen Implementierungsschritte erläutern.

Wir deklarieren zunächst eine Funktion zur Berechnung des Breiten- und Längengradbereichs:

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

Das zurückgegebene Array enthält den maximalen und minimalen Breiten- und Längengrad, der die Bedingungen innerhalb des Bereichs von $radius erfüllt.

Da wir nun den Bereich erhalten haben, können wir damit beginnen, alle Datensätze, die die Kriterien innerhalb dieses Breiten- und Längengradbereichs erfüllen, aus der Datenbank zu finden:

/**
 * 根据经纬度和半径查询在此范围内的所有的
 * @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;
}

【Erweiterung】

Bis jetzt wussten wir, wie man in der Nähe berechnet Menschen, aber bei tatsächlichen Bedürfnissen müssen wir oft den tatsächlichen Abstand zwischen jeder Person und dem aktuellen Mittelpunkt berechnen.

Als nächstes schauen wir uns eine andere Methode an:

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

Wir haben zuvor den Längen- und Breitengrad aller Personen in der Nähe berechnet, die die Bedingungen erfüllen, dann können wir den Längen- und Breitengrad jeder Person sowie den Längen- und Breitengrad des aktuellen Zentrums übergeben Geben Sie den Punkt als Parameter in die Funktion ein und berechnen Sie schließlich den Abstand zwischen jeder qualifizierten Person und dem Mittelpunkt.

Um die Genauigkeit des Programms sicherzustellen, muss ich die folgende Erklärung abgeben:

Die Berechnungsmethode für den Breiten- und Längengradbereich wurde auf Baidu gefunden. Derzeit gibt es kein Standardberechnungstool, daher kann der Algorithmus nicht überprüft werden. Aber die meisten Beiträge werden grundsätzlich verwendet. Diese Berechnungsmethode wird verwendet.
Die Berechnungsmethode für Breiten- und Längengrade wurde bei Google gefunden und die Berechnungsergebnisse ähneln denen der meisten Berechnungstools. Der Grund, warum ich in Google gesucht habe, ist, dass ich auf Baidu nach verschiedenen Berechnungsmethoden gesucht habe, die Ergebnisse jedoch nicht zufriedenstellend waren.
Bei der Berechnung der Reichweite durch Radius und Breiten- und Längengrad ist die Einheit des Radius m; bei der Berechnung der Entfernung ist das Ergebnis km. Achten Sie daher auf Einheitenänderungen.
Ich versuche immer noch, dies zu überprüfen und professionelle Hilfe in Anspruch zu nehmen, um genauere Berechnungsergebnisse zu erhalten.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Suche nach Personen in der Nähe in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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