$ geoNear distance.calculated不工作?

时间:2017-01-11 13:44:21

标签: javascript mongodb mongoose geolocation geospatial

我想检索半径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);
                            });

1 个答案:

答案 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);
    });