根据文档,2dSphere地理空间索引也可用于复杂的GeoJSON形状,如LineString和Polygon,它们由多个节点组成。
当您搜索填充了此类复杂形状的字段时,$nearSphere与另一个 GeoJSON 对象(也可能是复杂形状(的接近程度,如何计算这些形状的距离?
它会比较形状中最接近的节点吗?最远的节点?节点的一些平均值?形状任何边缘上最近的点?
$nearSphere
运算符只允许您指定一个点(您可以通过提供maxDistance
参数来定义的"球体"的中心(。 因此,唯一有意义的答案可能是关于形状如何从最接近最远进行排序。
答案是,所有具有等距"最近"点的形状都将在具有最近点的形状之前排序。 换句话说,点和形状之间的距离是点与形状上最近的点之间的距离。
我们可以看到,通过运行$nearSphere
的变体,它是命令$geoNear
因为它返回计算的距离,然后我们可以检查该距离。
我们的示例数据:
> db.near.find()
{ "_id" : 10, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 5 ], [ 5, 5 ], [ 5, 0 ], [ 0, 0 ] ] ] } }
{ "_id" : 11, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 1, 1 ], [ 1, 5 ], [ 5, 5 ], [ 5, 1 ], [ 1, 1 ] ] ] } }
{ "_id" : 12, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 6 ], [ 6, 6 ], [ 6, 0 ], [ 0, 0 ] ] ] } }
{ "_id" : 13, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 6 ], [ 6, 6 ], [ 6, 0 ], [0, 0 ] ], [ [ 1, 1 ], [ 1, 5 ], [ 5, 5 ], [ 5, 1 ], [ 1, 1 ] ] ] } }
{ "_id" : 14, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 6 ], [ 6, 6 ], [ 6, 0 ], [ 0, 0 ] ], [ [ 0.1, 0.1 ], [ 0.1, 5 ], [ 5, 5 ], [ 5, 0.1 ], [ 0.1, 0.1 ] ] ] } }
{ "_id" : 15, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [0, 0 ] ], [ [ 0.1, 0.1 ], [ 0.1, 0.5 ], [ 0.5, 0.5 ], [ 0.5, 0.1 ], [ 0.1, 0.1 ] ] ] } }
{ "_id" : 16, "loc" : { "type" : "LineString", "coordinates" : [ [ 0, 0 ], [ 0.1, 0.1 ] ] } }
{ "_id" : 17, "loc" : { "type" : "LineString", "coordinates" : [ [ 0, 0 ], [ 0, 0.1 ] ] } }
{ "_id" : 18, "loc" : { "type" : "LineString", "coordinates" : [ [ 0, 0 ], [ 0.1, 0 ] ] } }
我们的结果$nearSphere:
{ "_id" : 16, "loc" : { "type" : "LineString", "coordinates" : [ [ 0, 0 ], [ 0.1, 0.1 ] ] } }
{ "_id" : 18, "loc" : { "type" : "LineString", "coordinates" : [ [ 0, 0 ], [ 0.1, 0 ] ] } }
{ "_id" : 14, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 6 ], [ 6, 6 ], [ 6, 0 ], [ 0, 0 ] ], [ [ 0.1, 0.1 ], [ 0.1, 5 ], [ 5, 5 ], [ 5, 0.1 ], [ 0.1, 0.1 ] ] ] } }
{ "_id" : 13, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 6 ], [ 6, 6 ], [ 6, 0 ], [ 0, 0 ] ], [ [ 1, 1 ], [ 1, 5 ], [ 5, 5 ], [ 5, 1 ], [ 1, 1 ] ] ] } }
{ "_id" : 15, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ], [ [ 0.1, 0.1 ], [ 0.1, 0.5 ], [ 0.5, 0.5 ], [ 0.5, 0.1 ], [ 0.1, 0.1 ] ] ] } }
{ "_id" : 12, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 6 ], [ 6, 6 ], [ 6, 0 ], [ 0, 0 ] ] ] } }
{ "_id" : 17, "loc" : { "type" : "LineString", "coordinates" : [ [ 0, 0 ], [ 0, 0.1 ] ] } }
{ "_id" : 10, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 0, 5 ], [ 5, 5 ], [ 5, 0 ], [ 0, 0 ] ] ] } }
{ "_id" : 11, "loc" : { "type" : "Polygon", "coordinates" : [ [ [ 1, 1 ], [ 1, 5 ], [ 5, 5 ], [ 5, 1 ], [ 1, 1 ] ] ] } }
运行$geoSphere命令,我们可以确认从点到形状的距离(出于空间考虑省略坐标(:
> db.runCommand({geoNear:"near", near: {type:"Point", coordinates:[0,0]}, spherical:true})
[
{
"dis" : 0,
"obj" : {
"_id" : 16,
"loc" : {
"type" : "LineString"
}
}
},
{
"dis" : 0,
"obj" : {
"_id" : 18,
"loc" : {
"type" : "LineString"
}
}
},
{
"dis" : 0,
"obj" : {
"_id" : 14,
"loc" : {
"type" : "Polygon"
}
}
},
{
"dis" : 0,
"obj" : {
"_id" : 13,
"loc" : {
"type" : "Polygon"
}
}
},
{
"dis" : 0,
"obj" : {
"_id" : 15,
"loc" : {
"type" : "Polygon"
}
}
},
{
"dis" : 0,
"obj" : {
"_id" : 12,
"loc" : {
"type" : "Polygon"
}
}
},
{
"dis" : 0,
"obj" : {
"_id" : 17,
"loc" : {
"type" : "LineString"
}
}
},
{
"dis" : 0,
"obj" : {
"_id" : 10,
"loc" : {
"type" : "Polygon"
}
}
},
{
"dis" : 157424.6238723255,
"obj" : {
"_id" : 11,
"loc" : {
"type" : "Polygon"
}
}
}
]
如您所见,每个形状(最后一个形状从 [1,1] 开始(到点 [0,0] 的距离为 0,即使形状的大小和形状都不同。 在与指定点具有相同距离的文档中,未定义顺序。 这意味着,即使它看起来是确定性的,也不能保证是相同的。