溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP如何使用Redis的GEO(地理位置)命令

發(fā)布時(shí)間:2020-10-19 16:30:31 來(lái)源:億速云 閱讀:300 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)PHP如何使用Redis的GEO(地理位置)命令的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

Redis自3.2版本開(kāi)始新增對(duì)GEO(地理位置)的支持,但是地球不是一個(gè)完美的球體,在最壞的情況下的偏差可能是0.5%。接近兩極的區(qū)域是不支持的,支持坐標(biāo)的有效的經(jīng)度從-180度到180度;有效的緯度從-85.05112878度到85.05112878度,超出范圍將會(huì)報(bào)錯(cuò)。

我喜歡爬山,學(xué)習(xí)GEO的時(shí)候我也以山的坐標(biāo)做演示,我的坐標(biāo)是:

116.517159,39.922267

我整理了一些山的坐標(biāo)

$mountainCoordinates = array(
    array('115.793844', '40.584459', 'Hai_tuo'),//海陀山坐標(biāo)
    array('115.056232', '39.948933', 'Small_wutai'),//小五臺(tái)山坐標(biāo)
    array('114.173822', '27.474563', 'Wu_gong'),//武功山坐標(biāo)
    array('111.341648', '25.518178', 'Leek_ridge'),//韭菜嶺坐標(biāo)
    array('103.901761', '31.60487', 'Jiu_ding'),//九頂山坐標(biāo)
    array('107.398009', '34.057777', 'Ao_Shan'),//鰲山坐標(biāo)
);

1.向mountainCoordinates的key里增加坐標(biāo)

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();
}

執(zhí)行結(jié)果

int(1)
int(1)
int(1)
int(1)
int(1)
int(1)

2.獲取坐標(biāo)

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();
}

執(zhí)行結(jié)果

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.計(jì)算兩個(gè)坐標(biāo)間距離

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();
}

執(zhí)行結(jié)果:海陀山和小五臺(tái)山之間距離是94.4219km

string(7) "94.4219"

4.以我的坐標(biāo)為原點(diǎn),按半徑100km取坐標(biāo)(找出離我100公里以內(nèi)的山)

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();
}

執(zhí)行結(jié)果:只有海陀山,離我95.8884km

Array
(
    [0] => Array
        (
            [0] => Hai_tuo
            [1] => 95.8884
            [2] => Array
                (
                    [0] => 115.79384654760360718
                    [1] => 40.58445845049069334
                )
        )
)

5.以我的坐標(biāo)為原點(diǎn),按半徑1500km取坐標(biāo)(找出離我1500公里以內(nèi)的山)

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();
}

執(zhí)行結(jié)果:找出了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.以小五臺(tái)山的坐標(biāo)為原點(diǎn),按半徑1000km取坐標(biāo)(找出離小五臺(tái)山1000公里以內(nèi)的山)

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();
}

執(zhí)行結(jié)果:排除小五臺(tái)自己,找到了鰲山和海陀山

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
                )
        )
)

感謝各位的閱讀!關(guān)于PHP如何使用Redis的GEO(地理位置)命令就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI