1. 程式人生 > >Spring MongodbTemplate 查詢10公里範圍內的目標(以車輛為例)

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客戶端