利用MongoDB进行地理坐标查询

摘要:
BS的应用在我们的日常生活中非常普遍。我们打车、叫外卖、查地图等等,我们会查询附近的相关坐标。Mongodb提供了一个原生的二维地图查询,这大大方便了我们的开发。db.location.EnsureIndex{“createdCollectionAutomatically”:false,“numIndexesBefore”:1,“numIndex After”:2,“ok”:1}假设我们在坐标点(0,0)附近找到半径为10的所有坐标点:db.locationFind{“_id”:“A”,“position”:[0,10]}{”_id“:”B“,”position“:[10,0]}其中$near表示中心坐标点,$maxDistance表示最远路径10。添加坐标点E(5,0),然后再次查询db.location.insert;db.location.find{“_id”:“E”,“位置”:[5,0]}{”_id“:”A“,”位置“:[0,10]}{”id“:”B“,”position“:[10,0]};从查询中可以看出,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版本可以制作出很丰富的地理信息应用了。 

免责声明:文章转载自《利用MongoDB进行地理坐标查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MiniJson解释Json字符串vue项目安装vconsole的时候出现的bug下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MongoDB批量更新和批量插入的方式

最近,在调试代码中发现向MongoDB插入或者更新文档记录时若是多条的话都是采用for循环操作的,这样的处理方式会造成数据操作耗时,不符合批量处理的原则;对此,个人整理了一下有关MongoDB的批量更新和批量插入的操作流程,如下所示: @Autowired privateMongoTemplate mongoTemplate; (1)批量插入示例如下: L...

(02)mongodb 数据库与collection的基本操作

1、查询数据库。 show dbs;或者show databases; 2、创建数据库,必须创建collection,如果只有use shop; 不会创建数据库。 use shop; db.createCollection('goods'); 3、删除数据库。 use shop; db.dropDatabase(); 4、查询collection,先用us...

[Mongo] 解决mongoose不支持条件操作符 $gt$gte:$lte$ne $in $all $not

reference : http://blog.sina.com.cn/s/blog_4df23d840100u25x.html 找到mongoose的安装目录 /usr/local/lib/node/mongoose/lib/mongoose/schema 下的文件:string.js 修改SchemaString.prototype.$conditio...

给MongoDB添加索引

用过数据库的都知道,数据库索引与书籍的索引类似,都是用来帮助快速查找的。   MongoDB的索引跟关系型数据库的索引几乎一致。       1. 索引的创建   mongodb采用ensureIndex来创建索引,如:   db.user.ensureIndex({"name":1})   表示在user集合的name键创建一个索引,这里的1表示索引创建...

【MongoDB】关于Mongodb的学习与总结

 直接去看mongodb官网的文档学习是最快捷的途径。链接如下:https://docs.mongodb.com/manual/tutorial/getting-started/ 一、基础概念 Mongodb是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中应用功能最丰富的,最像关系数据库的数据库。它支持的数据结构非常松散,是类似json的bj...

Nginx配置端口访问的网站

server { listen 80; #listen [::]:80 default_server ipv6only=on; server_name www.website.com; index index.html index.htm index.php admin.php;...