利用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 ] }

这四个点的位置如图所示:

 

locationposition字段指定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)等操作,丰富的操作极大提升了地理信息系统的开发。结合redis3.2版本可以制作出很丰富的地理信息应用了。 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值