2016-04-15 126 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距離之間的差異太大了...... –