MongoDB $geoNear 距离与谷歌地图距离不同

Aye*_*azo 2 javascript google-maps mongodb

我的数据库中有一个场地列表,我希望按照与客户的距离顺序显示这些场地。

我对数据库的查询如下:

    venueCollection.aggregate([
        {
            '$geoNear': {
                'near': {
                    'type': 'Point',
                    'coordinates': [ user_lng , user_lat ]
                },
                'spherical': true, 
                'distanceField': 'dist'
            }
        },
        {
            '$sort': {
                'dist': 1
            }
        }
    ], function (err, venues) {
        // my code...
    });
Run Code Online (Sandbox Code Playgroud)

一个简单的文档:

{
    "_id" : ObjectId("56ec1c833e017f403870e2c5"),
    "name" : "A & H",
    "city" : "'s-Gravenhage",
    "province" : "Zuid Holland",
    "location" : {
        "type" : "Point",
        "coordinates" : [ 
            4.276930300000004, 
            52.0732475
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

它显示场地列表,该distance字段从最近到最远是正确的。

客户端我使用latitudelongitude(与我传递给服务器和场地相同)来计算与谷歌地图的距离:

      var venuePosition = new google.maps.LatLng(attrs.lat, attrs.lng);
      var distance = google.maps.geometry.spherical.computeDistanceBetween(scope.user.position.compiled, venuePosition);
      element.text((distance / 1000).toFixed(2) + ' km');
Run Code Online (Sandbox Code Playgroud)

它正确显示了两点之间的距离。

问题是这 2 个值(来自 Mongo 和来自 gMaps)是不同的,即使使用$sortmongoDB正确显示列表,它也会显示不按顺序排列的距离,即:

venue 01: 21.350km
venue 02: 21.412km
venue 03: 21.388km // wrong!!!
venue 04: 21.547km
Run Code Online (Sandbox Code Playgroud)

错误在哪里?我需要按距离顺序对我的场地进行排序,并以公里为单位显示距离......它也应该被订购......

Sal*_*eem 5

MongoDB 假设地球是完美的球体,并使用地球的平均半径来计算两点之间的距离。但是正如您所知,地球不是球体,而是更多的椭球体,因此距离计算不是完美的,而是 MongoDB 中的近似值。但是,Google 使用非常复杂的公式来获得更好的结果。他们确实在地球上的不同位置拥有庞大的地球半径数据库。

请参阅此网站,该网站解释并提供在线计算器来使用地球的平均半径计算两点之间的距离。

http://andrew.hedges.name/experiments/haversine/

你会看到上面网站和MongoDB计算的距离是一样的。

但是,如果您想获得接近准确的结果,请参阅以下链接http://www.movable-type.co.uk/scripts/latlong.html。它使用非常复杂的算法来获得更好的结果。