使用MongoDB的位置索引实现“附近的人”的计算
最近一直在忙工作和毕设,没什么时间写博客,真的非常不好意思,在写毕设的时候,有一个需求,就是找到地图上附近的点,我使用的是MongoDB存储我的信息,正好Mongo也有位置索引,也可以进行位置搜索,而且使用起来非常方便,这边记录一下。
- 语言:Java8
- 框架:Spring MVC、Spring、Mybatis
- 数据库:MongoDB 3.4.2
数据保存
你需要将坐标数据以特定的格式保存到MongoDB,我的数据源如下所示: 1
2
3
4
5
6{
"restaurantId" : "fd433baf3a7e4722bdd2c7a9c1a0f7c0",
"restaurantName" : "XX餐厅",
"belong" : 2,
"createTime" : "2017-04-26T09:24:43.266Z"
}
想要给他加上一个位置信息、官方文档上是这样写的:
1 | loc : [ <longitude> , <latitude> ] |
用这样两种方式都是可以的,记住,一定是lng在前,lat在后,之前写的时候就是因为顺序写反了,导致我一直算不出附近的点,非常气。 于是我的数据源就变成了如下
1 | { |
在MongoDB的客户端选择上,Spring Data的MongoTemplate非常方便,可以使用它对Mongo做一系列操作, 将数据源插入MongoDB以及对位置信息做索引的代码如下:
1 | //插入数据,我使用了Restaurant这个类作为Entity,其实什么数据都可以,关键就是要有正确格式的坐标数据 |
这样您保存的数据就已经做好了索引,我们可以多添加一些点。
数据查询
假设你有一个APP,你获取到了你当前的坐标,想要获取左边周围固定范围的点的集合,这时候可以使用MongoDB来做,因为在上面我们已经对position做了索引,所以可以使用mongoTemplate的NearQuery类进行附近的点的查询,查询的代码如下:
1 | //得到当前用户的坐标 |
让我们来看一下GeoResults内部的格式是怎么样的:
1 | { |
我们发现MongoTemplate为我们封装了很多有用的信息,包括averageDistance平均距离都有。这样我们就可以把附近的点的信息找到啦,是不是非常方便?
反馈与建议
- 微博:[@lzx2005](http://weibo.com/u/2557929062)
- 邮箱:crow2005@vip.qq.com