如何用lng和lat获得地球上两点之间的距离或弧度?
答案 0 :(得分:2)
在这种情况下,你可能不想要mapReduce
,但实际上是aggregation framework。除了一般的第一阶段查询,您可以通过$geoNear
运行,这样可以更有效地实现目的。
db.places.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ -88 , 30 ]
},
"distanceField": "dist"
}},
{ "$match": {
"loc": {
"$centerSphere": [ [ -88 , 30 ] , 0.1 ]
}
}}
])
或者坦率地说,因为最初的$geoNear
阶段将"项目"包含"距离"的文档中的附加字段从查询的原点",然后您可以"过滤"在后续阶段的那个元素上:
db.places.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [ -88 , 30 ]
},
"distanceField": "dist"
}},
{ "$match": {
"dist": { "$lte": 0.1 }
}}
])
因为这是一个可以生成/投射"的选项。表示结果中距离的值,满足您的第一个标准。 "链接" "聚合框架的性质"允许"额外过滤"或者在过滤初始查询后需要执行的任何其他操作。
所以$geoWithin
在$match
阶段的聚合框架中也可以像在任何标准查询中一样工作,因为它不依赖于"在"索引"地理空间来源的存在。它在一个初始查询中表现更好,但不需要它。
因为您的要求是"距离"从起源点来看,最合乎逻辑的做法是执行一个返回此类信息的操作。比如这样做。
很想在此回复中包含所有相关链接,但作为新响应者,我现在可以使用两个链接。
一个更相关的说明:
"距离"的测量或" radius"任何操作都取决于数据的存储方式。如果它属于"遗产"或"密钥/对或普通数组"格式然后该值将以"弧度"表示,否则数据以GeoJSON格式表示在"位置"那么"距离数据"表示为"米"代替。
考虑到MongoDB服务实现的库以及它在存储时如何与数据交互,这是一个重要的考虑因素。当然,如果您需要正确查看,请在官方资源中提供相关文档。而且,我不能在这个时候添加这些链接,除非这种反应看到了一些非常需要的爱。
答案 1 :(得分:1)
https://github.com/mongodb/mongo/blob/master/src/third_party/s2/s2latlng.cc#L37
GetDistance()返回一个S1Angle,S1Angle :: radians()将返回弧度。
这属于s2-geometry-library(google code将关闭,我将其导出到我的github。Java)。