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
 
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM