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
)
)
)
Post comment 取消回复