2016-03-23 11 views
0

半径でジオポイントを見つけようとしましたが、チュートリアルでその方法を説明しました。モンゴース半径でジオポイントを見つける

チュートリアルのスニペット:

まず、スキーマを作成する必要があります。ドキュメントは、地理空間データを格納する方法に関するいくつかの例を示しています。この例では、従来の形式を使用します。経度と緯度を配列に格納することをお勧めします。ドキュメントは値の順序についての使用を警告し、経度が最初に来る。私はdidnの私のプロジェクトにチュートリアルから実装されたソース後 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); 
    }); 
} 

リファレンスチュートリアルを:

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

まず、このような何かを見ることができますあなたのコントローラ内でメソッドを作成することができますデータベースから正しい点を半径で受け取る(点は半径の内側にない)。

私の質問は、半径(キロメートルまたはメートルは関係ありません)でどのように地点を受け取ることができますか?

ありがとう、マイケル。

答えて

2

少し前に自分のデータベースで同様の問題を処理しました。それを掘り下げて答えを見つけるのは難しかったので、私はここでそれを共有します。 MongooseのDBパッケージの地理空間要素は十分に文書化されていません。

.findクエリでは、上記よりも複雑なオブジェクトを使用する必要があります。私は、maxDistanceがメートルでcoordsが[経度、緯度]の配列である以下の構造が動作することを発見しました。

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

これにより、地球の円周およびすべての厄介さに対処する必要がなくなります。これは現在、この様式の質問でモンゴースではネイティブです。私は以下の関数がこれらのクエリをすばやく作成するのに役立ち、毎回多くの書式設定を処理する必要がないことがわかりました。

var locQuery = (coords, distance) => { 
    return { loc: { $near: { $geometry: { type: "Point", coordinates: coords }, $maxDistance: parseInt(distance)}}} 
} 
関連する問題