2016-09-09 2 views
0

Спасибо за предыдущий расчет. У меня есть координата центра города, который ранее был запрошен: [lon, lat]. У меня есть еще один параметр в запросе radius. Я хочу найти все документы в своем db внутри этого виртуального cercle.MongoDB - GeoJSON - Найти документ внутри радиуса

Моя схема:

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

Я пытаюсь запрос так:

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) 

Если ориентировать собственный город с радиусом 5 км, я получил ответы с городом, как 200кй или более от того, где Я живу.

ответ

0

Тупой меня,

rad не в метриках единицы, как километров, но в радианах, потому что земля является unperfect сфероид (так мы упростим, вычисляя его как большой мяч).

Если я хочу результат в километрах я должен сделать: rad/6378.1 В миль: rad/3963.2

И в конце концов я написал: geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad/6378.1 ] } }

Voila.

0

Первый Создать индекс

либо вы можете обеспечить индекс moongose schema level или непосредственно на Mongodb коллекции

в Монго DB, как этот

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

Или в moongse Scehema Уровень

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

Теперь Query

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

Предполагая, что вы радиус в радианах
Ниже будет найти все Artisan в пяти милях

Или

Вы можете использовать $maxDistance, которые считают, как meter

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

Для получения дополнительной информации проверить это https://docs.mongodb.com/manual/tutorial/geospatial-tutorial/

+0

Это то, что происходит, когда вы спите только 2 часа из-за кодовой спешки, вы можете слишком быстро прочитать документацию. 2-й блок параметров не километр (я французский кстати, поэтому я не буду использовать имперскую систему;)). Поэтому я должен рассчитать радиан, как этот 'rad/6378.1' – Ragnar