2016-04-15 125 views
0

我在我的数据库中有一个Venues列表,我希望按距离到客户端的顺序显示它们。

我到数据库查询如下:

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领域是正确的,从最接近最远。

客户端我用的是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'); 

它正确地显示2点之间的距离。

的问题是2个值(从蒙戈和gMaps)是不同的,即使列表使用$sort从MongoDB中显示它的距离是不按顺序,即:

venue 01: 21.350km 
venue 02: 21.412km 
venue 03: 21.388km // wrong!!! 
venue 04: 21.547km 
正确显示

错误在哪里? 我需要按照距离顺序排序我的场地,并显示以km为单位的距离...并且它应该被排序...

+0

请更新您的文章以及可验证的代码和MongoDB文档。 – Saleem

+0

我添加了示例文件,但我不认为这是必要的。只需测试每个经纬度位置和另一个距离的位置即可。 Mongo返回的距离不同于Google Maps ... 您实际上并不需要我的文档... –

+0

MongoDB假设在计算距离时,地球是一个完美的球体。如果您的应用程序对距离敏感,请不要依赖MongoDB的准确性。 – Saleem

回答

1

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

看到这个网站解释和有在线计算器来计算两个点之间的平均地球半径之间的距离。

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

你会看到,距离通过上述网站计算和MongoDB是一样的。

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

+0

嗯,它不能解决我的问题,但现在我知道它为什么会发生。谢谢 –

+0

好吧,这是完整的一点。 MongoDB无法解决您的问题。您需要决定您的应用程序是否可以以某种不准确的方式生活,或者准确度会被打破。 – Saleem

+0

是的,它可以。我只是希望我的数据能够正确地订购。即使我不认为'距离'是以米计,因为mongo距离和gMaps距离之间的差异太大了...... –