新手问题和困惑,因为我正在努力学习Hapi / Mongoose / Mongo。
我自己想要简单地创建一个包含文本和地理位置Point(lat& lon)的模型/对象,并且可以使用提供的当前lat& amp;来从DB中检索这些对象。 LON
尝试使用mongoose-geojson-schema包
创建模式 "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"
答案 0 :(得分:2)
我发现mongoose-geojson-schema包令人讨厌使用。如果您只是存储点,请将模型更改为:
const postModel = new Schema({
_owner: { type: String, ref: 'User' },
text: { type: String },
loc: {
type: { type: String },
coordinates: [Number]
}
});
接下来,您将向后存储坐标。虽然我们通常会想到lat / lon,但在GIS世界中我们认为是lon / lat。 GeoJson也不例外。以x / y的方式考虑它,这将是有道理的。因此,请将您的创作更改为:
post.loc = {
type: 'Point',
coordinates: [req.payload.lon, req.payload.lat]
}
此时它将正确存储在mongo中,但由于您无法搜索或对其进行任何数学运算,因此它不会有多大用处。您需要做的最后一件事是添加一个2dsphere索引。
postModel.index({'loc': '2dsphere'});
现在你应该好好去。您可以在一个点的给定距离内找到帖子:
postModel.find({
loc:{
$geoWithin: { $centerSphere: [ [ -105.42559,36.55685 ], 10 ] }
}
}).exec()