>백엔드 개발 >PHP 튜토리얼 >javascript - 사용자의 위도와 경도를 얻고 두 위치 사이의 거리를 계산하는 방법은 무엇입니까?

javascript - 사용자의 위도와 경도를 얻고 두 위치 사이의 거리를 계산하는 방법은 무엇입니까?

WBOY
WBOY원래의
2016-09-19 09:16:321434검색

현재 위치의 위도와 경도를 어떻게 알 수 있나요? 두 장소의 경도와 위도를 알고 나면 두 장소 사이의 거리를 어떻게 계산하나요?
현재 공개 계정으로 작업 중입니다. 사용자의 경도와 위도를 얻은 다음 사용자의 경도와 위도와 다른 위치 사이의 거리를 계산해야 합니다. 어떻게 이를 달성할 수 있나요? 도와주세요, 감사합니다!

답글 내용:

현재 위치의 위도와 경도를 어떻게 알 수 있나요? 두 장소의 경도와 위도를 알고 나면 두 장소 사이의 거리를 어떻게 계산하나요?
현재 공개 계정으로 작업 중입니다. 사용자의 경도와 위도를 얻은 다음 사용자의 경도와 위도와 다른 위치 사이의 거리를 계산해야 합니다. 어떻게 이를 달성할 수 있나요? 도와주세요, 감사합니다!

PHP는 "주변 사람" 기능을 구현하고, IP를 기반으로 경도와 위도를 결정하고, 경도와 위도를 기반으로 거리를 계산합니다

PHP는 IP를 기반으로 방문자의 국가/도시/경도 및 위도를 얻기 위해 GeoIP 확장 프로그램과 데이터베이스를 설치합니다.
그런 다음 geoip_record_by_name($_SERVER['REMOTE_ADDR'])을 사용하여 사용자의 IP를 기반으로 위도와 경도를 확인할 수 있습니다. > 참고: geoip_record_by_name()에서 반환된 서쪽 경도와 남쪽 위도는 음수입니다.

5000미터를 위도와 경도로 변환:

위도: 1도 = 110852m
경도: 1도 = 111320*cos(lat)m
같은 경도에서 위도 하나의 차이는 다음과 같습니다. 약 110852미터
같은 위도에서 한 경도의 차이는 약 111320*cos(lat)미터입니다(lat는 위도의 위도입니다)

<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>
데이터베이스 사용자 테이블에는 사용자의 경도 위도와 위도 경도를 각각 저장하는 두 개의 필드가 있습니다.

($lat-$y) <= lat <= ($lat+$y)
($lon-$x) <= lon <= ($lon+$x)
이 범위는 대략적인 범위입니다. 아래의 거리를 계산한 후 5km 이상 떨어져 있는 사용자를 제거하세요.

위에서 쿼리한 사용자의 경도와 위도에 따라

Haversine 공식을 사용하여 경도와 위도를 기준으로 두 지점 사이의 거리를 계산합니다.

<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>
그런 다음 uasort 또는 array_multisort를 사용하여 가장 가까운 것부터 먼 것까지 사용자를 나열할 수 있습니다. 예를 들어 win, osx, 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>

바이두는 인터페이스를 제공합니다

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

내가 모은 기능을 원본 포스터로 공유

직접 호출할 수 있습니다 https://gist.github.com/wujun...

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.