Mongoose geoNear返回奇怪的距离

时间:2014-08-30 15:42:30

标签: node.js mongodb mongoose geospatial

我在我的节点js应用程序中使用mongoose驱动程序。

我尝试使用geoNear功能,如下所示:

Hike.geoNear( point, { spherical : true }, function(err, results, stats) { 
    if (err) {
        console.log(err);
        callback(false);
    } else {
        console.log('Here');
        console.log(results);
        callback(results);
    }
});

由于某些未知原因,我的距离非常短:0.0009827867330778472
与直接在mongo(没有Mongoose)的相同查询相比:6268.312062243817

任何想法为什么Mongoose会改变结果?

1 个答案:

答案 0 :(得分:1)

以弧度为单位返回距离,您需要根据球体的半径将其转换为距离测量值。

地球半径为6371公里(3959英里)。我过去曾使用过这个辅助函数:

var theEarth = (function(){
  var earthRadius = 6371; // km, miles is 3959

  var getDistanceFromRads = function(rads) {
    return parseFloat(rads * earthRadius);
  };

  var getRadsFromDistance = function(distance) {
    return parseFloat(distance / earthRadius);
  };

  return {
    getDistanceFromRads : getDistanceFromRads,
    getRadsFromDistance : getRadsFromDistance
  };
})();

鉴于您需要对返回的每个结果进行更改,您可能希望循环遍历它们并在代码中的某个点转换距离。例如:

Hike.geoNear( point, { spherical : true }, function(err, results, stats) { 
  if (err) {
    console.log(err);
    callback(false);
  } else {
    console.log('Here');
    results.forEach(function(doc) {
      doc.distance: theEarth.getDistanceFromRads(doc.dis)
    });
    console.log(results);
    callback(results);
  }
});