LoginSignup
2
3

More than 5 years have passed since last update.

MongoDB + express.js で位置情報検索(緯度経度)

Last updated at Posted at 2015-04-26

座標検索っていうのかな…
位置情報検索…?なんていうのこういうの
とりあえず2点の数値を座標として扱って、

近い順にデータを取り出す方法を以下に備忘録的に

テスト用データ

コレクション[search]内のデータ例
{
  "_id":"16188bfdf093f",
  "loc":[139.000000000,35.000000000]
}

コード

app.js
//利用するコントローラを読み込みます
var search = require('./routes/search ');
app.use('/search', search );
search.js
var mongodb = require('mongodb');
var data_collection;

//mongoDBに接続
//そしてカラム「loc」を2次元座標として設定する
mongodb.MongoClient.connect("mongodb://localhost:27017/test", function(err, database) {
  if(err){}
  data_collection= database.collection("data_collection");
  data_collection.ensureIndex({loc: "2dsphere"}, {}, function(err, result) {if(err){}console.log(result)});
});

router.get("/", function(req, res) {

  //リクエスト内の座標情報を取得
  var lat = req.query.lat;
  var lng = req.query.lng;

  var searchObject = { 
    "loc" : { 
        $nearSphere : [parseFloat(lng) ,parseFloat(lat)]
    }
  };

  // 座標から近い順に50件を取得
  // 非同期コールバック処理なので注意。
  // コレクションから値を取得する。
  data_collection.find(searchObject).limit(50).toArray(function(err, items) {
    if(err){console.log(err)}
    res.send({"items":items});
  });//find

});//router

↓こいつの描き方がよくわからなくて詰んでた…
 parseFloatを忘れてただけでした。恥ずかしい。

  var searchObject = { 
    "loc" : { 
        $nearSphere : [parseFloat(lng) ,parseFloat(lat)]
    }
  };
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3