MongoDB两点之间的打印距离

MongoDB两点之间的打印距离,mongodb,mongodb-query,geospatial,Mongodb,Mongodb Query,Geospatial,当我在MongoDB上发起这个查询时,我得到了距离指定坐标500英里的所有位置。但我想知道指定坐标和结果位置之间的确切距离 db.new_stores.find({ "geometry": { $nearSphere: { $geometry: { type: "Point", coordinates: [ -81.093699, 32.074673 ] }, $maxDistance: 500 * 3963 } } } ).pretty() 我的输出如下所示: { "_id" : O

当我在MongoDB上发起这个查询时,我得到了距离指定坐标500英里的所有位置。但我想知道指定坐标和结果位置之间的确切距离

db.new_stores.find({ "geometry": { $nearSphere: { $geometry: { type: "Point", coordinates: [ -81.093699, 32.074673 ] }, $maxDistance: 500 * 3963 } } } ).pretty()
我的输出如下所示:

{
    "_id" : ObjectId("565172058bc200b0db0f75b1"),
    "type" : "Feature",
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            -80.148826,
            25.941116
        ]
    },
    "properties" : {
        "Name" : "Anthony's Coal Fired Pizza",
        "Address" : "17901 Biscayne Blvd, Aventura, FL"
    }
}
我还想知道这个地方离指定坐标的距离。我在几何体上创建了2dsphere索引。

您可以使用聚合管道阶段生成与查询点的距离:

db.new\u stores.aggregate([
{“$geoNear”:{
“近”:{
“类型”:“点”,
“坐标”:[-81.093699,32.074673]
}, 
“最大距离”:500*1609,
“球形”:正确,
“距离字段”:“距离”,
“距离乘数”:0.000621371
}}
]).pretty()
这允许您指定
“距离字段”
,该字段将在输出文档中生成另一个字段,其中包含与查询点的距离。您还可以使用
“distanceMultiplier”
根据需要对输出距离应用任何转换(即从米到英里,注意所有GeoJSON距离都以米为单位返回)

还有一个命令具有类似的选项,但它当然不会将光标作为输出返回。

您可以使用聚合管道阶段生成与查询点的距离:

db.new\u stores.aggregate([
{“$geoNear”:{
“近”:{
“类型”:“点”,
“坐标”:[-81.093699,32.074673]
}, 
“最大距离”:500*1609,
“球形”:正确,
“距离字段”:“距离”,
“距离乘数”:0.000621371
}}
]).pretty()
这允许您指定
“距离字段”
,该字段将在输出文档中生成另一个字段,其中包含与查询点的距离。您还可以使用
“distanceMultiplier”
根据需要对输出距离应用任何转换(即从米到英里,注意所有GeoJSON距离都以米为单位返回)


还有一个命令具有类似的选项,但它当然不会将光标作为输出返回。

maxDistance->Optional。距文档可以移动的中心点的最大距离。MongoDB将结果限制为与中心点之间的指定距离内的文档

如果指定点是GeoJSON,以米为单位指定距离;如果指定点是传统坐标对,以弧度为单位指定距离。

在文档中,如果使用传统对,例如:near:[long,lat],则以弧度指定最大距离。 如果您使用GeoJSON,例如:near:{type:“Point”,坐标:[long,lat]}
然后以米为单位指定最大距离

最大距离->可选。距文档可以移动的中心点的最大距离。MongoDB将结果限制为与中心点之间的指定距离内的文档

如果指定点是GeoJSON,以米为单位指定距离;如果指定点是传统坐标对,以弧度为单位指定距离。

在文档中,如果使用传统对,例如:near:[long,lat],则以弧度指定最大距离。 如果您使用GeoJSON,例如:near:{type:“Point”,坐标:[long,lat]}
然后以米为单位指定maxDistance,MongoDB提供了一个聚合器,用于计算带有GeoJson坐标的集合中文档的距离

让我们用一个简单的例子来理解它。 考虑一个简单的收藏店

1。创建收藏

2。在商店收藏中插入文档

3。在“地址”字段上创建地理索引

4。现在使用$geoNear聚合器 查找具有距离的文档

db.shops.aggregate([{$geoNear:{near:{type:"Point",coordinates:[28.411134,77.331801]},distanceField: "shopDistance",$maxDistance:150000,spherical: true}}]).pretty()
此处坐标:[28.411134,77.331801]是获取文档的中心位置或所需位置

距离字段:“shopDistance”,$geoNear聚合器将shopDistance作为结果字段返回

结果:


这里的shopDistance以米为单位。

MongoDB提供了一个$geoNear聚合器,用于计算带有GeoJson坐标的集合中文档的距离

让我们用一个简单的例子来理解它。 考虑一个简单的收藏店

1。创建收藏

2。在商店收藏中插入文档

3。在“地址”字段上创建地理索引

4。现在使用$geoNear聚合器 查找具有距离的文档

db.shops.aggregate([{$geoNear:{near:{type:"Point",coordinates:[28.411134,77.331801]},distanceField: "shopDistance",$maxDistance:150000,spherical: true}}]).pretty()
此处坐标:[28.411134,77.331801]是获取文档的中心位置或所需位置

距离字段:“shopDistance”,$geoNear聚合器将shopDistance作为结果字段返回

结果:


这里的shopDistance以米为单位。

非常感谢,它工作得很好。想知道你为什么把它乘以1609吗?@SiMemon因为一英里有1609米,反之亦然。您使用的3963数字是“弧度”到英里的转换,如果与GeoJSON点坐标一起使用,则会出现错误。弧度仅用于存储,查询使用的是“传统坐标对”。我们能否在同一个查询中找到查询点到多个地质点的距离,而不是一个?这能否确定两个圆是否相交?也就是说,假设我有一个包含纬度、经度和半径的集合。因为GeoJSON不支持ci
db.shops.createIndex({address: "2dsphere" } )
db.shops.aggregate([{$geoNear:{near:{type:"Point",coordinates:[28.411134,77.331801]},distanceField: "shopDistance",$maxDistance:150000,spherical: true}}]).pretty()
{ "_id" : ObjectId("5ef047a4715e6ae00d0893ca"), "name" : "Full Stack developer", "address" : { "type" : "Point", "coordinates" : [ 28.433894, 77.334299 ] }, "shopDistance" : 621.2848190449148 }
{ "_id" : ObjectId("5ef0479e715e6ae00d0893c9"), "name" : "Mica store", "address" : { "type" : "Point", "coordinates" : [ 28.422894, 77.342299 ] }, "shopDistance" : 1203.3456146763526 }
{ "_id" : ObjectId("5ef0478a715e6ae00d0893c7"), "name" : "Galaxy store", "address" : { "type" : "Point", "coordinates" : [ 28.442894, 77.341299 ] }, "shopDistance" : 1310.9612119555288 }
{ "_id" : ObjectId("5ef04792715e6ae00d0893c8"), "name" : "A2Z store", "address" : { "type" : "Point", "coordinates" : [ 28.412894, 77.311299 ] }, "shopDistance" : 2282.6640175038788 }