利用MongoDB進行地理坐標查詢


BS的應用在生活中已經非常常見,我們打車,叫外賣,查個地圖之類的都會查詢附近的相關坐標位置,mongodb提供了原生的二維地圖查詢,極大地方便了大家的開發。

假定我們有一個定義了位置信息的集合location,給定a,b,c,d節點

db.location.find()
{ "_id" : "A", "position" : [ 0, 10 ] }
{ "_id" : "B", "position" : [ 10, 0 ] }
{ "_id" : "C", "position" : [ 20, 0 ] }
{ "_id" : "D", "position" : [ 0, 15 ] }

這四個點的位置如圖所示:  為location的position字段指定2d索引。

db.location.ensureIndex( {position: "2d"} )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

我們假定找出坐標點(0,0)附近半徑為10的所有坐標點:

db.location.find( {position: { $near: [0,0], $maxDistance: 10  } } )
{ "_id" : "A", "position" : [ 0, 10 ] }
{ "_id" : "B", "position" : [ 10, 0 ] }

其中$near表示中心坐標點,而$maxDistance表示最遠的路徑10.

再增加一個坐標點E(5,0),然后再次查詢

db.location.insert({_id:"E",position:[5,0]});
db.location.find( {position: { $near: [0,0], $maxDistance: 10  } } )
{ "_id" : "E", "position" : [ 5, 0 ] }
{ "_id" : "A", "position" : [ 0, 10 ] }
{ "_id" : "B", "position" : [ 10, 0 ] };

由查詢可見,mongodb會將數據按照離中心點的距離進行排序,約近的坐標點順序越靠前。

除此之外,使用$center函數也可以完成同樣的動作。

db.location.find({"position":{$geoWithin:{"$center":[[0,0],10]}}})
{ "_id" : "E", "position" : [ 5, 0 ] }
{ "_id" : "A", "position" : [ 0, 10 ] }
{ "_id" : "B", "position" : [ 10, 0 ] }

mongodb還支持選定空間(box)的查詢,查詢在某一個矩形范圍內的坐標點:

db.location.find({"position":{$geoWithin:{"$box":[[0,0],[15,15]]}}})
{ "_id" : "E", "position" : [ 5, 0 ] }
{ "_id" : "A", "position" : [ 0, 10 ] }
{ "_id" : "B", "position" : [ 10, 0 ] }
{ "_id" : "D", "position" : [ 0, 15 ] }

mongo在地理查詢上還支持多邊形($polygon)等操作,豐富的操作極大提升了地理信息系統的開發。結合redis的3.2版本可以制作出很豐富的地理信息應用了。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM