我想检索半径20公里范围内的值,但我也得到20公里以外的值。我做错了什么?
var gquery = [{ $geoNear: { near: {
type: "Point",
coordinates: [ -73.935242,40.730610]
},
$minDistance: 0,
$maxDistance: 20000,
distanceField: "dist.calculated",
spherical: true
}},
{$group:{_id:'$category', total:{$sum:1}}
}];
Experiences.aggregate(gquery,
function(err, result) {
console.log(result);
});
答案 0 :(得分:0)
$ maxdistance找不到以千米为单位的坐标,而是 radians 度。所以你必须在 radians 度中从半径转换千米。
就像这样。
var radius = 20
var maxDistance = radius / 111.12;
Place.find({
'loc': {
$near:[-73.935242,40.730610],
$maxDistance: maxDistance
}
}).exec()
.then(...)
编辑:这是度数和2d圈
编辑2:好的,好像我给你一个2d的答案。道歉。
在Documentation for $ geoNear Aggregation中,它说:
指定GeoJSON数据的距离(以米为单位),以弧度为单位 遗留坐标对。
因为您告诉我您没有使用GEOJSON所以在这种情况下您必须将米转换为弧度。
将千米转换为弧度就像将其除以地球半径(6371千米)一样简单
这应该是这样的:
var radiusInKm = 20
var radians = radiusInKm / 6371 // Divided by earth radius in kilometers
var gquery = [{
$geoNear: {
near: {
type: "Point",
coordinates: [-73.935242, 40.730610]
},
$minDistance: 0,
$maxDistance: radians,
distanceField: "dist.calculated",
spherical: true
}
},
{
$group: {
_id: '$category',
total: {
$sum: 1
}
}
}
];
Experiences.aggregate(gquery,
function(err, result) {
console.log(result);
});