2016-03-23 11 views
0

Я попытался найти точки геометрии по радиусу, я нашел учебное пособие, объясняющее, как это сделать.Mongoose найти точки геометрии по радиусу

Отрывок из учебника:

Во-первых, мы должны создать схему. Документы дают нам несколько примеров того, как хранить геопространственные данные. Мы будем использовать устаревший формат для нашего примера. Рекомендуется хранить долготу и широту в массиве. Документы предупреждают о порядке значений, долгота на первом месте.

var LocationSchema = new Schema({ 
    name: String, 
    loc: { 
    type: [Number], // [<longitude>, <latitude>] 
    index: '2d'  // create the geospatial index 
} 
}); 

Сначала вы можете создать метод в контроллере, который может выглядеть примерно так:

findLocation: function(req, res, next) { 
    var limit = req.query.limit || 10; 

    // get the max distance or set it to 8 kilometers 
    var maxDistance = req.query.distance || 8; 

    // we need to convert the distance to radians 
    // the raduis of Earth is approximately 6371 kilometers 
    maxDistance /= 6371; 

    // get coordinates [ <longitude> , <latitude> ] 
    var coords = []; 
    coords[0] = req.query.longitude; 
    coords[1] = req.query.latitude; 

    // find a location 
    Location.find({ 
     loc: { 
     $near: coords, 
     $maxDistance: maxDistance 
     } 
    }).limit(limit).exec(function(err, locations) { 
     if (err) { 
     return res.json(500, err); 
     } 

     res.json(200, locations); 
    }); 
} 

Ссылка на руководство: How to use Geospatial Indexing in MongoDB with Express and Mongoose

После реализованного источника из учебника в моем проекте я Бесполезный 'получать от базы данных правильные точки по радиусу (точки не были внутри радиуса).

Мой вопрос в том, как я могу получить точки геометрии по радиусу (километры или метры не имеют значения)?

Спасибо, Майкл.

ответ

2

У меня была аналогичная проблема немного назад в моей собственной базе данных. Было сложно разобраться и найти ответ, поэтому я поделюсь им здесь. Геопространственный элемент пакета DB Mongoose недостаточно документирован.

В запросе .find вам необходимо использовать более сложный объект, чем у вас выше. Я обнаружил, что следующие работы по строительству, где maxDistance находится в метрах и координатах, представляет собой массив [долготы, широты].

Location.find({ 
    loc: { 
     $near: { 
      $geometry: { 
       type: "Point", 
       coordinates: coords 
      }, 
      $maxDistance: maxDistance 
     } 
    } 
}).then((err, locations) => { 
    // do what you want here 
}) 

Это устраняет необходимость иметь дело с окружностью Земли и всей этой беспорядочностью. Это теперь является родным в Mongoose с этим типом запроса. Я обнаружил, что нижеприведенная функция полезна для быстрого выполнения этих запросов, поэтому вам не придется обрабатывать столько форматирования каждый раз.

var locQuery = (coords, distance) => { 
    return { loc: { $near: { $geometry: { type: "Point", coordinates: coords }, $maxDistance: parseInt(distance)}}} 
}