MongoDB geoNear 命令结果距离(以千米为单位)
MongoDB geoNear command result distance in kilometer
我正在使用 mongoDB 将 GPS 位置数据存储为此 GeoJSON 文档
{"type" : "Point", "coordinates" : [33.313183, 44.465632]}
{"type" : "Point", "coordinates" : [33.2926487, 44.4159651]}
更新:我还确保了 2dspher 索引,如下所示
db.test.ensureIndex( { loc : "2dsphere" } )
我从 Google 地图中获取坐标
现在,如果我使用此命令进行搜索,我无法将结果中的距离转换为公里
db.runCommand({geoNear: 'test', spherical: true, near: {type: "Point" , coordinates: [33.2926487, 44.4159651]}})
结果如下
"results" : [
{
"dis" : 0.0033427770982422957,
"obj" : {
"_id" : ObjectId("54a96f348fa05fcaed637a22"),
"loc" : {
"type" : "Point",
"coordinates" : [
33.2926487,
44.4159651
]
}
}
},
{
"dis" : 5764.7060911604085,
"obj" : {
"_id" : ObjectId("54a96f4c8fa05fcaed637a23"),
"loc" : {
"type" : "Point",
"coordinates" : [
33.313183,
44.465632
]
}
}
}
]
第一个结果预计为零,因为它是我想要获得与源 = 目标坐标的距离的同一点,但仍然有价值。
我无法将第二个值转换为公里,在Google距离计算器中约为 5.26KM。
您是否将该字段索引为 2dsphere
。这可以解释差异,因为您正在查询 sphere: true
距离以米为单位返回。要转换为公里,请除以 1000。您可以让 MongoDB 使用 distanceMultiplier
选项执行此操作:
db.runCommand({ "geoNear" : "test", "spherical" : true, "distanceMultiplier" : 0.001, "near" : { "type" : "Point" , "coordinates" : [33.2926487, 44.4159651] } })
当我继续研究这个问题时,我发现了这个
积分有两种存储类型
此格式的遗留积分
db.test2.insert({location: [33.313183, 44.465632]})
和 GeoJSON 指向这种格式
db.test.insert({location: {"type" : "Point", "coordinates" : [33.313183, 44.465632]}})
如果我们使用旧点,结果将以弧度为单位,因此我们将使用此语句将其转换为公里
db.runCommand({geoNear: 'test2', spherical: true, near: [33.2926487, 44.4159651], distanceMultiplier: 6371})
如果我们使用 GeoJSON 点,结果将以米为单位,因此我们将使用此语句将其转换为公里作为此问题的答案
db.runCommand({geoNear: 'test', spherical: true, near: {type: "Point" , coordinates: [33.2926487, 44.4159651]}, distanceMultiplier: 0.001})
for more details check this link, a bug report to MongoDB that explains it all.
我正在使用 mongoDB 将 GPS 位置数据存储为此 GeoJSON 文档
{"type" : "Point", "coordinates" : [33.313183, 44.465632]}
{"type" : "Point", "coordinates" : [33.2926487, 44.4159651]}
更新:我还确保了 2dspher 索引,如下所示
db.test.ensureIndex( { loc : "2dsphere" } )
我从 Google 地图中获取坐标 现在,如果我使用此命令进行搜索,我无法将结果中的距离转换为公里
db.runCommand({geoNear: 'test', spherical: true, near: {type: "Point" , coordinates: [33.2926487, 44.4159651]}})
结果如下
"results" : [
{
"dis" : 0.0033427770982422957,
"obj" : {
"_id" : ObjectId("54a96f348fa05fcaed637a22"),
"loc" : {
"type" : "Point",
"coordinates" : [
33.2926487,
44.4159651
]
}
}
},
{
"dis" : 5764.7060911604085,
"obj" : {
"_id" : ObjectId("54a96f4c8fa05fcaed637a23"),
"loc" : {
"type" : "Point",
"coordinates" : [
33.313183,
44.465632
]
}
}
}
]
第一个结果预计为零,因为它是我想要获得与源 = 目标坐标的距离的同一点,但仍然有价值。
我无法将第二个值转换为公里,在Google距离计算器中约为 5.26KM。
您是否将该字段索引为 2dsphere
。这可以解释差异,因为您正在查询 sphere: true
距离以米为单位返回。要转换为公里,请除以 1000。您可以让 MongoDB 使用 distanceMultiplier
选项执行此操作:
db.runCommand({ "geoNear" : "test", "spherical" : true, "distanceMultiplier" : 0.001, "near" : { "type" : "Point" , "coordinates" : [33.2926487, 44.4159651] } })
当我继续研究这个问题时,我发现了这个 积分有两种存储类型
此格式的遗留积分
db.test2.insert({location: [33.313183, 44.465632]})
和 GeoJSON 指向这种格式
db.test.insert({location: {"type" : "Point", "coordinates" : [33.313183, 44.465632]}})
如果我们使用旧点,结果将以弧度为单位,因此我们将使用此语句将其转换为公里
db.runCommand({geoNear: 'test2', spherical: true, near: [33.2926487, 44.4159651], distanceMultiplier: 6371})
如果我们使用 GeoJSON 点,结果将以米为单位,因此我们将使用此语句将其转换为公里作为此问题的答案
db.runCommand({geoNear: 'test', spherical: true, near: {type: "Point" , coordinates: [33.2926487, 44.4159651]}, distanceMultiplier: 0.001})
for more details check this link, a bug report to MongoDB that explains it all.