1

我正在尝试从以下数据中获取最接近的数据

> db.points.insert({name:"Skoda" , pos : { lon : 30, lat : 30 } }) 
> db.points.insert({name:"Honda" , pos : { lon : -10, lat : -20 } }) 
> db.points.insert({name:"Skode" , pos : { lon : 10, lat : -20 } }) 
> db.points.insert({name:"Skoda" , pos : { lon : 60, lat : -10 } }) 
> db.points.insert({name:"Honda" , pos : { lon : 410, lat : 20 } }) 

> db.points.ensureIndex({ loc : "2d" })

然后我尝试了

> db.points.find({"loc" : {"$within" : {"$centerSphere" : [[0 , 0],5]}}})

这次我得到了不同的错误

error: {
    "$err" : "Spherical MaxDistance > PI. Are you sure you are using radians?",
    "code" : 13461

然后我尝试了

> db.points.find({"loc" : {"$within" : {"$centerSphere" : [[10 , 10],2]}}})
error: {
    "$err" : "Spherical distance would require wrapping, which isn't implemented yet",
    "code" : 13462

如何完成这项工作?我只想根据 GEO 点的给定半径获取最接近的数据。

谢谢

4

2 回答 2

2

有几点需要注意。首先,您将坐标存储在名为“pos”的字段中,但您正在对名为“loc”的字段进行查询(并已创建索引)。

$centerSphere 采用一组坐标和一个以弧度为单位的值。因此 $centerSphere: [[10, 10], 2] 在 2 *(地球半径)= 12,756 公里的圆中搜索 [10, 10] 周围的项目。$centerSphere 运算符不是为在这么大的区域内搜索文档而设计的(环绕地球两极很棘手)。尝试使用较小的值,例如 0.005。

最后,将坐标存储为数组中的元素可能是一个更好的主意,因为某些驱动程序可能不会保留文档中字段的顺序(并且交换纬度和经度会导致地理位置完全不同)。

于 2012-08-07T17:08:41.677 回答
0

希望这可以帮助:

地球的半径约为 3963.192 英里或 6378.137 公里。

1英里:

db.places.find( { loc: { $centerSphere: [ [ -74, 40.74 ] ,
                                    1 / 3963.192 ] } } )
于 2012-12-20T07:28:19.393 回答