MongoDB LBS经纬度查询操作
今天需要对mongodb中的数据进行处理的时候发现有很多经纬度数据需要按照一定的范围进行分类,正好看到mongodb有一个对LBS进行处理的功能,特此进行填坑操作~!
初始化数据
- 首先我需要初始化数据,如图是一些北京公司地点坐标:
- mongodb中经纬度数据格式是这样的(经纬度字段的定义是以百度地图的格式为准),注意存储的时候要用
Double
类型:
- 再附上获取经纬度的网站:获取经纬度网站
LBS - $geoWithin
指定形状查询
- 创建地理空间索引(2D索引)
db.collection_name.ensureIndex({"location" : "2d"});
在指定形状查询中,$box
、$polygon
、$center
分别表示按矩形、五边形、圆形进行查询。
$box
查询矩形区域坐标点:
矩形左上起点是西直门地铁经纬度坐标,右下终点是大望路地铁站经纬度。
mongodb语句如下:
db.company.find({ "location" : { "$geoWithin" : {"$box":[[116.362078,39.945976],[116.482451,39.914176]]}}
})
对应java dao
代码如下:
// 矩形
double[] box1 = {116.362078,39.945976};
double[] box2 = {116.482451,39.914176};
Box shape = new Box(box1, box2);
Criteria criteria = Criteria.where("location").within(shape);List<com.qnloft.web.model.baidu.Result> mongoResults =mongoTemplate.find(query(criteria),com.qnloft.web.model.baidu.Result.class,"company");
$center
查询圆形区域坐标点:
圆心坐标点是大望路地铁站经纬度,半径为0.05
mongodb语句如下:
db.company.find({"location" : { "$geoWithin" : {"$center":[[116.482451,39.914176],0.05]}}
})
对应java dao
代码如下:
double radius = 0.05;
Circle circle = new Circle(new Point(116.482451,39.914176), radius);
Criteria criteria = Criteria.where("location").within(circle);
List<com.qnloft.web.model.baidu.Result> mongoResults =mongoTemplate.find(query(criteria),com.qnloft.web.model.baidu.Result.class,"company");
我怎么知道这里Criteria
需要传入哪些类呢?org.springframework.data.mongodb.core.query.GeoCommand
,getCommand
方法代码如下,一看便知:
LBS - $near
接近点查询
这个功能相当于微信附近的人功能。这里为什么不适用2d索引?因为2d索引不能使用经纬度查询,需要传入弧度。
- 创建地理空间索引(
2dsphere
索引)
db.company.ensureIndex({"location" : "2dsphere"});
以
望京东
地铁站经纬度为圆心,查询附近1000米
以内公司坐标
MongoDB语句如下:
db.company.find({"location": {"$near": {"$geometry": {type: "Point" ,coordinates: [116.493231,40.009379]},"$maxDistance": 1000}}
})
对应java dao
代码如下:
List<Double> coordinates = new ArrayList<>();
coordinates.add(116.493231);
coordinates.add(40.009379);
Bson nearBson = Filters.near("location" ,new Point(new Position(coordinates)),1000.0,0.0);List<com.qnloft.web.model.baidu.Result> list = new ArrayList<>();
mongoTemplate.getCollection("company").find(nearBson).forEach((Block<Document>) document -> {// 将结果转换成beancom.qnloft.web.model.baidu.Result geoResult = JSON.parseObject(document.toJson(), com.qnloft.web.model.baidu.Result.class);System.out.println(JSON.toJSONString(geoResult.getLocation()) + ",");
});
MongoDB LBS经纬度查询操作相关推荐
- MongoDB文档查询操作(三)
关于MongoDB中的查询,我们已经连着介绍了两篇文章了,本文我们来介绍另外一个查询概念游标. 本文是MongoDB系列的第七篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装Mong ...
- python数据库-mongoDB的高级查询操作(55)
一.MongoDB索引 为什么使用索引? 假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页.这就是目录索引,帮助读者快速找到想要的章节. ...
- MongoDB文档查询操作(一)
上篇文章我们主要介绍了MongoDB的修改操作,本文我们来看看查询操作. 本文是MongoDB系列的第五篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装MongoDB 2.Mongo ...
- MongoDB数据库(5.mongodb的聚合操作以及mongodb的高级查询2)
聚合aggregate 聚合(aggregate) 是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage) 组成的管道,可以对每个阶段的 管道进行分组.过滤等功能,然后经过一系列的处理, ...
- Java中mongodb指定DB通过aggregate聚合查询操作示例
目录 前言: 应用场景: 命令描述: 代码示例: 聚会查询: 数量查询: 前言: 大家都知道,mongodb是一个非关系型数据库,也就是说,mongodb数据库中的每张表是独立存在的,表与表之间没有 ...
- 用python向mongodb插入数据_Python操作MongoDB数据库(一)
Python操作MongoDB数据库(一) 前言 干货文章继续出发!隔的时间有些久了哈,对 MongoDB 安装回顾的同学,可以看下windows环境 <初识 MongoDB 数据库>.这 ...
- mongo执行逻辑表达式_MongoDB 常用查询操作
MongoDB 查询操作可实现大部分关系型数据库的常用查询操作,本文对 MongoDB 常用查询进行讲解. 在进行操作讲解前,先展示当前 MongoDB 中已存在的文档,集合名称article 条件大 ...
- as常用固定搭配_MongoDB 常用查询操作
MongoDB 查询操作可实现大部分关系型数据库的常用查询操作,本文对 MongoDB 常用查询进行讲解. 在阅读本文前,推荐先阅读<MongoDB 安装及文档的基本操作> 在进行操作讲解 ...
- mongo go 查询指定字段_Go语言 操作MongoDB数据库批量查询
数据操作是编程中避免不了的操作,这也就牵扯到了数据库的增删改查,而实际工作中我们最常用到的是增改查.今天要介绍的是Go 语言查询MongoDB数据库. 操作mongodb使用的包是"http ...
- MongoDB:mongodb在项目开发时的安全验证、分页查询操作
MongoDB:mongodb在项目开发时的安全验证.分页查询操作. 对于数据库而言,在项目应用中都需要安全验证,不然,就会报错,呵呵-- 现在贴出来我在项目中是怎么做的. 原创文章,转载请注明出处: ...
最新文章
- java软件设计模式只单例设计模式
- 远程访问mysql设置
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
- 一步步编写操作系统 27 处理器微架构之流水线简介
- Android Studio 3.0 下 Cordova 打包时 Gradle 兼容性问题解决
- 几个提升Go业务开发效率的流行框架和开源库
- QT连接MySQL记录
- 事务和异常易出现的错误
- Javascript:利用闭包实现高级排他
- matlab做神经网络的步骤,matlab建立神经网络模型
- 五十款阿里开源软件说明介绍
- 比较全面的OA系统需求分析
- Java整数的所有质因数,用JAVA将一个正整数分解成质因数,例如输入90,打印出90=2*3*3*5...
- 离散数学 06.04 子群及其陪集
- This account is currently not available 解决办法
- 【MySQL数据库设计与应用(四)】视图
- Python collections.Counter()用法
- 扑克牌游戏“快算24”算法
- vim 的操作说明:
- 全网最全的网络安全技术栈内容梳理(持续更新中)