4

我正在使用带有 Node.js 0.8.8 的 Mongoose 3.5.3,我很惊讶地发现结果中没有返回到给定点的距离。是否可以允许返回距离?它必须有它,因为我的结果似乎是按照人们所期望的距离排序的。

exports.nearBuilding = function (req, res, next) {
    var area = {
        center: [parseFloat(req.params.longitude), parseFloat(req.params.latitude)],
        radius: parseFloat(req.params.distance) / 3963.192 };

    var query = Building.find().where('coords').within.centerSphere(area);

    query.exec(function (error, docs) {
        var records = {'records': docs};
        if (error) {
            process.stderr.write(error);
            res.send(error, 500);
        }
        if (req.params.callback !== null) {
            res.contentType = 'application/javascript';
        }
        res.send(records);
        return next();
    });
};
4

3 回答 3

6

您可以使用返回距离的 geoNear 函数:

Building.collection.geoNear(longitude, latitude, {maxDistance: radius }, cb);

以下是 API 选项:

/**
 * Execute the geoNear command to search for items in the collection
 *
 * Options
 *  - **num** {Number}, max number of results to return.
 *  - **maxDistance** {Number}, include results up to maxDistance from the point.
 *  - **distanceMultiplier** {Number}, include a value to multiply the distances with allowing for range conversions.
 *  - **query** {Object}, filter the results by a query.
 *  - **spherical** {Boolean, default:false}, perform query using a spherical model.
 *  - **uniqueDocs** {Boolean, default:false}, the closest location in a document to the center of the search region will always be returned MongoDB > 2.X.
 *  - **includeLocs** {Boolean, default:false}, include the location data fields in the top level of the results MongoDB > 2.X.
 *  - **readPreference** {String}, the preferred read preference ((Server.PRIMARY, Server.PRIMARY_PREFERRED, Server.SECONDARY, Server.SECONDARY_PREFERRED, Server.NEAREST).
 *
 * @param {Number} x point to search on the x axis, ensure the indexes are ordered in the same order.
 * @param {Number} y point to search on the y axis, ensure the indexes are ordered in the same order.
 * @param {Objects} [options] options for the map reduce job.
 * @param {Function} callback this will be called after executing this method. The first parameter will contain the Error object if an error occured, or null otherwise. While the second parameter will contain the results from the geoNear method or null if an error occured.
 * @return {null}
 * @api public

在你的情况下,你会做这样的事情:

       exports.nearBuilding = function (req, res, next) {

        var query = Building.collection.geoNear(parseFloat(req.params.longitude), parseFloat(req.params.latitude), { distance: parseFloat(req.params.distance) / 3963.192}, function (error, docs) {

            if (error) {
                process.stderr.write(error);
                res.send(error, 500);
            }
            if (req.params.callback !== null) {
                res.contentType = 'application/javascript';
            }
            // Docs are turned as an array of objects that contain distance (dis) and the object (obj). 
            // Let's concatenate that into something cleaner - i.e. the distance as part of object

            var results = []
            docs.forEach(function(doc) {
                doc.obj.distance = doc.dis;
                results.push(doc.obj);
            });
            var records = {'records': results};      

            res.send(records);
            return next();
        });
    };
于 2013-05-23T15:46:48.403 回答
5

如果您使用 2dsphere 坐标(您应该这样做),代码应如下所示。距离 d 以米为单位。

var point = { coordinates: [lng, lat], type: 'Point' };           

Entity.geoNear(point, {maxDistance: d, spherical: true}, function(err, docs) {
  if (err) { return next(err); }

  var entities = [];

  docs.forEach(function(doc) {
    doc.obj.distance = doc.dis;
    entities.push(doc.obj);
  });

  res.json(entities);
});

于 2015-12-06T02:53:52.940 回答
3

当前的 (3.8) Mongoose 构建为此提供了一个geoNear方法:Model

Building.geoNear(
    [long, lat], 
    { maxDistance: 300, spherical: true },
    function(err, results, stats) {
        // results is an array of result objects like:
        // {dis: distance, obj: doc}
    }
);
于 2014-06-21T02:22:49.167 回答