使用 $near 和 2d 索引的 Mongo 地理定位不准确
Posted
技术标签:
【中文标题】使用 $near 和 2d 索引的 Mongo 地理定位不准确【英文标题】:Mongo geolocation using $near and 2d index not being accurate 【发布时间】:2013-05-19 14:50:37 【问题描述】:我编写了一个应用程序,它可以查找本地机构并通过 RESTful API 提供它们。我的堆栈是:快递、快递资源和猫鼬。这是我的模型示例:
var PlaceSchema = new mongoose.Schema(
name:
type: String,
required: true
,
geolocation:
lat: Number,
lng: Number
,
address:
type: String
);
PlaceSchema.index(
geolocation: '2d'
);
我检查了几次,我的 lon/lat 值已正确存储在数据库中,因此没有任何数据错误。
然后我运行查询以获取具有特定查询值的数据:
mongoose.connection.db.executeDbCommand(
geoNear: 'places',
near: [
parseFloat(req.body.lat),
parseFloat(req.body.lng)
],
num: limit,
query:
// Some additional queries that
// don't impact the geo results.
,
spherical: true,
distanceMultiplier: 6371, // converting results to km
maxDistance: distance / 6371,
,
function(err, result)
res.send(200,
status: true,
data: theaters
);
);
它返回的结果存在一些问题:a) 以 km 为单位的计算真的错误。在大多数情况下,会有 6 到 7 公里的差异,但会有所不同,b) 距离较近的地方比其他地方看起来更远。
我使用的是直接 mongoose 查询,因为它会返回计算出的距离(我的 API 返回需要该距离)。切换到 mongoose find 方法显然不会让我访问这些数据。
想知道我的索引是否有误?它应该是 2dsphere 吗?这方面的文档有点混乱,但我看到的大多数示例都只使用 2d。
非常感谢!
【问题讨论】:
【参考方案1】:无论您在 MongoDB 中使用哪种类型的地理空间索引,您始终必须先存储经度,然后再存储纬度。
来自http://docs.mongodb.org/manual/core/2d/#store-points-on-a-2d-plane 和文档中的多个其他地方:
无论是作为数组还是文档,如果使用经纬度, 按以下顺序存储坐标:经度、纬度。
【讨论】:
唯一的其他建议是先在命令行中尝试此操作,然后再在代码中尝试。您使用的是哪个版本的 MongoDB,这对于正确答案非常重要。 版本无关紧要。 MongoDB 中的坐标总是先指定经度。 不必在 2.2 及之前的版本中 - 如果您只使用 2d 索引 不,2.4 与 2d 索引兼容 - 它还提供 2dsphere 索引,也需要相同的 long/lat 顺序。 是的,但 2.2 不需要该顺序,除非您进行球体计算。以上是关于使用 $near 和 2d 索引的 Mongo 地理定位不准确的主要内容,如果未能解决你的问题,请参考以下文章