Redis has added support for GEO (geographic location) since version 3.2, but the earth is not a perfect sphere, and the deviation may be 0.5% in the worst case. Areas close to the poles are not supported. The valid longitude of the supported coordinates is from -180 degrees to 180 degrees; the valid latitude is from -85.05112878 degrees to 85.05112878 degrees. If it exceeds the range, an error will be reported.

I like to climb mountains. When I was learning GEO, I also used the coordinates of mountains to demonstrate. My coordinates are:

116.517159,39.922267

I sorted out the coordinates of some mountains

$mountainCoordinates = array(
     array('115.793844', '40.584459', 'Hai_tuo'),//Coordinates of Mount Haituo
     array('115.056232', '39.948933', 'Small_wutai'),//Small Wutai Mountain coordinates
     array('114.173822', '27.474563', 'Wu_gong'),//Wugong Mountain coordinates
     array('111.341648', '25.518178', 'Leek_ridge'),//Leek Ridge coordinates
     array('103.901761', '31.60487', 'Jiu_ding'),//Jiuding Mountain coordinates
     array('107.398009', '34.057777', 'Ao_Shan'),//Aoshan coordinates
);

1. Add coordinates to the key of mountainCoordinates

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();
}

Results of the

int(1)
int(1)
int(1)
int(1)
int(1)
int(1)

2. Get coordinates

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();
}

Results of the

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. Calculate the distance between two coordinates

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();
}

Execution result: the distance between Mount Haituo and Mount Xiaowutai is 94.4219km

string(7) "94.4219"

4. Take my coordinates as the origin, and take the coordinates according to the radius of 100km (find the mountains within 100 kilometers from me)

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();
}

Execution result: only Haituo Mountain is 95.8884km away from me

Array
(
     [0] => Array
         (
             [0] => Hai_tuo
             [1] => 95.8884
             [2] => Array
                 (
                     [0] => 115.79384654760360718
                     [1] => 40.58445845049069334
                 )
         )
)

5. Take my coordinates as the origin, and take the coordinates according to the radius of 1500km (find the mountains within 1500 kilometers from me)

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();
}

Execution result: 5 mountains were found

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. Take the coordinates of Xiaowutai Mountain as the origin, and take the coordinates according to the radius of 1000km (find the mountains within 1000 kilometers from Xiaowutai Mountain)

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();
}

Execution result: Exclude Xiaowutai itself, findAoshan and Haituoshan

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
                 )
         )
)
Likes(0)

Comment list count 0 Comments

No Comments

WeChat Self-Service

WeChat Consult

TaoBao

support@elephdev.com

发表
评论
Go
Top