GeoJSON / mongoose-geojson-schema / intro confusion

时间:2017-09-29 17:22:01

标签: mongoose geojson hapijs

新手问题和困惑,因为我正在努力学习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"

1 个答案:

答案 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()