【问题标题】:MongoDb geolocationMongoDb 地理定位
【发布时间】:2019-10-05 06:05:05
【问题描述】:

我有一个名为社区的集合。社区有一个地理位置和一个半径。 假设用户想要加入一个社区,然后我会从数据库中获取他的地理位置(如果可用)或上次保存的位置。然后检查用户是否在社区范围内,然后允许他加入社区。 我拥有的唯一数据是用户位置,我必须找到该用户所在半径范围内的所有社区的列表。

【问题讨论】:

  • 您能否添加communityusers 集合中存在的数据样本?这将有助于社区成员尝试查询并以精确的方式回答您的问题。提前致谢!
  • 最小样本数据。 community.name = "Abcd"; community.geolocation = { 类型:“点”,坐标:[] }; community.radius = 10 // 公里。 user.geolocation = { 类型:“点”,坐标:[] };两者都是 2dsphere 索引。社区有名称、地理位置点坐标、半径。对于用户,我们只有他的 lng,lat。
  • 这没有帮助。请从两个集合中添加 2 或 3 个文档
  • 我认为不需要添加更多数据。对于这个查询,只有社区名称、地理位置点 lng& lat、半径是社区收集的足够数据。对于用户来说,只需考虑我们有他的 lng,lat 可供我们使用。使用用户的 lng、lat 查询社区集合 [name, geolocation (lng,lat), radius]。项目处于保密协议下,因此不能透露任何字段。

标签: node.js mongodb mongoose geolocation


【解决方案1】:

this 链接上的官方 MongoDB 文档的帮助下构建了答案。

您在 5 公里 内查找位置的查询应如下所示:

db.community.find({
  geolocation: {
    { $geoWithin:
      { $centerSphere: [ [ uLongitude, uLatitude ], 5 / 6378.1 ] }
    }
  }
})

说明:

  • $geoWithin 查找指定区域内的位置 通过它的论点
  • $centerSphere 用于表示圆形区域 通过以弧度指定中心和半径
  • 5 / 6378.1 用于将 5 公里转换为弧度。有关 MongoDB 官方文档的更多信息,请参阅 this 页面

文档还指出:

$geoWithin 不按任何特定顺序返回文档,因此它 可能首先向用户显示最远的文档。

要以排序方式查找文档,请使用此查询,该查询是使用this location 上的文档构建的:

var METERS_PER_KM = 6378.1
db.community.find({ 
  geolocation: {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [ -73.93414657, 40.82302903 ]
      },
      $maxDistance: 5 * METERS_PER_KM
    }
  }
});

说明:

  • $nearSphere 返回半径范围内的文档(5 km) 从中心uLongitudeuLatitude)以排序的方式, 离中心最近到最远。

编辑 1: 根据 cmets 中的讨论,通过 MongoDB 文档,您也可以使用像这样的聚合查询来获取距离:

db.places.aggregate( [
   {
      $geoNear: {
         near: { type: "Point", coordinates: [ uLongitude, uLatitude ] },
         spherical: true,
         query: {
           // Pass Any Other Query Conditions in this object
         },
         distanceField: "calcDistance"
      }
   }
] )

解释: 您可以将任何其他查询条件传递给$geoNear 阶段中​​的query 参数,并且您应该在查询结果文档的calcDistance 字段中获取距离。尝试通过示例here

编辑 2: 要查找其球面范围与用户坐标相交的社区,社区位置必须存储为Polygon,不幸的是,您的情况并非如此,否则,您可以使用简单的$geoIntersect 查询。 Link to example

【讨论】:

  • 感谢您的回答,但我已经实现了相同的查询?作为工作区。上面的查询所做的是它在用户周围画一个圆圈,然后找到半径为 5 公里(在我的情况下为 10 公里)的社区。我不知道社区的半径。
猜你喜欢
  • 2023-03-16
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多