1、用戶上傳自己的位置信息,服務器根據這個用戶的經緯度查詢出在指定範圍內的標記點按照距離排序返回給用戶。
可以用在社區團購選擇團長和外賣按照距離排序的餐館。
初始化
public function __construct(){
$this->redis = new \Redis();
$this->redis->connect('127.0.0.1',6379);
}
計算查詢
public function test(){
$arr = Request::instance()->post();
$latitude = $arr['latitude'];
$longitude = $arr['longitude'];
$redis = $this->redis;
try {
$param_a = array('areaCache');
$ret = call_user_func_array(array($redis, 'EXISTS'), $param_a);
if($ret){
$param = array('georadius', 'areaCache', $longitude, $latitude, 55000, 'm', 'WITHDIST', 'WITHCOORD','ASC');
$nearbyList = call_user_func_array(array($redis, 'rawCommand'), $param);
//半徑50000、單位m/km可選、距離顯示、排序規則
return getjson('1', '查找到排序:', $nearbyList);
}else{
return getjson('1', '沒有查詢到:','異常!' );
}
} catch (Exception $e){
}
}
2、當我們的數據庫中的位置標記點有數據更新時候,更新redis-geo緩存就可以,當系統剛開始的時候或者服務器重啓可以把服務器中的數據批量插入到redis-geo中。
$geoInfo = Db::connect('數據庫連接')->table('數據庫表area')->field('latitude,longitude,wxId,province,city,county,community')->where('status', '1')->select();
foreach ($geoInfo as $k => $v) {
$result = $redis->geoAdd(
"areaCache",
$v['longitude'], $v['latitude'], json_encode($v,320)
);
}
注:
方法:call_user_func_array( callable $callback , array $param_arr )
把第一個參數作爲回調函數(callback)調用,把參數數組作(param_arr)爲回調函數的的參數傳入。