redis geoadd php,PHP使用Redis的GEO(地理位置)命令

详细内容

Redis自3.2版本开始新增对GEO(地理位置)的支持,但是地球不是一个完美的球体,在最坏的情况下的偏差可能是0.5%。接近两极的区域是不支持的,支持坐标的有效的经度从-180度到180度;有效的纬度从-85.05112878度到85.05112878度,超出范围将会报错。

0dba115c9111ed1f48781fd479779e4c.png

我喜欢爬山,学习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.4219kmstring(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.8884kmArray

(

[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

)

)

)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值