当前,我们正在使用$ centerSphere查找附近的城市。一个例子是,对于美国德克萨斯州的蜜蜂洞,$ centerSphere正确地找到了半径30公里内的唯一的奥斯丁市(根据文档,它以弧度转换)。现在,对于斐济的Lautoka城市(Lat:-17.6169618,Long:177.4504609),它给出了错误“球形距离将需要(未实现的)包裹”。这是问题一:这个错误是什么意思?

我们尝试使用$ center实现相同的功能。我知道我们需要以英里为单位而不是弧度。实施之后,对于Bee Cave,我得到了数千英里或数百英里之外的美国城市。一个例子是阿尔伯克基。即使正确遵循Mongo文档,我也无法理解为什么会出现这些城市。

我正在使用查询(对于德克萨斯州Bee Cave)

db.places.find{
   "geo": {
      $geoWithin: { $center: [ [ -97.9524, 30.3061 ] , 18.64 ] }
   }
}

最佳答案

$centerSphere无法处理很长的距离,尤其是当它必须缠绕两极时,请参见此JIRA ticket

关于$geoWithin,它不接受以英里为单位的距离,而是接受以坐标系使用的单位为单位的圆的半径,因此按documentation表示的纬度和经度。这会导致包含阿尔伯克基的非常大的边界框

mongodb - Mongo中的$ center和$ centerSphere之间有区别吗?-LMLPHP

您可以使用$near来指定以米为单位的半径。例如,如果您将其用作测试数据:

db.places.insert( {
   name: "Bee Cave, Texas",
   location: { type: "Point", coordinates: [ -97.9524, 30.3061 ]  }
} );
db.places.insert( {
   name: "Austin, Texas",
   location: { type: "Point", coordinates: [ -97.654724, 30.210768 ]  }
} );
db.places.insert( {
   name: "Albuquerque",
   location: { type: "Point", coordinates: [ -106.621216, 35.113281 ]  }
} );

db.places.createIndex( { location: "2dsphere" } )


您可以使用系数1609.344编写以下查询,以将英里转换为米

db.places.find(
   {
     location:
       { $near:
          {
            $geometry: { type: "Point",  coordinates: [-97.9524, 30.3061 ] },
            $maxDistance: 20*1609.344
          }
       }
   }
)


该查询同时返回TX Bee Bee和TX Austin:

{
   "_id":ObjectId("5a7190124f0cd7075d349bbc"),
   "name":"Bee Cave, Texas",
   "location":{
      "type":"Point",
      "coordinates":[
         -97.9524,
         30.3061
      ]
   }
}{
   "_id":ObjectId("5a7190124f0cd7075d349bbd"),
   "name":"Austin, Texas",
   "location":{
      "type":"Point",
      "coordinates":[
         -97.654724,
         30.210768
      ]
   }
}

10-07 17:52