这里要连接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. ~Vue实现简单答题功能,主要包含单选框和复选框

    内容 实现简单答题效果 环境 Vue,webpack(自行安装) 实现方式 页面将答题列表传递给调用组件,组件将结果返回给调用页面(其它模式也ok,这只是例子) ------------------- ...

  2. NUMA的取舍与优化设置

    在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%; 在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能. 安装numactl:      ...

  3. 再谈编码 decode和encode

    1. ascii. 有: 数字, 字母, 特殊字符. 8bit 1byte 128 最前面是0 2. gbk. 包含: ascii, 中文(主要), 日文, 韩文, 繁体文字. 16bit, 2byt ...

  4. CentOS7离线安装TIDB

    首先准备一台能够联网,并且操作系统版本与正式版本完全一致的服务器. 安装思路是,通过在线方式获得所有离线安装包,然后导入到正式安装环境中去. yum install -y --downloadonly ...

  5. spring boot js 文件引用 单引问题。

    首页 index.html 访问首页空白 . F12 控制台看页面元素布局.发现有两个body 标签 ,而且 </head> 标红. 各种检查....好像是没有问题. 但就是访问空白.去掉 ...

  6. scala函数和方法的差别

    想知道什么差别,把代码复制下来运行看结果 // 1 1 2 3 5 8 13 def f(x:Int) :Int= { ) ) else f(x-)+f(x-) } println(f()) // v ...

  7. <转载> FreeNAS的安装和简单配置 http://freenas.cn/?p=342

    前些日子在公司搭了一个模拟生产环境的平台.由于是测试环境,资源有限只能使用虚拟机实现,所以存储这块就想到了使用FreeNAS.很早以前玩儿过几次,当时是生产环境需要上存储设备,经过对比还是选择的更可靠 ...

  8. JavaScript进行简单的随即验证码生成(适合和我一样刚入门一本完整的教材书都没看完的弟弟)

    (感谢橙旭园给我打开了前端世界的大门) var checkcode = document.getElementById("code"); var btn = document.ge ...

  9. SpringMVC源码学习之request处理流程

    目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的. 建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理 ...

  10. Xpath选择、操作web元素

    11月6日 xpath选择 XPath(XML Path Language)是W3C(World Wide Web Consortium)定义的用来在XML文档中选择节点的语言, 主浏览器也支持XPa ...