Heim >Backend-Entwicklung >PHP-Tutorial >javascript - Wie erhalte ich den Breiten- und Längengrad des Benutzers und berechne die Entfernung zwischen zwei Standorten?

javascript - Wie erhalte ich den Breiten- und Längengrad des Benutzers und berechne die Entfernung zwischen zwei Standorten?

WBOY
WBOYOriginal
2016-09-19 09:16:321448Durchsuche

Wie erhalte ich den Breiten- und Längengrad Ihres aktuellen Standorts? Wie berechnet man die Entfernung zwischen den beiden Orten, nachdem man den Längen- und Breitengrad zweier Orte kennt?
Ich arbeite derzeit an einem öffentlichen Konto. Ich muss den Längen- und Breitengrad des Benutzers ermitteln und dann die Entfernung zwischen dem Längen- und Breitengrad des Benutzers und einem anderen Standort berechnen. Wie kann ich das erreichen? Bitte helfen Sie mir, danke!

Antwortinhalt:

Wie erhalte ich den Breiten- und Längengrad Ihres aktuellen Standorts? Wie berechnet man die Entfernung zwischen den beiden Orten, nachdem man den Längen- und Breitengrad zweier Orte kennt?
Ich arbeite derzeit an einem öffentlichen Konto. Ich muss den Längen- und Breitengrad des Benutzers ermitteln und dann die Entfernung zwischen dem Längen- und Breitengrad des Benutzers und einem anderen Standort berechnen. Wie kann ich das erreichen? Bitte helfen Sie mir, danke!

PHP implementiert die Funktion „Personen in der Nähe“, bestimmt Längen- und Breitengrad basierend auf IP und berechnet Entfernung basierend auf Längen- und Breitengrad

PHP installiert die GeoIP-Erweiterung und -Datenbank, um das Land/die Stadt/den Breiten- und Längengrad des Besuchers basierend auf der IP zu ermitteln.
Dann können Sie geoip_record_by_name($_SERVER['REMOTE_ADDR']) verwenden, um den Breiten- und Längengrad basierend auf der IP des Benutzers zu ermitteln Hinweis: Der von geoip_record_by_name() zurückgegebene westliche Längengrad und der südliche Breitengrad sind negative Zahlen.

5000 Meter umgerechnet in Breiten- und Längengrad:

Breitengrad: 1 Grad = 110852 m
Längengrad: 1 Grad = 111320*cos(lat) m
Auf dem gleichen Längengrad beträgt die Differenz eines Breitengrades etwa 110852 Meter
Auf dem gleichen Breitengrad beträgt der Unterschied eines Längengrades etwa 111320*cos(lat) Meter (lat ist der Breitengrad des Breitengrades)

<code><?php
//以当前用户经纬度为中心,查询5000米内的其他用户
$y = 5000 / 110852; //纬度的范围
$x = 5000 / (111320*cos($lat)); //经度的范围
$sql = '
    select * from user where 
    lat >= ($lat-$y) and lat <= ($lat+$y) and 
    lon >= ($lon-$x) and lon <= ($lon+$x);
';</code>
Es gibt zwei Felder in der Datenbankbenutzertabelle, in denen der Längengrad (Breitengrad) bzw. der Breitengrad (Lon) des Benutzers gespeichert werden.

($lat-$y) <= lat <= ($lat $y)
($ lon-$x) <= lon <= ($lon $x)
Dieser Bereich ist ein grober Bereich. Nachdem Sie die Entfernung unten berechnet haben, entfernen Sie einfach Benutzer, die mehr als 5 Kilometer entfernt sind.

Entsprechend dem oben abgefragten Längen- und Breitengrad des Benutzers

verwenden Sie die Haversine-Formel, um den Abstand zwischen zwei Punkten basierend auf dem Längen- und Breitengrad zu berechnen:

<code><?php
function distance($lat1, $lon1, $lat2, $lon2) {
    $R = 6371393; //地球平均半径,单位米
    $dlat = deg2rad($lat2-$lat1);
    $dlon = deg2rad($lon2-$lon1);
    $a = pow(sin($dlat/2), 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * pow(sin($dlon/2), 2);
    $c = 2 * atan2(sqrt($a), sqrt(1-$a));
    $d = $R * $c;
    return round($d);
}
echo distance(0, 0, -1, 0); // 111202米</code>
Dann können Sie uasort oder array_multisort verwenden, um die Benutzer vom nächstgelegenen zum entferntesten aufzulisten. Beispielsweise gibt es drei Benutzer mit den Namen win, osx und lin:

<code><?php
$arr = array(
    'win' => array(
        'dis' => 1024,
        'age' => 31
    ),
    'osx' => array(
        'dis' => 512,
        'age' => 15
    ),
    'lin' => array(
        'dis' => 512,
        'age' => 25
    )
);
foreach($arr as $k => $v) {
    $sort['dis'][$k] = $v['dis'];
    $sort['age'][$k] = $v['age'];
}
//先按距离升序排序,如果距离相同,则按年龄降序排序
array_multisort($sort['dis'], SORT_ASC, $sort['age'], SORT_DESC, $arr);
echo json_encode($arr);
//{"lin":{"dis":512,"age":25},"osx":{"dis":512,"age":15},"win":{"dis":1024,"age":31}}</code>

Baidu stellt eine Schnittstelle bereit

GeoIP https://sjolzy.cn/GeoIP-PHP-v...

Teilen Sie eine Funktion, die ich mit dem Originalposter gesammelt habe

Sie können sie direkt aufrufen https://gist.github.com/wujun...

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