mongodb地理位置索引實現原理

2021-08-26 13:29:30 字數 797 閱讀 5227

地理位置索引支援是mongodb的一大亮點,這也是全球最流行的lbs服務foursquare 選擇mongodb的原因之一。我們知道,通常的資料庫索引結構是b+ tree,如何將地理位置轉化為可建立b+tree的形式,下文將為你描述。

首先假設我們將需要索引的整個地圖分成16×16的方格,如下圖(左下角為座標0,0 右上角為座標16,16):

單純的[x,y]的資料是無法建立索引的,所以mongodb在建立索引的時候,會根據相應欄位的座標計算乙個可以用來做索引的hash值,這個值叫做geohash,下面我們以地圖上座標為[4,6]的點(圖中紅叉位置)為例。

我們第一步將整個地圖分成等大小的四塊,如下圖:

劃分成四塊後我們可以定義這四塊的值,如下(左下為00,左上為01,右下為10,右上為11):

0111

0010

這樣[4,6]點的geohash值目前為 00

然後再將四個小塊每一塊進行切割,如下:

這時[4,6]點位於右上區域,右上的值為11,這樣[4,6]點的geohash值變為:0011

繼續往下做兩次切分:

最終得到[4,6]點的geohash值為:00110100

這樣我們用這個值來做索引,則地圖上點相近的點就可以轉化成有相同字首的geohash值了。

我們可以看到,這個geohash值的精確度是與劃分地圖的次數成正比的,上例對地圖劃分了四次。而mongodb預設是進行26次劃分,這個值在建立索引時是可控的。具體建立二維地理位置索引的命令如下:

db.map.ensureindex(, )

其中的bits引數就是劃分幾次,預設為26次。

MongoDB 地理位置索引的實現原理

地理位置索引支援是mongodb的一大亮點,這也是全球最流行的lbs服務foursquare 選擇mongodb的原因之一。我們知道,通常的資料庫索引結構是b tree,如何將地理位置轉化為可建立b tree的形式,下文將為你描述。首先假設我們將需要索引的整個地圖分成16 16的方格,如下圖 左下角...

洋山港 地理位置

洋山港區位於浙江省嵊泗縣境內。由大洋山港口區和小洋山港口區組成。可供開發的深水岸線4900公尺,是上海國際航運中心的深水港區。位於嵊泗海域西部大洋山島的北岸。東北距縣城21.41海浬,西北距上海市蘆潮港18.9海浬。大洋山島海岸線總長16697公尺 其中基岩10214公尺 可利用岸線3200公尺,聖...

geospatial地理位置

redis的geo在redis3.2版本就退出來了推算地理位置資訊,兩地之間的距離 可以查詢一些測試資料 引數 key 緯度,經度 名稱 127.0.0.1 6379 geoadd china city 116.397128 39.916527 beijin integer 1127.0.0.1 6...