• 技术文章 >后端开发 >php教程

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

    藏色散人藏色散人2019-08-23 18:00:27转载1802
    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);
        }
    } 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取坐标(找出离我100公里以内的山)

    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取坐标(找出离我1500公里以内的山)

    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取坐标(找出离小五台山1000公里以内的山)

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

    以上就是PHP使用Redis的GEO(地理位置)命令的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:jmsite,如有侵犯,请联系admin@php.cn删除
    专题推荐:PHP Redis GEO
    上一篇:php是干什么的 下一篇:CentOS6.9源码编译安装redis和php-redis扩展
    PHP编程就业班

    相关文章推荐

    • 用Geolocation获取地理位置信息• Laravel 中利用 GeoIP 获取用户地理位置信息• MySQL的geometry类型处理经纬度距离的方法介绍• 地理位置geo处理之mysql函数的详细介绍(附代码)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网