Spring MongodbTemplate 查詢10公里範圍內的目標(以車輛為例)
Mongodb官網參考地址:https://docs.mongodb.com/manual/core/geospatial-indexes/#calculation-of-geohash-values-for-2d-indexe
1.配置Spring 和mongodb的整合環境 mongodb-config.xml MongoTemplate
public List<CarPosition> getPosition(CarPosition carPosition) { //double x = 110, y = 38; double x = carPosition.getLng(), y = carPosition.getLat(); Point point = new Point(x, y); //6.2137119 / 3963.2為10公里範圍,6.2137119是英里=10公里 Sphere sphere = new Sphere(point, 6.2137119 / 3963.2); List<CarPosition> positions = mongoTemplate.find(new Query(Criteria.where("locs").within(sphere)), CarPosition.class); return positions ;
sql:
db.<collection>.find( { locs : { $geoWithin :
{ $centerSphere :
[ [ 88 , 30 ] , 10 / 3963.2 ]
} } } )
計算距離需先給定單位,然後設定距離
//返回公里 (球面計算) 10公里 db.runCommand( { geoNear: "driverCarPosition", near: [ 113.931324 , 22.538212 ], spherical: true, distanceMultiplier: 6371, maxDistance:10/6371, distanceField:"distance" }) //返回公里 (2d計算) 10公里 db.runCommand( { geoNear: "driverCarPosition", near: [ 113.931324 , 22.538212 ], distanceMultiplier: 111, maxDistance:10/111, distanceField:"distance" }) //返回米(球面計算 2dsphere) 2500 米 db.runCommand( { geoNear: "driverCarPosition", near: [ 113.931324 , 22.538212 ], spherical: true, distanceMultiplier: 6378137,maxDistance:2500/6378137, distanceField:"distance" }) //返回米(2d 計算) 2500米 db.runCommand( { geoNear: "driverCarPosition", near: [ 113.931324 , 22.538212 ], distanceMultiplier: ?,maxDistance:2500/?, distanceField:"distance" })
5.mongodb中建立2d索引,這裡使用的是Robomong客戶端