加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP使用Redis的GEO指令

发布时间:2023-10-13 10:31:05 所属栏目:PHP教程 来源:
导读:Redis自3.2版本开始新增对GEO(地理位置)的支持,但是地球不是一个完美的球体,在最坏的情况下的偏差可能是0.5%。接近两极的区域是不支持的,支持坐标的有效的经度从-180度到180度;有效的纬度从-85.05112878度到85.0
Redis自3.2版本开始新增对GEO(地理位置)的支持,但是地球不是一个完美的球体,在最坏的情况下的偏差可能是0.5%。接近两极的区域是不支持的,支持坐标的有效的经度从-180度到180度;有效的纬度从-85.05112878度到85.05112878度,超出范围将会报错。

我喜欢爬山,学习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.向mountainCoordinates的key里增加坐标

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); 
  //Cuoxin.com 
    } 
 
} 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(); 
 

执行结果:海陀山和小五台山之间距离是94.4219km

string(7) "94.4219"

4.以我的坐标为原点,按半径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取坐标

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.以小五台山的坐标为原点,按半径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(); 
 

执行结果:排除小五台自己,找到了鳌山和海陀山

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

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章