将球面操作符的距离转换为弧度
2d 索引支持某些使用球面几何计算距离的查询操作符。球面查询操作符使用弧度表示距离。要将球面查询操作符与 2d 索引一起使用,您必须将距离转换为弧度。
二维索引支持以下球形查询运算符:
具有
spherical: true
选项的$geoNear
管道阶段
关于此任务
在球面数据查询中使用 2d 索引可能会返回不正确的结果或错误。例如,2d 索引不支持环绕极点的球面查询。
如果数据存储为经度和纬度,并且您经常对球面运行查询,请使用 2dsphere 索引而不是 2d 索引。
在您指定经度和纬度坐标时,请先列出经度,然后再列出纬度。
有效经度值介于
-180
和180
之间,两者均包括在内。有效纬度值介于
-90
和90
之间,两者均包括在内。
步骤
要将距离转换为弧度,请将距离除以球体(例如地球)半径,其单位与距离测量值相同。
地球赤道半径大约为 3,963.2 英里或 6,378.1 公里。
示例
以下示例使用 $centerSphere
操作符执行查询。$centerSphere
操作符使用弧度计算距离。
创建 contacts
集合:
db.contacts.insertMany( [ { name: "Evander Otylia", phone: "202-555-0193", address: [ 55.5, 42.3 ] }, { name: "Georgine Lestaw", phone: "714-555-0107", address: [ -74, 44.74 ] } ] )
address
字段包含传统坐标对。
将英里转换为弧度
以下查询返回address
字段位于以点[ -72, 44 ]
为中心、半径为 200 英里的圆内的文档:
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ -72, 44 ] , 200 / 3963.2 ] } } } )
输出:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92d"), name: 'Georgine Lestaw', phone: '714-555-0107', address: [ -74, 44.74 ] } ]
在前面的查询中,要将 200 英里转换为弧度,需要将指定的英里数除以 3963.2。
将公里转换为弧度
以下查询返回 address
字段位于以 [ 55, 42 ]
为中心且半径为 500 公里的圆内的文档:
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ 55, 42 ] , 500 / 6378.1 ] } } } )
输出:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92c"), name: 'Evander Otylia', phone: '202-555-0193', address: [ 55.5, 42.3 ] } ]
在前面的查询中,要将 500 公里转换为弧度,需要将指定的公里数除以 6378.1。