PHP使用Redis的GEO(地理位置)命令
发布:smiling 来源: PHP粉丝网 添加日期:2020-04-28 18:03:31 浏览: 评论: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);
- //phpfensi.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取坐标(找出离我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
- )
- )
- )
Tags: Redis GEO命令
- 上一篇:php如何防范xss
- 下一篇:php什么时候使用闭包
相关文章
- ·php实现redis数据库指定库号迁移(2014-09-10)
- ·redis访问权限控制,密码设置(2014-09-10)
- ·php怎么安装redis扩展?redis安装以及php扩展的介绍(2018-07-20)
- ·laravel项目利用twemproxy部署redis集群的完整步骤(2018-11-07)
- ·PHP+redis实现的悲观锁机制示例(2018-11-14)
- ·PhpRedis与Predis之间的性能比较(实例)(2020-02-04)
- ·Redis分片(分布式缓存)(2020-02-04)
- ·浅谈redis的缓存穿透和缓存失效的预防和解决(2020-04-09)
- ·php实现redis数据库指定库号迁移的方法(2021-05-08)
- ·php操作redis缓存方法分享(2021-05-27)
- ·PHP实现操作redis的封装类完整实例(2021-06-26)
- ·PHP+redis实现添加处理投票的方法(2021-06-26)
- ·PHP使用redis实现统计缓存mysql压力的方法(2021-06-26)
- ·PHP使用Redis实现防止大并发下二次写入的方法(2021-08-11)
- ·PHP+Redis 消息队列 实现高并发下注册人数统计的实例(2021-09-01)
- ·php+redis消息队列实现抢购功能(2021-09-03)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)