当前位置:首页 > PHP教程 > php高级应用 > 列表

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

我整理了一些山的坐标

  1. $mountainCoordinates = array( 
  2.  
  3.     array('115.793844', '40.584459', 'Hai_tuo'),//海陀山坐标 
  4.  
  5.     array('115.056232', '39.948933', 'Small_wutai'),//小五台山坐标 
  6.  
  7.     array('114.173822', '27.474563', 'Wu_gong'),//武功山坐标 
  8.  
  9.     array('111.341648', '25.518178', 'Leek_ridge'),//韭菜岭坐标 
  10.  
  11.     array('103.901761', '31.60487', 'Jiu_ding'),//九顶山坐标 
  12.  
  13.     array('107.398009', '34.057777', 'Ao_Shan'),//鳌山坐标 
  14.  
  15. ); 

1.向mountainCoordinates的key里增加坐标

  1. try { 
  2.  
  3.     $redis = new Redis(); 
  4.  
  5.     $redis->connect('192.168.75.132', 6379); 
  6.  
  7.     foreach ($mountainCoordinates as $coordinates){ 
  8.  
  9.         $param = array('geoadd', 'mountainCoordinates'); 
  10.  
  11.         $param = array_merge($param, $coordinates); 
  12.  
  13.         $ret = call_user_func_array(array($redis, 'rawCommand'), $param); 
  14.  
  15.         print_r($ret); 
  16.   //phpfensi.com 
  17.     } 
  18.  
  19. } catch (Exception $e){ 
  20.  
  21.     echo $e->getMessage(); 
  22.  
  23. } 

执行结果

  1. int(1) 
  2.  
  3. int(1) 
  4.  
  5. int(1) 
  6.  
  7. int(1) 
  8.  
  9. int(1) 
  10.  
  11. int(1) 

2.获取坐标

  1. try { 
  2.  
  3.     $redis = new Redis(); 
  4.  
  5.     $redis->connect('192.168.75.132', 6379); 
  6.  
  7.     $param = array('geopos', 'mountainCoordinates', 'Hai_tuo', 'Wu_gong', 'Jiu_ding'); 
  8.  
  9.     $ret = call_user_func_array(array($redis, 'rawCommand'), $param); 
  10.  
  11.     print_r($ret); 
  12.  
  13. } catch (Exception $e){ 
  14.  
  15.     echo $e->getMessage(); 
  16.  
  17. } 

执行结果

  1. Array 
  2.  
  3. ( 
  4.  
  5.     [0] => Array 
  6.  
  7.         ( 
  8.  
  9.             [0] => 115.79384654760360718 
  10.  
  11.             [1] => 40.58445845049069334 
  12.  
  13.         ) 
  14.  
  15.     [1] => Array 
  16.  
  17.         ( 
  18.  
  19.             [0] => 114.1738244891166687 
  20.  
  21.             [1] => 27.47456377424472151 
  22.  
  23.         ) 
  24.  
  25.     [2] => Array 
  26.  
  27.         ( 
  28.  
  29.             [0] => 103.90176326036453247 
  30.  
  31.             [1] => 31.60486909089710394 
  32.  
  33.         ) 
  34.  
  35. ) 

3.计算两个坐标间距离

  1. try { 
  2.  
  3.     $redis = new Redis(); 
  4.  
  5.     $redis->connect('192.168.75.132', 6379); 
  6.  
  7.     $param = array('geodist', 'mountainCoordinates', 'Hai_tuo', 'Small_wutai', 'km'); 
  8.  
  9.     $ret = call_user_func_array(array($redis, 'rawCommand'), $param); 
  10.  
  11.     var_dump($ret); 
  12.  
  13. } catch (Exception $e){ 
  14.  
  15.     echo $e->getMessage(); 
  16.  
  17. } 

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

string(7) "94.4219"

4.以我的坐标为原点,按半径100km取坐标(找出离我100公里以内的山)

  1. try { 
  2.  
  3.     $redis = new Redis(); 
  4.  
  5.     $redis->connect('192.168.75.132', 6379); 
  6.  
  7.     $param = array('georadius', 'mountainCoordinates', '116.517159', '39.922267', '100', 'km', 'WITHDIST', 'WITHCOORD'); 
  8.  
  9.     $ret = call_user_func_array(array($redis, 'rawCommand'), $param); 
  10.  
  11.     print_r($ret); 
  12.  
  13. } catch (Exception $e){ 
  14.  
  15.     echo $e->getMessage(); 
  16.  
  17. } 

执行结果:只有海陀山,离我95.8884km

  1. Array 
  2.  
  3. ( 
  4.  
  5.     [0] => Array 
  6.  
  7.         ( 
  8.  
  9.             [0] => Hai_tuo 
  10.  
  11.             [1] => 95.8884 
  12.  
  13.             [2] => Array 
  14.  
  15.                 ( 
  16.  
  17.                     [0] => 115.79384654760360718 
  18.  
  19.                     [1] => 40.58445845049069334 
  20.  
  21.                 ) 
  22.  
  23.         ) 
  24.  
  25. ) 

5.以我的坐标为原点,按半径1500km取坐标(找出离我1500公里以内的山)

  1. try { 
  2.  
  3.     $redis = new Redis(); 
  4.  
  5.     $redis->connect('192.168.75.132', 6379); 
  6.  
  7.     $param = array('georadius', 'mountainCoordinates', '116.517159', '39.922267', '1500', 'km', 'WITHDIST', 'WITHCOORD'); 
  8.  
  9.     $ret = call_user_func_array(array($redis, 'rawCommand'), $param); 
  10.  
  11.     print_r($ret); 
  12.  
  13. } catch (Exception $e){ 
  14.  
  15.     echo $e->getMessage(); 
  16.  
  17. } 

执行结果:找出了5座山

  1. Array 
  2.  
  3. ( 
  4.  
  5.     [0] => Array 
  6.  
  7.         ( 
  8.  
  9.             [0] => Jiu_ding 
  10.  
  11.             [1] => 1464.4350 
  12.  
  13.             [2] => Array 
  14.  
  15.                 ( 
  16.  
  17.                     [0] => 103.90176326036453247 
  18.  
  19.                     [1] => 31.60486909089710394 
  20.  
  21.                 ) 
  22.  
  23.         ) 
  24.  
  25.     [1] => Array 
  26.  
  27.         ( 
  28.  
  29.             [0] => Ao_Shan 
  30.  
  31.             [1] => 1039.1217 
  32.  
  33.             [2] => Array 
  34.  
  35.                 ( 
  36.  
  37.                     [0] => 107.3980066180229187 
  38.  
  39.                     [1] => 34.05777705537607147 
  40.  
  41.                 ) 
  42.  
  43.         ) 
  44.  
  45.     [2] => Array 
  46.  
  47.         ( 
  48.  
  49.             [0] => Wu_gong 
  50.  
  51.             [1] => 1401.2353 
  52.  
  53.             [2] => Array 
  54.  
  55.                 ( 
  56.  
  57.                     [0] => 114.1738244891166687 
  58.  
  59.                     [1] => 27.47456377424472151 
  60.  
  61.                 ) 
  62.  
  63.         ) 
  64.  
  65.     [3] => Array 
  66.  
  67.         ( 
  68.  
  69.             [0] => Small_wutai 
  70.  
  71.             [1] => 124.6283 
  72.  
  73.             [2] => Array 
  74.  
  75.                 ( 
  76.  
  77.                     [0] => 115.05623370409011841 
  78.  
  79.                     [1] => 39.94893288365195616 
  80.  
  81.                 ) 
  82.  
  83.         ) 
  84.  
  85.     [4] => Array 
  86.  
  87.         ( 
  88.  
  89.             [0] => Hai_tuo 
  90.  
  91.             [1] => 95.8884 
  92.  
  93.             [2] => Array 
  94.  
  95.                 ( 
  96.  
  97.                     [0] => 115.79384654760360718 
  98.  
  99.                     [1] => 40.58445845049069334 
  100.  
  101.                 ) 
  102.  
  103.         ) 
  104.  
  105. ) 

6.以小五台山的坐标为原点,按半径1000km取坐标(找出离小五台山1000公里以内的山)

  1. try { 
  2.  
  3.     $redis = new Redis(); 
  4.  
  5.     $redis->connect('192.168.75.132', 6379); 
  6.  
  7.     $param = array('georadiusbymember', 'mountainCoordinates', 'Small_wutai', '1000', 'km', 'WITHDIST', 'WITHCOORD'); 
  8.  
  9.     $ret = call_user_func_array(array($redis, 'rawCommand'), $param); 
  10.  
  11.     print_r($ret); 
  12.  
  13. } catch (Exception $e){ 
  14.  
  15.     echo $e->getMessage(); 
  16.  
  17. } 

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

  1. Array 
  2.  
  3. ( 
  4.  
  5.     [0] => Array 
  6.  
  7.         ( 
  8.  
  9.             [0] => Small_wutai 
  10.  
  11.             [1] => 0.0000 
  12.  
  13.             [2] => Array 
  14.  
  15.                 ( 
  16.  
  17.                     [0] => 115.05623370409011841 
  18.  
  19.                     [1] => 39.94893288365195616 
  20.  
  21.                 ) 
  22.  
  23.         ) 
  24.  
  25.     [1] => Array 
  26.  
  27.         ( 
  28.  
  29.             [0] => Hai_tuo 
  30.  
  31.             [1] => 94.4219 
  32.  
  33.             [2] => Array 
  34.  
  35.                 ( 
  36.  
  37.                     [0] => 115.79384654760360718 
  38.  
  39.                     [1] => 40.58445845049069334 
  40.  
  41.                 ) 
  42.  
  43.         ) 
  44.  
  45.     [2] => Array 
  46.  
  47.         ( 
  48.  
  49.             [0] => Ao_Shan 
  50.  
  51.             [1] => 943.7873 
  52.  
  53.             [2] => Array 
  54.  
  55.                 ( 
  56.  
  57.                     [0] => 107.3980066180229187 
  58.  
  59.                     [1] => 34.05777705537607147 
  60.  
  61.                 ) 
  62.  
  63.         ) 
  64.  
  65. ) 

Tags: Redis GEO命令

分享到: