基於 Redis 的 LBS 嘗試

13sai發表於2019-11-01

redis 3.2版本中增加的最大功能就是對GEO(地理位置)的支援,這對於O2O專案來說,又有了一項實現LBS應用的選擇。

基於Redis的LBS嘗試

命令 說明
1. GEOADD 將指定的地理空間位置(緯度、經度、名稱)新增到指定的key中
2. GEODIST 返回兩個給定位置之間的距離
3. GEOHASH 返回一個或多個位置元素的 Geohash 表示
4. GEOPOS 從key裡返回所有給定位置元素的位置(經度和緯度)
5. GEORADIUS 以給定的經緯度為中心, 找出某一半徑內的元素
6. GEORADIUSBYMEMBER 找出位於指定範圍內的元素,中心點是由給定的位置元素決定

我們來做個小demo:

先插入西湖區幾個景點的地理座標

$redis->rawCommand('geoadd', 'location', '120.118007', '30.259293', '桃園嶺');
$redis->rawCommand('geoadd', 'location', '120.119445','30.255082', '農耕科普園');
$redis->rawCommand('geoadd', 'location', '120.071655','30.272893', '西溪溼地');
$redis->rawCommand('geoadd', 'location', '120.114321','30.221218', '龍井村');
$redis->rawCommand('geoadd', 'location', '120.145012','30.205586', '白塔公園');
$redis->rawCommand('geoadd', 'location', '120.112912','30.224221', '十里琅璫');
$redis->rawCommand('geoadd', 'location', '120.107264','30.206997', '獅峰');
$redis->rawCommand('geoadd', 'location', '120.117936','30.227969', '真跡寺');
$redis->rawCommand('geoadd', 'location', '120.10826','30.246569', '靈隱寺');
$redis->rawCommand('geoadd', 'location', '120.114123','30.264152', '狀元峰');

我們獲取西溪溼地和龍井村的距離

$ret = $redis->rawCommand('GEODIST', 'location','西溪溼地', '龍井村', 'm');
print_r($ret);  //7060.0083
// 返回靈隱寺,狀元峰的位置
$ret = $redis->rawCommand('GEOPOS', 'location','靈隱寺', '狀元峰');
print_r($ret);
// 返回'120.114253','30.219759'座標附近1km的地址
$ret = $redis->rawCommand('GEORADIUS', 'location','120.114253','30.219759', 1, 'km', 'WITHDIST');
print_r($ret);
$ret = $redis->rawCommand('GEOHASH', 'location','龍井村', '靈隱寺');
print_r($ret);

返回值如下:

Array
(
    [0] => Array
        (
            [0] => 120.10826021432877
            [1] => 30.24656778547287
        )

    [1] => Array
        (
            [0] => 120.11412352323532
            [1] => 30.264151146155207
        )

)
Array
(
    [0] => Array
        (
            [0] => 龍井村
            [1] => 0.1624
        )

    [1] => Array
        (
            [0] => 十里琅璫
            [1] => 0.5128
        )

    [2] => Array
        (
            [0] => 五臺寺
            [1] => 0.9793
        )

)
Array
(
    [0] => wtm7vm8e6e0
    [1] => wtmkj4hpj20
)

操作比較簡單,就不一一說明了。

原文連結:redis地理位置(geo)

相關文章