如何用 lng 和 lat 获得地球上两点之间的距离或弧度?

how to get the distance or radian between two point on the earth with lng and lat?

如何用 lng 和 lat 得到地球上两点之间的距离或弧度?

在这种情况下,您可能不想要 mapReduce,但实际上 aggregation framework. Apart from the general first stage query you can run via $geoNear 对您的目的更有效。

db.places.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ -88 , 30 ]
        },
        "distanceField": "dist"
    }},
    { "$match": {
        "loc": {
            "$centerSphere": [ [ -88 , 30 ] , 0.1 ]
        }
    }}
])

或者坦率地说,因为初始 $geoNear 阶段会将 "project" 一个附加字段添加到文档中,其中包含查询的 "point of origin" 中的 "distance",那么您可以 "project" =40=] 在后续阶段的那个元素上:

db.places.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ -88 , 30 ]
        },
        "distanceField": "dist"
    }},
    { "$match": {
        "dist": { "$lte": 0.1 }
    }}
])

因为这是一个可以 "produce/project" 表示结果中距离的值的选项,所以它满足您的第一个条件。 "aggregation framework" 的 "chaining" 性质允许 "additional filtering" 或您需要在初始查询过滤后执行的任何其他操作。

所以 $geoWithin$match 阶段下的聚合框架中工作得和在任何标准查询中一样好,因为它不是 "dependant" 在 "index" 阶段存在的地理空间起源。它在使用一个的初始查询中表现更好,但不需要它。

既然你的要求是从原点"distance",那么最合乎逻辑的做法就是执行一个操作,将return这样的信息。就像这样。

很想在此回复中包含所有相关链接,但作为新回复者,我现在只能使用两个链接。


另外一条相关说明:

任何操作中 "distance" 或 "radius" 的度量取决于数据的存储方式。如果它是 "legacy" 或 "key/pair or plain array" 格式,则该值将以 "radians" 表示,否则 "location" 上的数据以 GeoJSON 格式表示,则 "distance data" 表示为 "meters"。

考虑到 MongoDB 服务实现的库以及它如何与存储的数据交互,这是一个重要的考虑因素。如果您愿意正确查看,官方资源中当然有关于此的文档。再一次,我现在不能添加这些链接,除非这个回复看到一些急需的爱。

https://github.com/mongodb/mongo/blob/master/src/third_party/s2/s2latlng.cc#L37

GetDistance() return 一个 S1Angle,S1Angle::radians() 将 return 弧度。

这属于 s2-geometry-library(google code will close,i export it to my github. Java).