MongoDB边界查询:如何将英里转换为弧度?

18

我有一个带有地理空间索引的商店集合,该索引是基于位置属性建立的。

我的目标是根据用户提供的纬度、经度和搜索半径(以英里为单位),返回在这些参数范围内的商店列表。

我在MongoDB文档中看到了以下示例(http://www.mongodb.org/display/DOCS/Geospatial+Indexing),但是它似乎使用的距离单位是弧度。

center = [50, 50]
radius = 10
db.places.find({"loc" : {"$within" : {"$center" : [center, radius]}}})

那么,将英里转换为弧度的公式是什么?

解决方案 mongodb-user上的出色人员帮助我找到了答案。 基本上,我真正寻找的是一种限制距离的方法。

根据更新后的文档,$near查询有第三个参数: 您还可以使用$near,并设置最大距离。

db.places.find( { loc : { $near : [50,50] , $maxDistance : 5 } } ).limit(20)

$maxDistance的值是以弧度为单位的; 因此,我必须将我的距离以英里为单位除以69。

谢谢!


我通过在mongdb-user Google Group(http://groups.google.com/group/mongodb-user/browse_thread/thread/d37c781bbfff5f08)上发布问题找到了答案。 - Abe
5
注意:将数值除以69是将英里转换为度数的粗略转换,而不是弧度。这里使用度数是正确的,因为这只是一个普通的$near查询(这意味着$maxDistance必须与坐标使用相同的单位),而不是一个球形查询(这种查询需要$maxDistance以弧度为单位)。 - John Flatness
2个回答

17

根据文档所说:

所有距离都使用弧度。这使您可以轻松地乘以地球半径(约为6371公里或3959英里)以获得所选单位的距离。相反,在执行查询时,需要除以地球半径。

因此,您只需将您的半径除以地球半径即可。 在您的示例中,它应该是:

radius = 10/3959

抱歉,我认为那不是。我没有得到任何结果,当我在SQL Server中运行相同的代码时,我得到了结果。 - Abe
你正在使用哪个版本的MongoDb? - walla
我正在使用Windows 64位版本1.6.3。 - Abe
13
如果还有其他人对这个答案感到困惑并且仍然得出不正确的结果,我建议尝试将地球半径乘以 π/180 或除以 π/180,而不仅仅是乘以半径。 - Matt Diamond
3
如果有人仍然遇到问题,上述计算是正确的。1弧度=3959英里(在地球上),所以将英里转换为弧度只需除以3959。真正的问题是你应该使用$centerSphere而不是$center。我自己也遇到了同样的问题。 - Adam

0
为了使用带有公里范围的mongodb $near查询,您需要将半径值转换为公里。默认情况下,mongodb $near接受$ maxDistance作为半径。
在使用公里时,通过111.12(一个度数约为111.12公里)进行距离转换,或者在使用度数时保持距离不变。
如果您的半径是以公里为单位,则使用let。
 db.places.find( { loc : { $near : [50,50] , $maxDistance : 10/111.12 } } )

但如果你的半径是英里,则将其转换为公里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接