我的数据库中有一个场地列表,我希望按照与客户的距离来显示这些场地。
我对数据库的查询如下:
{
"students": [
{ "name": "John", "grade": "90", "year": "2005", "coures": "math" },
{ "name": "Anna", "grade": "80", "year": "2000", "coures": "sport" },
{ "name": "Peter", "grade": "75", "year": "2005", "coures": "math" },
{ "name": "ron", "grade": "70", "year": "2000", "coures": "computer" },
{ "name": "mor", "grade": "85", "year": "2005", "coures": "computer" }
]
}
一份简单的文件:
venueCollection.aggregate([
{
'$geoNear': {
'near': {
'type': 'Point',
'coordinates': [ user_lng , user_lat ]
},
'spherical': true,
'distanceField': 'dist'
}
},
{
'$sort': {
'dist': 1
}
}
], function (err, venues) {
// my code...
});
它显示了一个场地列表,{
"_id" : ObjectId("56ec1c833e017f403870e2c5"),
"name" : "A & H",
"city" : "'s-Gravenhage",
"province" : "Zuid Holland",
"location" : {
"type" : "Point",
"coordinates" : [
4.276930300000004,
52.0732475
]
}
}
字段是正确的,从最近到最远。
客户端我使用distance
和latitude
(同样我传递到服务器和场地的相同位置)来计算与Google地图的距离:
longitude
它正确显示了2点之间的距离。
问题是2个值(来自Mongo和来自gMaps)是不同的,即使使用来自mongoDB的 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');
正确显示列表,它也会显示不在Order中的距离,即:/:/ p >
$sort
错误在哪里? 我需要按照距离顺序对场地进行排序,并以km为单位显示距离......它也应该订购......
答案 0 :(得分:4)
MongoDB假设地球是完美的球体,并使用地球的平均半径来计算两点之间的距离。但是你知道地球不是球体,而是更多类型的椭球,所以距离计算不是完美的,而是近似于MongoDB。但是,Google使用非常复杂的公式来获得更好的结果。他们确实拥有庞大的地球半径数据库。
请参阅此网站,该网站解释并使用在线计算器计算使用平均地球半径计算两点之间的距离。
http://andrew.hedges.name/experiments/haversine/
您将看到上述网站和MongoDB计算的距离相同。
但是,如果您希望获得接近准确的结果,请参阅以下链接http://www.movable-type.co.uk/scripts/latlong.html。它使用非常复杂的算法来获得更好的结果。