将距离转换为用于球面运算的弧度
2D 索引支持某些查询运算符,这些运算符使用球面几何计算距离。球面查询运算符使用弧度来表示距离。为了使用2D索引的球面查询运算符,您必须将距离转换为弧度。
2D 索引支持以下球面查询运算符
$geoNear
管道阶段具有spherical: true
选项
关于此任务
使用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。
将千米转换为弧度
以下查询返回地址字段在以点 [ 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。