这里要连接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内)的更多相关文章

  1. Spring Boot 中应用Spring data mongdb

    摘要 本文主要简单介绍下如何在Spring Boot 项目中使用Spring data mongdb.没有深入探究,仅供入门参考. 文末有代码链接 准备 安装mongodb 需要连接mongodb,所 ...

  2. 判断一个IP地址是否是本局域网内地址

    //        /// <summary>        /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false,        /// </summa ...

  3. delphi 判断两个时间差是否在一个指定范围内

    WithinPastYears.WithinPastMonths.WithinPastWeeks.WithinPastDays ... 判断两个时间差是否在一个指定范围内DateUtils.Withi ...

  4. 判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

    <?php // *** 配置文件(表示区域的三维数组)其内的点,必须按顺时针方向依次给出! $area = array( // 天通苑店 0 => array( array('x'=&g ...

  5. iOS 如何判断一个点在某个指定区域中

    在iOS 开发中会遇到 判断位置的情况 iOS 自己都有函数实现的这些功能. 判断一个点是否在这个rect区域中 bool CGRectContainsPoint(CGRect rect,CGPoin ...

  6. Android判断一个点是否在矩形区域内

    个人遇到的问题判断按钮的点击事件还是滑动事件 private boolean button1Down = false; private boolean button2Down = false; pri ...

  7. 【spring data jpa】根据一个时间字段 查询 时间段的处理方法

    处理方法  包含结束时间00.00.00 Date createDate = boxCodeLog.getCreateDate(); if (createDate != null){ LocalDat ...

  8. JS 判断一个字符串是否包含在一个数组中

    var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...

  9. java实现判断一个经纬度坐标是否在一个多边形内(经自己亲测)

    1.在高德地图上绘制的多边形:经纬度逗号分隔格式:上面是用来方便存坐标的对象:下面是方法测试:直接复制代码即可运行 public class Point { private Double x; pri ...

随机推荐

  1. 十二省NOI“省选”联考模测(第二场)A抽卡大赛

    /* dp维护整体的概率, 每次相当于回退一格然后重新dp一格 */ #include<cstdio> #include<algorithm> #include<iost ...

  2. BZOJ2560串珠子

    /* 很清新的一道题(相比上一道题) g[S]表示该 S集合中胡乱连的所有方案数, f[S] 表示S集合的答案 那么F[S] 等于G[S]减去不合法的部分方案 不合法的方案就枚举合法的部分就好了 g[ ...

  3. Mysql存储过程(六)——存储过程中使用临时表

    Mysql 不支持数组.但有时候需要组合几张表的数据,在存储过程中,经过比较复杂的运算获取结果直接输出给调用方,比如符合条件的几张表的某些字段的组合计算. Mysql 临时表可以解决这个问题. 临时表 ...

  4. WPF 异步刷新页面,创建定时器

    #region 异步,刷新页面 /// <summary> /// 页面加载事件 /// </summary> /// <param name="sender& ...

  5. [python] 初学python,打卡签到

    自学python第一周,学了变量和简单的条件判断. 附上猜数游戏代码 #Author:shijt trueAge=40 count=0 while count<3: guessAge=int(i ...

  6. 关于oracle中varchar2与nvarchar2的一点认识

    今天在oracle 10g下测试了下varchar2与nvarchar2这两种类型,网上有很多关于这两种类型的区别的帖子,我还是自己测试了下. varchar2(size type),size最大为4 ...

  7. glob获取指定目录下的东西+更改工作目录

    一:不更改工作目录 import glob path = 'image/imgs/*.jpg' # 正则匹配 指定路径 file_path = glob.glob(path) # 即可获取所有jpg的 ...

  8. [UGUI]滑动列表优化(循环利用)

    需要注意的有下面几点: 1. 区分好表现上的index和逻辑上的index.表现上的index是指这个go是go列表中的第几项,但实际上这个index的意义并不大,因为在滚动的过程中go列表是轮转的: ...

  9. 转:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

    对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而 ...

  10. oracle数据库创建并导入dmp文件

    导出:exp userid=xcgwjxuser/xcgwjxuser@orcl file=D:\xcgwjx2014.dmp 导入:imp userid=xcgwjxuser/xcgwjxuser@ ...