【问题标题】:Manually find nearest coordinate with Meteor/Mongo使用 Meteor/Mongo 手动查找最近的坐标
【发布时间】:2015-05-29 15:00:47
【问题描述】:

我已使用$near 命令返回我坐标附近的城市列表。

 Villages.find({loc: {$near: [lat,long], $maxDistance: 2}}, 
                     {fields: {name: 1, _id: 0}}, 
                     {limit: 1}
                     );

这可行,但我遇到了这样的问题:您可以靠近大城市的边缘,但在技术上仍然比您所在的城市更靠近下一个相邻城市的中心。因此,我会喜欢根据人口对结果进行加权(只有数据我必须猜测一个城市是否大)。因为我不相信我可以用$near 做到这一点,所以我需要手动(haversine 或其他)选择最近的城市。我该怎么办?

【问题讨论】:

  • 什么是流星/芒​​果?您是否愿意为您的数据寻找替代来源?如果是这样,只需在 Google 上搜索数据或询问 OpenData.SE 的人员在哪里可以找到市中心。
  • Meteor 是一个类似 Node.js 的 javascript 框架,而 MongoDB 是一个 NoSQL 风格的数据库引擎。我正在使用 Geonames.org 数据库来获取我的城市名称和位置。他们有人口数据,但位置只是城市中心的坐标,而不是区域形状几何。
  • 您可以根据总体更改 mongo 查询中的最大距离,即)population=20m 表示 maxdistance=2 population =40m 表示 maxdistance=4 这样
  • @Vignesh 有没有办法扭转这种规模,让更多的人口显示得更近?

标签: javascript mongodb meteor coordinates distance


【解决方案1】:

如果这行得通,那就太好了。您的代码中存在轻微的技术错误,这可能是造成问题的原因:

 Villages.find({loc: {$near: [long,lat], $maxDistance: 2}}, 
                 {fields: {name: 1, _id: 0}}, 
                 {limit: 1}
                 );

Mongo 使用 long, lat 而不是 lat, long。值得一提的是,这种模式已被弃用,有利于:

loc: { $near : {
            $geometry : [long, lat],
            $maxDistance : 2
        } }

loc 看起来像这样:

loc: {
    type : "Point",
    coordinates : [ long , lat ]
}

确保也将它们编入索引:MyCollection._ensureIndex({"loc" : "2dsphere"});

【讨论】:

  • 如果我不添加这个 MyCollection._ensureIndex({"loc" : "2dsphere"});,整个查询不起作用?
猜你喜欢
  • 2015-12-13
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2020-03-04
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多