Spring Data MongDB空间索引(判断一个点Point是否在一个区域Polygon内)
这里要连接MongoDB数据库,在配置文件里:spring.data.mongodb.uri = mongodb://root:root@localhost:27017/happy
两个root分别是用户名和密码,happy是数据库名。
首先创建一个实体类SiteExt.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.CompoundIndexes;
import org.springframework.data.mongodb.core.mapping.Document; @Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "SiteExt")
@CompoundIndexes({
@CompoundIndex(name = "location_index", def = "{'location': '2dsphere'}"),
})
public class SiteExt {
@Id
private String plateNo; private GeoJsonPoint location;
}
注意这里使用了2dsphere索引
{'location': '2dsphere'}
测试用的就不再规范地写接口了,只写个实现类了。
SiteExtDao.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPolygon;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import xy.study.mongdb.model.SiteExt; import java.util.List; @Repository
public class SiteExtDao { @Autowired
private MongoTemplate mongoTemplate; public List<SiteExt> findPointInPolygon(GeoJsonPolygon geoJsonPolygon, String collectionName) {
Query query = new Query(Criteria.where("location").within(geoJsonPolygon));
List<SiteExt> list = mongoTemplate.find(query, SiteExt.class,collectionName);
return list;
} public void insert(SiteExt siteExt, String collectionName) {
mongoTemplate.insert(siteExt,collectionName);
} public void insertBatch(List<SiteExt> list, String collectionName) { // BulkMode.UNORDERED:表示并行处理,遇到错误时能继续执行不影响其他操作;BulkMode.ORDERED:表示顺序执行,遇到错误时会停止所有执行
BulkOperations ops = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
ops.insert(list); // 执行操作
ops.execute();
} public List<SiteExt> findAll(String collectionName) {
Query query=new Query();
List<SiteExt> list = mongoTemplate.find(query, SiteExt.class,collectionName);
return list;
}
}
注意这里创建查询条件这里:Query query = new Query(Criteria.where("location").within(geoJsonPolygon));
location是实体类SiteExt中建立了2dsphere索引的字段名,再调用within方法,传入区域对象GeoJsonPloygon。
GeoJsonPlaygon代表的是一个区域对象,这个类在org.springframework.data.mongodb.core.geo包下面。
先插入两条数据做测试:
@Autowired
private SiteExtDao siteExtDao;
GeoJsonPoint geoJsonPoint1 = new GeoJsonPoint(new Point(113.330908,23.155678));
SiteExt siteExt1 = new SiteExt("A",geoJsonPoint1);
GeoJsonPoint geoJsonPoint2 = new GeoJsonPoint(new Point(113.33831,23.137335));
SiteExt siteExt2 = new SiteExt("B",geoJsonPoint2);
siteExtDao.insert(siteExt1,"SiteExt");
siteExtDao.insert(siteExt2,"SiteExt");
然后查询哪些点在指定区域的操作来了:
Point p1 = new Point(113.314882,23.163055);
Point p2 = new Point(113.355845,23.167042);
Point p3 = new Point(113.370289,23.149564);
Point p4 = new Point(113.356779,23.129758);
Point p5 = new Point(113.338238,23.13913);
Point p6 = new Point(113.330979,23.124706);
Point p7 = new Point(113.313588,23.140858);
Point p8 = new Point(113.323865,23.158204);
Point p9 = new Point(113.314882,23.163055); List<Point> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
list.add(p8);
list.add(p9); //用9个点围成一个区域,首尾两个点p1和p9要相同,才能构成一个区域
GeoJsonPolygon geoJsonPolygon = new GeoJsonPolygon(list);
//传入区域和数据库表名
List<SiteExt> pointInPolygon = siteExtDao.findPointInPolygon(geoJsonPolygon,"SiteExt");
pointInPolygon.forEach(
p -> {
System.out.println(p.getLocation());
}
);
上面9个点围成了一个多边形,在"SiteExt"表中查询哪些记录在这个多边形区域中。
结果如下:
Point [x=113.330908, y=23.155678] 总结:就是建立2dsphere索引,利用查询语句Query query = new Query(Criteria.where("location").within(geoJsonPolygon))查询符合该区域的所有点;
MongoDB原生查询数据表中哪些点记录在指定的区域:https://www.jb51.net/article/105796.htm
Spring Data MongDB空间索引(判断一个点Point是否在一个区域Polygon内)的更多相关文章
- Spring Boot 中应用Spring data mongdb
摘要 本文主要简单介绍下如何在Spring Boot 项目中使用Spring data mongdb.没有深入探究,仅供入门参考. 文末有代码链接 准备 安装mongodb 需要连接mongodb,所 ...
- 判断一个IP地址是否是本局域网内地址
// /// <summary> /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false, /// </summa ...
- delphi 判断两个时间差是否在一个指定范围内
WithinPastYears.WithinPastMonths.WithinPastWeeks.WithinPastDays ... 判断两个时间差是否在一个指定范围内DateUtils.Withi ...
- 判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)
<?php // *** 配置文件(表示区域的三维数组)其内的点,必须按顺时针方向依次给出! $area = array( // 天通苑店 0 => array( array('x'=&g ...
- iOS 如何判断一个点在某个指定区域中
在iOS 开发中会遇到 判断位置的情况 iOS 自己都有函数实现的这些功能. 判断一个点是否在这个rect区域中 bool CGRectContainsPoint(CGRect rect,CGPoin ...
- Android判断一个点是否在矩形区域内
个人遇到的问题判断按钮的点击事件还是滑动事件 private boolean button1Down = false; private boolean button2Down = false; pri ...
- 【spring data jpa】根据一个时间字段 查询 时间段的处理方法
处理方法 包含结束时间00.00.00 Date createDate = boxCodeLog.getCreateDate(); if (createDate != null){ LocalDat ...
- JS 判断一个字符串是否包含在一个数组中
var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...
- java实现判断一个经纬度坐标是否在一个多边形内(经自己亲测)
1.在高德地图上绘制的多边形:经纬度逗号分隔格式:上面是用来方便存坐标的对象:下面是方法测试:直接复制代码即可运行 public class Point { private Double x; pri ...
随机推荐
- h5登录页面
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- es6(8)--对象
//对象 { //简洁表示法 let o = 1; let k = 2; let es5 = { o:o, k:k }; let es6 = { o, k }; console.log(es5); c ...
- 零基础学习python_字符串(14-15课)
今天回顾下我之前学习python的第一个对象——字符串,这个对象真蛋疼,因为方法是最多的,也是最常见的类型,没有之一... 内容有点多,我就搜了下网上的资料,转载下这个看起来还不错的网址吧:http: ...
- 三种常见的Web安全问题
XSS漏洞 1.XSS简介 跨站脚本(cross site script)简称为XSS,是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式. XSS是指恶意攻击者利用网站没有对 ...
- 【Git+Docker】Docker初期学习认识和安装配置详解
Docker: 特性: 1.以应用为中心 2.自动化构建 3.版本控制 4.组件重用 5.镜像共享 6.工具生态系统 具体后续学习 优势: 1.文件系统隔离 2.进程隔离 3.网络隔离 4.资源隔离和 ...
- IDEA搭建Spring框架环境
一.spring 框架概念 spring 是众多开源 java 项目中的一员,基于分层的 javaEE 应用一站式轻量 级开源框架,主要核心是 Ioc(控制反转/依赖注入) 与 Aop(面向切面) ...
- gentoo openrc 开机打印信息
gentoo openrc 开机的时候,最开始 一些硬件的信息, 后面是一些内核和驱动的信息. 硬件的信息是默认保存到 /var/log/dmesg 中, 可以使用 dmesg | less 来查看硬 ...
- 42.scrapy爬取数据入库mongodb
scrapy爬虫采集数据存入mongodb采集效果如图: 1.首先开启服务切换到mongodb的bin目录下 命令:mongod --dbpath e:\data\db 另开黑窗口 命令:mongo. ...
- 数电——全减器分析(用74HC138设计提示)
-1=1(即Di=1). Di=(Y1' * Y2' * Y4' * Y7')'可以得到74HC138来表示,(注意:Ai,Bi,Ci-1的各自位权对应A2,A1,A0) Ci同理可得.
- sqlserver中 事物 索引及视图
事务 1.什么是事务 事务是一个不可分割的工作逻辑单元,它包含了一组数据库的操作命令,并且所有命令作为一个整体一起向系统提交或撤销操作请求,即要么都执行,要么都不执行 2.事务的4个属性 (1). ...