2016-09-09 1 views
0

Merci à un calcul précédent, j'ai la coordonnée du centre d'une ville qui a été question précédemment: [lon, lat]. J'ai un autre paramètre dans la requête radius. Je veux trouver tous les documents dans mon db à l'intérieur de ce cercle virtuel.MongoDB - GeoJSON - Trouver un document dans un rayon

Mon schéma:

const artisanSchema = new Schema ({ 
    created: { type: Date, default: Date.now }, 
    updated: { type: Date, default: Date.now }, 
    name: { type: String, index: true }, 
    address: { 
    street: String, 
    zip: { type: String, index: true }, 
    town: { type: String, index: true } 
    }, 
    contact: { 
    tel: String, 
    mail: String, 
    web: String 
    }, 
    activities: [String], 
    type: String, 
    geometry: mongoose.Schema.Types.Point, //"geometry": {"coordinates":[0.704378,45.194518],"type": "Point" 
} 
    tagMetier: [Number] 
}); 

J'essaie une requête comme ceci:

Artisan. 
    find ({ 
    'tagMetier': tag, 
    'geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad ] } } 
    }, 
    function (err, artisan) { 
    if (err) throw err; 
    else { 
     res.send(artisan); 
    } 
    }) 
    .limit(10) 

Si je cible ma propre ville avec un rayon de 5 km Je suis arrivé réponses avec ville comme 200 km ou plus d'où J'habite.

Répondre

0

Dumb moi,

rad n'est pas dans l'unité de mesures comme kilomètres, mais en radian parce que la terre est un unperfect sphéroïde (donc nous simplifions en calculant comme un grand ballon).

Si je veux le résultat en kilomètres que je dois faire: rad/6378.1 en miles: rad/3963.2

Donc finalement je l'ai écrit: geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad/6378.1 ] } }

Voila.

0

First Créer un index

soit vous pouvez vous assurer index sur moongose schema level ou directement sur Mongodb Collection

à Mongo DB comme celui-ci

db.Artisan.createIndex({ geometry : "2dsphere" }) 

Ou dans moongse Scehema Niveau

geometry: mongoose.Schema.Types.Point, index: "2dsphere" 

maintenant la requête

Artisan.find({ location: 
    { $geoWithin: 
     { $centerSphere: [ [ myTown.longitude, myTown.latitude ], 5/3963.2 ] } } ,'tagMetier': tag}) 

En supposant que vous rayon est en radian
qui suit trouveront tous les artisans dans les cinq miles

Ou

Vous pouvez utiliser $maxDistance qui considèrent comme meter

var METERS_PER_MILE = 1609.34 
Artisan.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ myTown.longitude, myTown.latitude ] }, $maxDistance: rad * METERS_PER_MILE } } }) 

Pour plus d'informations, consultez cette https://docs.mongodb.com/manual/tutorial/geospatial-tutorial/

+0

C'est ce qui se passe quand vous ne dormez que 2 heures à cause d'une ruée vers le codage, vous pouvez lire trop vite la documentation. L'unité de 2ème paramètre n'est pas kilométrique (je suis français btw, donc je ne vais pas utiliser le système impérial;)). Donc je dois calculer le radian comme ceci 'rad/6378.1' – Ragnar