2017-09-29 3 views
0

Hapi/Mongoose/Mongoを学習しようとしている初心者の質問と混乱。GeoJSON/mongoose-geojson-schema/intro confusion

単にテキストとジオロケーション・ポイント(緯度経度&)を含み、作成しようとして供給される電流の緯度経度&

でDBからこれらのオブジェクトを取得することができモデル/オブジェクトを作成したいと自分自身を任務スキーママングース-にGeoJSONスキーマパッケージを使用して

"mongoose": "^4.11.1", "mongoose-geojson-schema": "^2.1.2"

モデル:

const GeoJSON = require('mongoose-geojson-schema'); 
const mongoose = require('mongoose'); 

const Schema = mongoose.Schema; 
const Point = mongoose.Schema.Types.Point 

const postModel = new Schema({ 
    _owner: { type: String, ref: 'User' }, 
    text: { type: String }, 
    loc: Point 
}); 

ポストを作成します。

let post = new Post(); 
post._owner = req.payload.user_id; 
post.text = req.payload.text; 

var point = new GeoJSON({ 
    point: { 
    type: "Point", 
    coordinates: [req.payload.lat, req.payload.lon] 
    } 
}) 
post.loc = point 

はログにエラーGeoJSON is not a constructorを取得してください。さまざまなバリエーションを試してみました。loc: Cast to Point failed for value "{ type: 'Point', coordinates: [ '39.0525909', '-94.5924078' ] }" at path "loc"

答えて

1

私はmongoose-geojson-schemaパッケージに迷惑をかけています。単純にポイントを保存する場合は、モデルを次のように変更します。

const postModel = new Schema({ 
    _owner: { type: String, ref: 'User' }, 
    text: { type: String }, 
    loc: { 
    type: { type: String }, 
    coordinates: [Number] 
    } 
}); 

次に、座標を逆方向に保存します。私たちは通常、緯度/経度を考えていますが、GISの世界では、緯度/経度を考えています。 GeoJsonも変わりません。それをx/yという言葉で考えれば理にかなっています。それが正しくモンゴに格納します。この時点で

post.loc = { 
    type: 'Point', 
    coordinates: [req.payload.lon, req.payload.lat] 
} 

が、あなたが検索したり、その上に任意の計算を行うことができなくなりますので、それは非常に有用であることはないだろう。だから、にあなたの創造を変更します。最後に行うべきことは、2dsphereインデックスを追加することです。

postModel.index({'loc': '2dsphere'}); 

これでいいですね。あなたはある点から所定の距離内の投稿を見つけることができます:

postModel.find({ 
    loc:{ 
    $geoWithin: { $centerSphere: [ [ -105.42559,36.55685 ], 10 ] } 
    } 
}).exec() 
+0

ありがとう、私はこの方法にも行きました! – ndyr