redis輕鬆處理經緯度座標點資料的實現方法

2022-09-21 01:18:08 字數 3925 閱讀 7063

目錄

redis 3.2 之後,支援地理座標資料的管理。將給定的座標元素(緯度、經度、名字)新增到指定的鍵裡面。 這些資料就會以有序集合的形式被儲, 可以通過georadius 計算兩個座標點的距離,或者使用georadius 和 georadiusbymember查詢某個座標半徑內的資料。下面對其中常用的命令進行乙個簡單的介紹。

將座標資訊新增到指定的鍵裡面。

geoadd key longitude latitude member [longitude latitude member ...]

longitude:座標點經度,有效值[ -180,180 ]

latitude:座標點緯度,有效值[www.cppcns.com -85.05112878, 85.05112878 ]

示例:127.0.0.1:6379> geoadd parks 116.300892 40.009462 yuanmingyuan

(integer) 1

127.0.0.1:6379> geoadd parks 116.188797 39.990132 xiangshan 116.255916 40.030233 baiwangshan

(integer) 2

127.0.0.1:6379> geoadd parks 110 89.9 nanji

(error) err invalid longitude,latitude pair 110.000000,89.900000

可以看到,geoadd 支援一次新增乙個或多個地點,每個地點需要包含精度維度和名稱,當嘗試新增合法經緯度外的座標(維度為89.9的nanji) 時, 會報錯。

geopos命令根據地點的名稱返回對應的經緯度。集合中不存在時,返回資料為空

示例:127.0.0.1:6379> geopos parks xiangshan baiwangshan nanji

1) 1) "116.18879646062850952"

2) "39.99013224137585354"

2) 1) "116.2559160590171814"

2) "40.03023406483775659"

3) (nil)

geodist 返回兩個給定位置之間的距離。如果兩個位置之間的其中乙個不存在, 那麼命令返回空值。

geodist key member1 member2 [unit]

合法的unit值

unit:

m(預設值)

kmmi

ft說明:公尺千公尺

英里英呎

示例:127.0.0.1:6379> geodist parks xiangshan baiwangshan

"7251.9492"

127.0.0.1:6379> geodist parks xiangshan baiwangshan km

"7.2519"

127.0.0.1:6379> geodist parks xiangshan nanji km

(nil)

以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。

georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count] [asc|desc] [store key] [storedist key]

經緯度和單位引數與前面命令保持一致。 其他可選引數說明

示例:返回額外資訊

127.0.0.1:6379> georadius parks 116.29248 40.048107 20 km

1) "xiangshan"

2) "baiwangshan"

3) "yuanmingyuan"

127.0.0.1:6379> georadius parks 116.29248 40.048107 20 km withcoord withdist withhash

1) 1) "xiangshan"

2) "10.9353"

3) (integer) 4069878528493207

4) 1) "116.18879646062850952"

2) "39.99013224137585354"

2) 1) "baiwangshan"

2) "3.6941"

3) (integer) 4069880373231506

4) 1) "116.2559160590171814"

2) "40.03023406483775659"

3) 1) "yuanmingyuan"

2) "4.3576"

3) (integer) 4069880708898691

hlwlqddbq4) 1) "116.30089133977890015"

2) "40.00946202493697257"

指定資料條數和排序

127.0.0.1:6379> georadius parks 116.29248 40.048107 20 km withdist asc

1) 1) "baiwangshan"

2) "3.6941"

2) 1) "yuanmingyuan"

2) "4.3576"

3) 1) "xiangshan"

2) "10.9353"

127.0.0.1:6379> georadius parks 116.29248 40.048107 20 km withdist desc

1) 1) "xiangshan"

2) "10.9353"

2) 1) "yuanmingyuan"

2) "4.3576"

3) 1) "baiwangshan"

2) "3.6941"

127.0.0.1:6379> georadius parks 116.29248 40.048107 20 km withdist asc count 2

1) 1) "baiwangshan"

2) "3.6941"

2) 1) "yuanmingyuan"

2) "4.3576"

將結果儲存到新的zset, hash值或者距離

127.0.0.1:6379> georadius parks 116.29248 40.048107 20 km asc count 2 store store_20km

(integer) 2

127.0.0.1:6379> georadius parks 116.29248 40.048107 20 km asc count 2 storedist storedist_20km

(integer) 2

127.0.0.1:6379> zrange store_20km 0 -1 withscores

1) "baiwangshan"

2) "4069880373231506"

3) "yuanmingyuan"

4) "4069880708898691"

127.0.0.1:6379> zrange storedist_20km 0 -1 withscores

1) "baiwangshan"

2) "3.6941190849982757"

3) "yuanmingyuan"

4) "4.3576262236174665"

這個命令和 georadius 命令一樣, 都可以找出位於指定範圍內的元素, 但是georadiusbymember的中心點是由給定的位置元素決定的, 而不是像georadius 那樣, 使用輸入的經度和緯度來決定中心點。

示例:georadiusbymember parks yuanmingyuan 5 km asc

1) "yuanmingyuan"www.cppcns.com

2) "baiwangshan"

查詢圓明園5公里內的公園

經緯度座標轉換

經緯度與xy座標轉換工具類 public class latlngxyzconverthelper xy轉經緯度 需要轉換的x座標 需要轉換的y座標 地圖級別 轉換後的經度 轉換後的緯度 public static void tiletolatlng double tile x,double til...

經緯度座標系轉東北天 經緯度座標系轉換

網際網路地圖的座標系現狀 地球座標 wgs84 國際標準,從 gps 裝置中取出的資料的座標系 國際地圖提供商使用的座標系 火星座標 gcj 02 也叫國測局座標系 中國標準,從國行移動裝置中定位獲取的座標資料使用這個座標系 國家規定 國內出版的各種地圖系統 包括電子形式 必須至少採用gcj 02對...

arcgis 經緯度轉大地座標 大地經緯度轉UTM

在日常gnss應用中,常需要應用到utm座標,而python提供了較為完備座標轉換工具,無需再去用arcgis了。首先貼出幾個帖子,值得一讀,其次,說一下要用到的工具,pyproj,其源於proj4庫 安裝 pip install pyproj 呼叫 import pyproj 再者,庫函式使用,先...