0

我不确定是否有办法做到这一点。我需要在 mongodb 中有一个圆圈,并使用 $box 使用一个框对该圆圈进行查询,以查看这两个形状是否重叠。但是,Geojson 不支持圆圈。完成这项工作的最佳方法是什么?圆圈存储如下:

places = { 
...
"location": {
    "type": "Point",
    "coordinates": [
        -79.390756,
        43.706685
    ]
},
"radius": 100
}

我有两个具体问题:

  1. 第一个问题是 maxDistance 与 Geojson 对象存储在同一个对象中,不能用于 $maxDistance 的 $near 查询;它只需要一个数字。
  2. 我在 Google Geocoding Api 上进行了部分邮政编码/邮政编码搜索,它返回一个带有两个角坐标的框,如下所示:

    “几何”:{“边界”:{“东北”:{“纬度”:43.710565,“lng”:-79.37363479999999},“西南”:{“纬度”:43.690848,“lng”:-79.40025399999999}}据我所知,我不能使用 $box,因为它只适用于 $geoWithin。

编辑1: 我最初的圆圈和盒子计划发生了变化,主要是因为我没有找到适合这个问题的有效解决方案。现在我不是检查圆圈是否与框重叠,而是检查 Geojson 点是否在圆圈内,如下所示:

db.places.aggregate([
{"$geoNear": {near: { type: "Point", coordinates: [  -80.459293, 40.713640] }, 
distanceField: "dist.calculated", maxDistance: 100000, 
key: 'myLocation', query: { 'SomeField': "..." }, spherical: true}},
{ "$match" :  {$expr:{ $lte:['$dist.calculated', 'radius']}}}])

这里的问题是我必须先在 100 KM 内运行查询,然后在聚合的另一个阶段检查距离。 有没有更有效的方法来实现这一点?谢谢。

4

1 回答 1

0

您可以将圆存储为点和半径。您可以使用$near带有点和$maxDistance米的查询,这是圆的半径。请参阅MongoDB 文档。

https://en.wikipedia.org/wiki/Radius

查询以查找location集合的所有几何字段,距离某个点一定距离。

db.places.find(
   {
     location:
       { $near :
          {
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] },
            $maxDistance: 5000
          }
       }
   }
)

查询以查找查询中的给定几何图形(点、多边形(矩形))是否与集合中字段的几何图形相交。

//find quests bots that matches the users location
await Collection.find({     geometry:   
  { $geoIntersects: 
   { 
     {
      type: "Point",
      coordinates: [
        -73.99460599999999,
        40.7347229
        ]
      }
    } 
  }                         
});
于 2019-12-26T23:31:36.407 回答