日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引

發(fā)布時(shí)間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

MongoDB的3.x版本Java驅(qū)動(dòng)相對(duì)2.x做了全新的設(shè)計(jì),類(lèi)庫(kù)和使用方法上有很大區(qū)別。例如用Document替換BasicDBObject、通過(guò)Builders類(lèi)構(gòu)建Bson替代直接輸入$命令等,本文整理了基于3.2版本的常用增刪改查操作的使用方法。為了避免冗長(zhǎng)的篇幅,分為增刪改、查詢、聚合、地理索引等幾部分。

隨著移動(dòng)設(shè)備的普及,基于坐標(biāo)和經(jīng)緯度的位置查詢變得越來(lái)越流行,例如查找離當(dāng)前位置最近的N輛出租車(chē)。Mongodb專(zhuān)門(mén)針對(duì)這種查詢建立了地理空間索引:2d和2dsphere索引。2d用于平面基于坐標(biāo)的位置計(jì)算,2dsphere主要用于球體,比如地球,提供了基于弧度的位置計(jì)算。

import static com.mongodb.client.model.Indexes.geo2d; import static com.mongodb.client.model.Indexes.geo2dsphere;import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.List;import org.bson.Document;import com.mongodb.Block; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.geojson.LineString; import com.mongodb.client.model.geojson.Point; import com.mongodb.client.model.geojson.Polygon; import com.mongodb.client.model.geojson.Position;public class GeospatialExamples {public static void main(String[] args) throws ParseException {MongoClient mongoClient = new MongoClient("localhost", 27017);MongoDatabase database = mongoClient.getDatabase("lesson");GeospatialExamples client = new GeospatialExamples(database);client.show();mongoClient.close();}private MongoDatabase database;public GeospatialExamples(MongoDatabase database) {this.database = database;}public void show() {MongoCollection<Document> mc = database.getCollection("people");mc.drop();Document doc1 = new Document("name", "tom").append("raid", Arrays.asList(10, 10)).append("gps", new Point(new Position(10, 10)));Document doc2 = new Document("name", "jone").append("raid", Arrays.asList(10.1, 10)).append("gps", new Point(new Position(10.1, 10)));Document doc3 = new Document("name", "john").append("raid", Arrays.asList(10, 10.1)).append("gps", new Point(new Position(10, 10.1)));Document doc4 = new Document("name", "jack").append("raid", Arrays.asList(9.9, 10)).append("gps", new Point(new Position(9.9, 10)));Document doc5 = new Document("name", "mary").append("raid", Arrays.asList(10, 9.9)).append("gps", new Point(new Position(10, 9.9)));Document doc6 = new Document("name", "abby").append("raid", Arrays.asList(10.2, 10)).append("gps", new Point(new Position(10.2, 10)));Document doc7 = new Document("name", "adam").append("raid", Arrays.asList(10.3, 10)).append("gps", new Point(new Position(10.3, 10)));Document doc8 = new Document("name", "barry").append("raid", Arrays.asList(10.4, 10)).append("gps", new Point(new Position(10.4, 10)));Document doc9 = new Document("name", "anne").append("raid", Arrays.asList(10.5, 10)).append("gps", new Point(new Position(10.5, 10)));mc.insertMany(Arrays.asList(doc1, doc2, doc3, doc4, doc5, doc6, doc7, doc8, doc9));mc.createIndex(geo2d("raid"));mc.createIndex(geo2dsphere("gps"));//$geoWithin 匹配任意幾何圖形內(nèi)搜索FindIterable<Document> iterable = mc.find(Filters.geoWithin("raid", new Polygon(Arrays.asList(new Position(10.2, 10), new Position(10, 10.2), new Position(9.8, 10), new Position(10, 9.8), new Position(10.2, 10)))));printResult("Filters.geoWithin raid", iterable);//$geoWithinBox 在以左下角和右上角坐標(biāo)構(gòu)成方形內(nèi)搜索iterable = mc.find(Filters.geoWithinBox("raid", 9.8, 9.8, 10.2, 10.2));printResult("Filters.geoWithinBox raid", iterable);//$geoWithinPolygon 在多邊形內(nèi)搜索List<Double> p1 = new ArrayList<>();List<Double> p2 = new ArrayList<>();List<Double> p3 = new ArrayList<>();p1.add(10d);p1.add(10d);p2.add(10.1);p2.add(10.16);p3.add(10.2);p3.add(10d);List<List<Double>> polygon = Arrays.asList(p1, p2, p3);iterable = mc.find(Filters.geoWithinPolygon("raid", polygon));printResult("Filters.geoWithinPolygon raid", iterable);p2.clear();p2.add(9.9);p2.add(10.16);p3.clear();p3.add(9.8);p3.add(10d);polygon = Arrays.asList(p1, p2, p3);iterable = mc.find(Filters.geoWithinPolygon("gps", polygon));printResult("Filters.geoWithinPolygon gps", iterable);//$geoWithinCenter 在指定圓心和半徑的圓形內(nèi)搜索iterable = mc.find(Filters.geoWithinCenter("raid", 10d, 10d, 0.25));printResult("Filters.geoWithinCenter raid", iterable);//$geoWithinCenterSphere 在球體(地球)上指定圓心和弧度搜索, 例如搜索以[10,10]為中心500米內(nèi)的文檔, 參數(shù)為...10d, 10d, 0.5/6371iterable = mc.find(Filters.geoWithinCenterSphere("gps", 10d, 10d, 11d/6371));printResult("Filters.geoWithinCenterSphere gps", iterable);//$geoIntersectsiterable = mc.find(Filters.geoIntersects("gps", new LineString(Arrays.asList(new Position(10, 10.1), new Position(10.1, 10), new Position(10, 9.9)))));printResult("Filters.geoIntersects gps", iterable);//$neariterable = mc.find(Filters.near("gps", new Point(new Position(10, 10)), 20566d, 0d));printResult("Filters.near gps", iterable);//$nearSphereiterable = mc.find(Filters.nearSphere("gps", new Point(new Position(10, 10)), 20566d, 10d));printResult("Filters.nearSphere gps", iterable);}public void printResult(String doing, FindIterable<Document> iterable) {System.out.println(doing);iterable.forEach(new Block<Document>() {public void apply(final Document document) {System.out.println(document);}});System.out.println("------------------------------------------------------");System.out.println();} }

轉(zhuǎn)載于:https://www.cnblogs.com/autfish/p/5557561.html

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。