2016-09-09 3 views
0

Dank einer vorherigen Berechnung habe ich die Koordinate der Mitte einer Stadt, die zuvor abgefragt wurde: [lon, lat]. Ich habe einen anderen Parameter in der Abfrage radius. Ich möchte alle Dokumente in meiner Datenbank innerhalb dieses virtuellen Zyklus finden.MongoDB - GeoJSON - Dokument in einem Radius finden

Mein Schema:

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] 
}); 

ich versuche, eine Abfrage wie folgt:

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) 

Wenn ich mir wie 200 km oder mehr mit der Stadt bekam Antworten meine eigene Stadt mit einem Radius von 5km Ziel, von wo aus Ich wohne.

Antwort

0

Dumb mich,

rad ist nicht in Metriken Einheit wie Kilometer, aber in Radian, weil die Erde ist ein unperfect Sphäroid (so vereinfachen wir es als eine große Rechen Ball).

Wenn ich das Ergebnis in Kilometern will ich tun: rad/6378.1 In Meilen: rad/3963.2

So schließlich schrieb ich: geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad/6378.1 ] } }

Voila.

0

Erster Index erstellen

können Sie entweder Index auf moongose schema level oder direkt auf Mongodb Sammlung gewährleisten

in Mongo DB wie diese

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

Oder in moongse Scehema Ebene

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

Jetzt Abfrage

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

Sie Radius ist in Radian Angenommen
Im Folgenden werden alle Artisan innerhalb von fünf Meilen

Oder

Sie können $maxDistance finden verwenden, die als meter betrachten

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

Weitere Informationen lesen Sie in diesem https://docs.mongodb.com/manual/tutorial/geospatial-tutorial/

+0

Das ist, was passiert, wenn Sie nur 2 Stunden wegen einer Codierung Eile schlafen, können Sie die Dokumentation zu schnell lesen. Die 2. Parametereinheit ist nicht Kilometer (ich bin französisch übrigens, also werde ich nicht imperial System;)). Also muss ich den Radianten wie folgt berechnen: 'rad/6378.1' – Ragnar

Verwandte Themen