mongodb-mongotemplate进行地理坐标操作
因为项目中使用的springboot + mongotemplate, 所以还是需要mongotemplate的操作方式
首先建立一个bean:
package com.iwhere.easy.travel.entity; import java.io.Serializable;
import java.util.Arrays; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document; /**
* 收费poi
*
* @author wenbronk
* @time 2017年7月19日 下午4:46:39
*/ @Document(collection = "charge_poi")
public class ChargePoi implements Serializable {
private static final long serialVersionUID = 2653147280472201924L; @Id
private String _id; @Indexed
private String poi_id;
private String poi_name;
@GeoSpatialIndexed
private Double[] location;
private String media_url;
private Double price; public ChargePoi() {
super();
} @PersistenceConstructor
ChargePoi(String _id, String poi_id, String poi_name, Double[] location, String media_url, Double price) {
super();
this._id = _id;
this.poi_id = poi_id;
this.poi_name = poi_name;
this.location = location;
this.media_url = media_url;
this.price = price;
} public ChargePoi(String _id, String poi_id, String poi_name, Double x, Double y, String media_url, Double price) {
super();
this._id = _id;
this.poi_id = poi_id;
this.poi_name = poi_name;
this.location = new Double[]{x, y};
this.media_url = media_url;
this.price = price;
} public String get_id() {
return _id;
} public void set_id(String _id) {
this._id = _id;
} public String getPoi_id() {
return poi_id;
} public void setPoi_id(String poi_id) {
this.poi_id = poi_id;
} public String getPoi_name() {
return poi_name;
} public void setPoi_name(String poi_name) {
this.poi_name = poi_name;
} public Double[] getLocation() {
return location;
} public void setLocation(Double[] location) {
this.location = location;
} public String getMedia_url() {
return media_url;
} public void setMedia_url(String media_url) {
this.media_url = media_url;
} public Double getPrice() {
return price;
} public void setPrice(Double price) {
this.price = price;
} @Override
public String toString() {
return "ChargePoi [_id=" + _id + ", poi_id=" + poi_id + ", poi_name=" + poi_name + ", location="
+ Arrays.toString(location) + ", media_url=" + media_url + ", price=" + price + "]";
}
}
注:
@GeoSpatialIndexed 注解的作用:
Mark a field to be indexed using MongoDB's geospatial indexing feature.
开始没有加这个注解, 然后计算距离的时候就会报错
1, 准备测试数据:
/**
* save
*/
@Test
public void test1() {
for (int x = ; x < ; x++) {
for (int y = ; y < ; y++) {
Double loca[] = new Double[]{Double.valueOf(x), Double.valueOf(y)};
ChargePoi chargePoi = new ChargePoi();
chargePoi.setPoi_id("poiid" + x);
chargePoi.setMedia_url("http://www.baidu.com?params=" + x);
chargePoi.setPoi_name("vini" + Arrays.toString(loca));
chargePoi.setPrice(Math.random() * );
chargePoi.setLocation(loca);
mongoTemplate.insert(chargePoi);
}
}
}
2, 圆形查询
/**
* circle
*/
@Test
public void test2() {
Circle circle = new Circle(, , );
List<ChargePoi> find = mongoTemplate.find(new Query(Criteria.where("location").within(circle)), ChargePoi.class);
System.out.println(find);
System.out.println(find.size());
}
3, 球星查询
/**
* spherical
*/
@Test
public void test3() {
Circle circle = new Circle(,, );
List<ChargePoi> find = mongoTemplate.find(new Query(Criteria.where("location").withinSphere(circle)), ChargePoi.class);
System.out.println(find.size());
System.out.println(find);
}
4, 矩形查询, box
/**
* box
*/
@Test
public void test4() {
Box box = new Box(new Point(, ), new Point(, ));
List<ChargePoi> find =
mongoTemplate.find(new Query(Criteria.where("location").within(box)), ChargePoi.class);
System.out.println(find.size());
System.out.println(find);
}
5, 按距离由近到元查询
/**
* near
*/
@Test
public void test5() {
Point point = new Point(, );
List<ChargePoi> venues =
mongoTemplate.find(new Query(Criteria.where("location").near(point).maxDistance()), ChargePoi.class);
System.out.println(venues.size());
System.out.println(venues);
}
6, 空间距离查询
/**
* nearSphere
*/
@Test
public void test6() {
Point point = new Point(, );
List<ChargePoi> venues =
mongoTemplate.find(new Query(Criteria.where("location").nearSphere(point).maxDistance()), ChargePoi.class);
System.out.println(venues.size());
System.out.println(venues);
}
7, 最近点查询
@Test
public void test7() {
Point location = new Point(, );
NearQuery query = NearQuery.near(location).maxDistance(new Distance(, Metrics.KILOMETERS));
GeoResults<ChargePoi> result = mongoTemplate.geoNear(query, ChargePoi.class);
System.out.println(result);
}
我是勤劳的搬运工:->http://docs.spring.io/spring-data/data-mongo/docs/1.5.2.RELEASE/reference/html/mongo.core.html#mongo.geospatial
mongodb-mongotemplate进行地理坐标操作的更多相关文章
- Node.js 中MongoDB的基本接口操作
Node.js 中MongoDB的基本接口操作 连接数据库 安装mongodb模块 导入mongodb模块 调用connect方法 文档的增删改查操作 插入文档 方法: db.collection(& ...
- MongoDB之三(高级操作 聚合、游标)
一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...
- mysql数据库和mongodb数据库的相关操作以及两个数据库的区别
在docs命令中执行数据操作 MySQL数据库 先启动MySQL服务器 net start mysql 进入MySQL服务器MySQL -uroot -p(这里写你的数据库密码) (-P是从哪个端口 ...
- 数据库【mongodb篇】练习操作
本文的目标是通过大量的示例,来更好的理解如果在Mongodb中进行数据操作: 初入客户端刚利用 mongod命令进入客户端环境,此时对数据库一无所知: 举目四望,想知道现在有哪些数据库, show ...
- MongoDB入门 和nodejs操作
简介 MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshel ...
- 第一篇:一天学会MongoDB数据库之Python操作
本文仅仅学习使用,转自:https://www.cnblogs.com/suoning/p/6759367.html#3682005 里面新增了如果用用Python代码进行增删改查 什么是MongoD ...
- mongodb常用语句(集合操作)
mongodb常用语句(集合操作) 查看集合帮助 db.songs.help(); 查看集合总数据量 db.songs.count(); 查看表空间大小 db.songs.dataSize(); 查看 ...
- MongoDB API和python操作
安装 下载mongodb的版本,两点注意 根据业界规则,偶数为稳定版,如1.6.X,奇数为开发版,如1.7.X 32bit的mongodb最大只能存放2G的数据,64bit就没有限制 到官网,选择合适 ...
- python数据库-mongoDB的高级查询操作(55)
一.MongoDB索引 为什么使用索引? 假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页.这就是目录索引,帮助读者快速找到想要的章节. ...
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
随机推荐
- VS2010编译错误:是否忘记了向源中添加“#include "stdafx.h
VS2010编译错误:是否忘记了向源中添加“#include "stdafx.h 编译提示:fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“# ...
- POJ1269求两个直线的关系平行,重合,相交
依旧是叉积的应用 判定重合:也就是判断给定的点是否共线的问题——叉积为0 if(!cross(p1,p2,p3) && !cross(p1,p2,p4))printf("LI ...
- DFS剪枝处理HDU1010
http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意很好理解,不是最短路,而是dfs,虽然地图不算大,稍微注意一点的dfs也能险过,但是700+ms和78 ...
- Android 体系架构
什么是Android? 答:Android就是移动设备的软件栈,包括(一个完整的操作系统,中间件,关键应用程序), 底层是Linux内核,包括(安全管理, 内存管理,进程管理 ,电源管理,硬件驱动-) ...
- ASP.NET MVC学习之模型验证详解
ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...
- HTTP响应状态码说明
当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(Server Header)用以响应浏览器的请求. HTTP状态码共分为五种类型: 1**:信息,服务器接收到请求,需 ...
- .net core AOP之Filter
当我们进行项目开发时,往往在开发过程中需要临时加入一些常用功能性代码,如身份验证.日志记录.异常获取等功能.如果每个方法中都加入这些功能性代码的话,无疑使项目显得过于臃肿,代码繁杂.这时候就要加入过滤 ...
- STM32F4时钟配置库函数详解
在STM32中,所有的应用都是基于时钟,所以时钟的配置就尤为重要了,而不能仅仅只知道使用默认时钟. STM32F4的时钟树如上图所示,HSE为外部接入的一个8M的时钟,然后再给PLL提供输入时钟,经过 ...
- 978. Longest Turbulent Subarray
A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if: For i <= k < j ...
- 使用Navicat 创建mysql存储过程,实现日期加流水号序列
目的:使用Navicat 创建mysql存储过程,实现格式为8位日期(年月日)+5位流水号序列. 步骤: 1.打开Navicat 登录数据库,点击导航栏上的函数,如下图: 2.点击新建函数,选择“过程 ...