当前,我们正在使用$ 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表示的纬度和经度。这会导致包含阿尔伯克基的非常大的边界框
您可以使用$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
]
}
}