PHP는 Redis의 GEO(지리적 위치) 명령을 사용합니다.

藏色散人
풀어 주다: 2023-04-06 14:52:01
앞으로
4258명이 탐색했습니다.

Redis는 버전 3.2부터 GEO(지리적 위치)에 대한 지원을 추가했지만 지구는 완벽한 구형이 아니며 최악의 경우 편차가 0.5%에 이를 수 있습니다. 극에 가까운 지역은 지원되지 않습니다. 지원되는 좌표의 유효한 경도는 -180도에서 180도이며, 유효한 위도는 -85.05112878도에서 범위를 초과하는 경우 오류가 보고됩니다.

PHP는 Redis의 GEO(지리적 위치) 명령을 사용합니다.

저는 산을 오르는 것을 좋아합니다. 저는 GEO를 배울 때 산 좌표를 사용하여 시연했습니다.

116.517159,39.922267
로그인 후 복사

산 좌표를 편집했습니다

$mountainCoordinates = array(
    array('115.793844', '40.584459', 'Hai_tuo'),//海陀山坐标
    array('115.056232', '39.948933', 'Small_wutai'),//小五台山坐标
    array('114.173822', '27.474563', 'Wu_gong'),//武功山坐标
    array('111.341648', '25.518178', 'Leek_ridge'),//韭菜岭坐标
    array('103.901761', '31.60487', 'Jiu_ding'),//九顶山坐标
    array('107.398009', '34.057777', 'Ao_Shan'),//鳌山坐标
);
로그인 후 복사

1.

try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    foreach ($mountainCoordinates as $coordinates){
        $param = array('geoadd', 'mountainCoordinates');
        $param = array_merge($param, $coordinates);
        $ret = call_user_func_array(array($redis, 'rawCommand'), $param);
        print_r($ret);
    }
} catch (Exception $e){
    echo $e->getMessage();
}
로그인 후 복사

실행 결과

int(1)
int(1)
int(1)
int(1)
int(1)
int(1)
로그인 후 복사

2. 좌표 가져오기

try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    $param = array('geopos', 'mountainCoordinates', 'Hai_tuo', 'Wu_gong', 'Jiu_ding');
    $ret = call_user_func_array(array($redis, 'rawCommand'), $param);
    print_r($ret);
} catch (Exception $e){
    echo $e->getMessage();
}
로그인 후 복사

실행 결과

Array
(
    [0] => Array
        (
            [0] => 115.79384654760360718
            [1] => 40.58445845049069334
        )
    [1] => Array
        (
            [0] => 114.1738244891166687
            [1] => 27.47456377424472151
        )
    [2] => Array
        (
            [0] => 103.90176326036453247
            [1] => 31.60486909089710394
        )
)
로그인 후 복사

3. 두 좌표 사이의 거리를 계산합니다

try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    $param = array('geodist', 'mountainCoordinates', 'Hai_tuo', 'Small_wutai', 'km');
    $ret = call_user_func_array(array($redis, 'rawCommand'), $param);
    var_dump($ret);
} catch (Exception $e){
    echo $e->getMessage();
}
로그인 후 복사

실행 결과: Haituo Mountain과 Xiaowutai Mountain 사이의 거리는 94입니다. .4219km

string(7) "94.4219"
로그인 후 복사

4. 나의 좌표를 원점으로 하여 반경 100km에 따른 좌표를 구합니다. (나로부터 100km 이내에 있는 산을 찾아보세요)

try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    $param = array('georadius', 'mountainCoordinates', '116.517159', '39.922267', '100', 'km', 'WITHDIST', 'WITHCOORD');
    $ret = call_user_func_array(array($redis, 'rawCommand'), $param);
    print_r($ret);
} catch (Exception $e){
    echo $e->getMessage();
}
로그인 후 복사

실행 결과: 나로부터 95.8884km 떨어진 곳은 해타산뿐입니다

Array
(
    [0] => Array
        (
            [0] => Hai_tuo
            [1] => 95.8884
            [2] => Array
                (
                    [0] => 115.79384654760360718
                    [1] => 40.58445845049069334
                )
        )
)
로그인 후 복사

5. 내 좌표를 원점으로 하여 반경 1500km에 따른 좌표 가져오기(나로부터 1500km 이내에 있는 산 찾기)

try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    $param = array('georadius', 'mountainCoordinates', '116.517159', '39.922267', '1500', 'km', 'WITHDIST', 'WITHCOORD');
    $ret = call_user_func_array(array($redis, 'rawCommand'), $param);
    print_r($ret);
} catch (Exception $e){
    echo $e->getMessage();
}
로그인 후 복사

실행 결과: 5개의 산 발견

Array
(
    [0] => Array
        (
            [0] => Jiu_ding
            [1] => 1464.4350
            [2] => Array
                (
                    [0] => 103.90176326036453247
                    [1] => 31.60486909089710394
                )
        )
    [1] => Array
        (
            [0] => Ao_Shan
            [1] => 1039.1217
            [2] => Array
                (
                    [0] => 107.3980066180229187
                    [1] => 34.05777705537607147
                )
        )
    [2] => Array
        (
            [0] => Wu_gong
            [1] => 1401.2353
            [2] => Array
                (
                    [0] => 114.1738244891166687
                    [1] => 27.47456377424472151
                )
        )
    [3] => Array
        (
            [0] => Small_wutai
            [1] => 124.6283
            [2] => Array
                (
                    [0] => 115.05623370409011841
                    [1] => 39.94893288365195616
                )
        )
    [4] => Array
        (
            [0] => Hai_tuo
            [1] => 95.8884
            [2] => Array
                (
                    [0] => 115.79384654760360718
                    [1] => 40.58445845049069334
                )
        )
)
로그인 후 복사

6. Xiaowutai Mountain을 원점으로 하여 반경 1000km를 기준으로 좌표를 얻습니다( Xiaowutai Mountain에서 1000km 이내의 산 찾기)

try {
    $redis = new Redis();
    $redis->connect('192.168.75.132', 6379);
    $param = array('georadiusbymember', 'mountainCoordinates', 'Small_wutai', '1000', 'km', 'WITHDIST', 'WITHCOORD');
    $ret = call_user_func_array(array($redis, 'rawCommand'), $param);
    print_r($ret);
} catch (Exception $e){
    echo $e->getMessage();
}
로그인 후 복사

실행 결과: Xiaowutai 자체를 제외하고 Aoshan Mountain 및 Haituo Mountain이 발견되었습니다

Array
(
    [0] => Array
        (
            [0] => Small_wutai
            [1] => 0.0000
            [2] => Array
                (
                    [0] => 115.05623370409011841
                    [1] => 39.94893288365195616
                )
        )
    [1] => Array
        (
            [0] => Hai_tuo
            [1] => 94.4219
            [2] => Array
                (
                    [0] => 115.79384654760360718
                    [1] => 40.58445845049069334
                )
        )
    [2] => Array
        (
            [0] => Ao_Shan
            [1] => 943.7873
            [2] => Array
                (
                    [0] => 107.3980066180229187
                    [1] => 34.05777705537607147
                )
        )
)
로그인 후 복사

위 내용은 PHP는 Redis의 GEO(지리적 위치) 명령을 사용합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:jmsite.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿