MongooseのgeoNearメソッドの使用について
背景
最近MEANを勉強していて、Simon HelmesのGetting MEAN with Mongo, Express, ANgular, and Nodeという本を読んでいます.ここで、Chapter 8 Adding Angular components to an Expressアプリケーションには、
に質問
著者らは,ブラウザの
ここで,著者らは,
解決する
検索した結果、Mongoでは次のように定義されています.
2dsphere Index
If using a 2dsphere index, you can specify either a GeoJSON point or a legacy coordinate pair for the near value.You must include spherical: true in the syntax.With spherical: true, if you specify a GeoJSON point, MongoDB uses meters as the unit of measurement:
With spherical: true, if you specify a legacy coordinate pair, MongoDBuses radians as the unit of measurement:
本の中のソースコードは確かに
3.9.5/2014-11-10 fixed; geoNear() no longer enforces legacy coordinate pairs - supports GeoJSON #1987 alabid
作者が本を书く时、まだOKを使っていたのかもしれませんが、后でバージョンが更新され、设定が失効しました.
解決する
したがって、著者の元の考え方に従って、コードは次のように変更する必要があります.
最近MEANを勉強していて、Simon HelmesのGetting MEAN with Mongo, Express, ANgular, and Nodeという本を読んでいます.ここで、Chapter 8 Adding Angular components to an Expressアプリケーションには、
Mongoose
のgeoNear
メソッドの使用が含まれる.しかし、自分が著者の方法でテストを行ったところ、希望の結果を出力できないことに気づいた.関連研究によって解決策が見つかったので,分かち合う.に質問
著者らは,ブラウザの
navigator.geolocation
を介してAPIインタフェースに緯度座標を送信し,次いでバックグラウンドでMongoose
のgeoNear
メソッドを用いて,データベースからターゲット座標に近いデータをプッシュすることを実証した.バックグラウンドのMongo
からの数の大まかなコードは以下の通りです./* GET list of locations */
module.exports.locationsListByDistance = function(req, res) {
var lng = parseFloat(req.query.lng);
var lat = parseFloat(req.query.lat);
var maxDistance = parseFloat(req.query.maxDistance);
var point = {
type: "Point",
coordinates: [lng, lat]
};
var geoOptions = {
spherical: true,
maxDistance: theEarth.getRadsFromDistance(maxDistance),
num: 10
};
if ((!lng && lng!==0) || (!lat && lat!==0) || ! maxDistance) {
// ...
}
Loc.geoNear(point, geoOptions, function(err, results, stats) {
// ...
});
};
ここで,著者らは,
maxDistance
データをキロ単位で入力し,アークに変換し,アークをパラメータとしてgeoNear
に伝達することを意味する.しかし、得られた結果、確かにデータ出力はありません.解決する
検索した結果、Mongoでは次のように定義されています.
2dsphere Index
If using a 2dsphere index, you can specify either a GeoJSON point or a legacy coordinate pair for the near value.You must include spherical: true in the syntax.With spherical: true, if you specify a GeoJSON point, MongoDB uses meters as the unit of measurement:
db.runCommand( {
geoNear: ,
near: { type: "Point" , coordinates: [ ] } ,
spherical: true,
...
} )
With spherical: true, if you specify a legacy coordinate pair, MongoDBuses radians as the unit of measurement:
db.runCommand( {
geoNear: ,
near: [ ],
spherical: true,
...
} )
本の中のソースコードは確かに
GeoJSON
のフォーマットですが、なぜ著者はメートルではなく弧を使ったのでしょうか.Mongoose
はバージョン3.9.5でMongo
のこの設定をサポートしていた.原文は以下の通り.3.9.5/2014-11-10 fixed; geoNear() no longer enforces legacy coordinate pairs - supports GeoJSON #1987 alabid
作者が本を书く时、まだOKを使っていたのかもしれませんが、后でバージョンが更新され、设定が失効しました.
解決する
したがって、著者の元の考え方に従って、コードは次のように変更する必要があります.
/* GET list of locations */
module.exports.locationsListByDistance = function(req, res) {
// ...
var geoOptions = {
spherical: true,
maxDistance: maxDistance * 1000, //