利用Redis的GEO功能,實現位置查詢

2021-10-25 01:55:38 字數 2731 閱讀 1683

業務需求:專案中有需求要根據圖上繪製的路徑搜尋某半徑範圍內所有的裝置。
解決思路:利用高德地圖繪製的路線,可以取得路線上所有點位的經緯度。根據redis的geo功能,將所有裝置的經緯度寫入redis,然後根據點位經緯度和搜尋半徑,通過redis提供的方法即可查詢出在此範圍內的所有裝置。

1、redis geo提供了6個命令:

geoadd、geodist、geopos、geohash、georadius、georadiusbymember

(1)geoadd key longitude latitude member [longitude latitude member …]

將乙個包含經度、緯度、名稱的位置存放在key裡

(2)geodist key member1 member2 [unit]

計算key裡指定的兩個位置之間的距離,unit單位:m/km/mi/ft

(3)geopos key member [member …]

返回key裡指定位置的經緯度。返回值是乙個陣列, 陣列中的每個項都由兩個元素組成: 第乙個元素為給定位置元素的經度, 第二個元素則為給定位置元素的緯度。

(4)geohash key member [member …]

返回key裡指定位置的 geohash 表示。返回乙個陣列, 陣列的每個項都是乙個geohash表示式 。返回的geohash的位置與指定位置的位置一一對應。

(5)georadius key longitude latitude radius m/km/ft/mi [withcoord] [withdist] [withhash] [count count] [asc/desc]

以給定的經緯度為中心點,查詢指定半徑內,包含的所有位置元素。

withcoord:將位置元素的經度和維度一併返回。

withdist:位置元素與中心點之間的距離

withhash:返回位置的 geohash 表示式

count:返回指定條數,相當於mysql查詢的limit

asc/desc:根據中心的位置, 按照從近到遠或從遠到近的方式返回位置元素。

(6)georadiusbymember key member radius m/km/ft/mi [withcoord] [withdist] [withhash] [count count] [asc/desc]

和georadius命令操作相同,只是georadiusbymember的中心點是key裡的位置元素。

2、專案中的實現

(1)新增點位到redis

private

void

insertredis

(double lng,

double lat, string id)

(2)將乙個點位資訊刪除

private

void

deleteredis

(string id)

(3)根據頁面上繪製的路徑得到的點位經緯度查詢半徑範圍內的所有資料

private list

selectridespoint

(float lng,

float lat, integer radius));

}return cameramap;

}

附:關於地球經緯度之間間距計算

/**

* 根據經緯度和半徑計算經緯度範圍

* * @param raidus 單位公尺

* @return minlat, minlng, maxlat, maxlng

*/private map

getaround

(double lat,

double lon,

int raidus)

;

maparoundmap =

newhashmap

<

>()

; aroundmap.

put(

"minlng"

, minlng)

; aroundmap.

put(

"minlat"

, minlat)

; aroundmap.

put(

"maxlng"

, maxlng)

; aroundmap.

put(

"maxlat"

, maxlat)

;return aroundmap;

}/**

* 計算地球上任意兩點(經緯度)距離

* * @param long1 第一點經度

* @param lat1 第一點緯度

* @param long2 第二點經度

* @param lat2 第二點緯度

* @return 返回距離 單位:公尺

*/private

double

distancebylongnlat

(double long1,

double lat1,

double long2,

double lat2)

redis3 2新功能 GEO地理位置命令介紹

本文 發表於 2016 03 28 分類於 redis redis3.2發布rc版本已經有一段時間了,估計redisconf 2016左右,3.2版本就能release了。3.2版本中增加的最大功能就是對geo 地理位置 的支援。說起redis的geo特性,最大的貢獻還是咱們中國人。redis作者在...

redis3 2新功能 GEO地理位置命令介紹

redis3.2發布rc版本已經有一段時間了,估計redisconf 2016左右,3.2版本就能release了。3.2版本中增加的最大功能就是對geo 地理位置 的支援。說起redis的geo特性,最大的貢獻還是咱們中國人。redis作者在對3.2引進新特性的部落格中介紹了為什麼支援geo。ge...

Redis實現簽到功能

string型別資料bitcount使用方法 bitcount key start end start和end代表的是位元組位,乙個位元組 八個位元位,start和end上只能體現位元組,bitcount只能夠算出位元組的所有 1 資料的個數,bitcount key 能夠統計key中的所有 1 的...