如何用 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).
如何用 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).