PHP按照自身距離查詢按照距離排序的位置點,以及從數據庫批量寫入redis-Geo數據當緩存

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)爲回調函數的的參數傳入。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章