2016-03-23 15 views
0

Yarıçaplara göre coğrafi noktaları bulmayı denedim, nasıl yapılacağını açıklayan öğretici buldum. öğreticisindekiMongoose, coğrafi noktaları yarıçap olarak bul

Parçacığı:

Önce bir şema oluşturmanız gerekir. Dokümanlar, coğrafi verilerin nasıl saklanacağına dair bazı örnekler veriyor. Örneğimiz için eski biçimi kullanacağız. Enlem ve boylamı bir dizide saklamanız önerilir. Dokümanlar, değerlerin sırasına göre uyarıda bulunur, öncelikle boylam gelir. Ben yapmadım projeme öğreticisindeki uygulanan bir kaynaktan sonra How to use Geospatial Indexing in MongoDB with Express and Mongoose

:

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

Referans öğretici için:

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

Öncelikle böyle bir şey bakabilirsiniz controller içerisinde bir yöntem oluşturabilir Veri tabanından doğru noktalardan yarıçapı almalıdır (noktalar yarıçap içinde değildi).

Sorum şu ki, coğrafi noktaları yarıçap (kilometre veya metre önemli değil) olarak nasıl alabilirim?

Teşekkürler, Michael.

cevap

2

Biraz önce kendi veritabanımda benzer bir sorunla karşılaştım. Etrafı bulmak ve cevabı bulmak zor oldu, bu yüzden burada paylaşacağım. Mongoose'un DB paketinin geospatial öğesi iyi belgelenmemiş.

.find sorgusunda, yukarıda sahip olduğunuzdan daha karmaşık bir nesne kullanmanız gerekir. MaxDistance'ın metrelerce ve koordelerde olduğu aşağıdaki inşaat işlerinin bir dizi [boylam, enlem] olduğunu buldum.

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

Bu

Dünya'nın çevresi ve bütün bu messiness başa ihtiyacını ortadan kaldırır. Bu, bu sorgu tarzıyla Mongoose'da yerli. Aşağıdaki sorgunun hızlı bir şekilde bu sorguları yapmak için faydalı olduğunu buldum, böylece her seferinde fazla biçimlendirme yapmak zorunda kalmıyorsunuz.

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