2016-04-15 18 views
0

Ich habe eine Liste von Veranstaltungsorten in meiner DB und ich möchte diese in der Reihenfolge der Entfernung zum Kunden zeigen.

Meine Anfrage an den DB ist die folgende:

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

Ein einfaches Dokument:

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

eine Liste von Orten zeigen und die distance Feld korrekt ist, vom nächsten bis zum entferntesten.

Client-Seite verwende ich die latitude und longitude (gleiche ich an den Server und die gleiche des Veranstaltungsortes) Entfernung mit Google Maps zu berechnen:

 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'); 

es zeigen den richtigen Abstand zwischen 2 Punkten.

Das Problem ist, dass die 2-Werte (von Mongo und von gmaps) unterschiedlich sind und auch wenn die Liste korrekt angezeigt $sort von mongoDB mit ihm Entfernungen zeigen, die nicht in Ordnung sind, dh .:

venue 01: 21.350km 
venue 02: 21.412km 
venue 03: 21.388km // wrong!!! 
venue 04: 21.547km 

Wo ist der Fehler? Ich muss meine Orte in Entfernungsreihenfolge sortieren und die Entfernung in km anzeigen ... und es sollte auch bestellt werden ...

+0

Bitte aktualisieren Sie Ihren Beitrag zusammen mit überprüfbarem Code und MongoDB-Dokumenten. – Saleem

+0

Ich fügte Beispieldokument hinzu, aber ich denke nicht, dass es notwendig ist. Testen Sie einfach jeden Standort mit Längen- und Breitengrad und eine andere Position, um Abstand zu erhalten. Mongo gibt andere Entfernungen zurück als Google Maps ... Sie brauchen meine Dokumente nicht wirklich ... –

+0

MongoDB nehmen an, dass Erde eine perfekte Kugel ist, wenn sie Entfernung berechnet, die nicht ist. Wenn Ihre Anwendung entfernungsempfindlich ist, verlassen Sie sich nicht auf MongoDB. – Saleem

Antwort

1

MongoDB nimmt an, dass die Erde eine perfekte Kugel ist und verwendet den durchschnittlichen Radius der Erde, um den Abstand zwischen zwei Punkten zu berechnen . Aber wie Sie wissen, ist die Erde keine Kugel, sondern eher eine Art Ellipsoid, so dass die Abstandsberechnung in MongoDB nicht perfekt, sondern ungefähr ist. Google verwendet jedoch sehr komplexe Formeln, um bessere Ergebnisse zu erzielen. Sie haben eine riesige Datenbank des Radius der Erde an verschiedenen Orten auf der Erde.

Sehen Sie diese Website, die erklärt und Online-Rechner zur Berechnung der Entfernung zwischen zwei Punkten mit durchschnittlichen Radius der Erde haben.

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

Sie werden sehen, dass die Entfernung berechnet, indem über Website und MongoDB sind gleich.

Wenn Sie jedoch in der Nähe genaue Ergebnisse erhalten möchten, finden Sie unter folgendem Link http://www.movable-type.co.uk/scripts/latlong.html. Es verwendet sehr komplexe Algorithmen, um bessere Ergebnisse zu erzielen.

+0

Nun, es löst mein Problem nicht, aber jetzt weiß ich, warum es passiert. Danke –

+0

Nun, das ist der springende Punkt. Ihr Problem wird nicht allein von MongoDB gelöst.Sie müssen entscheiden, ob Ihre Anwendung mit einer gewissen Ungenauigkeit leben kann, oder Präzision ist ein Kompromiss. – Saleem

+0

Ja kann es. Ich möchte nur, dass meine Daten richtig geordnet werden. Auch wenn ich nicht glaube, dass der Abstand in Metern liegt, da der Unterschied zwischen Mongo-Abstand und gMap-Abstand zu groß ist ... –

Verwandte Themen