【问题标题】:How does the geospatial $nearSphere operator interact with LineString and Polygon地理空间 $nearSphere 运算符如何与 LineString 和 Polygon 交互
【发布时间】:2013-10-07 15:54:46
【问题描述】:

根据文档,2dSphere geospatial index 也可用于复杂的 GeoJSON 形状,例如由多个节点组成的 LineString 和 Polygon。

当您使用 $nearSphere 搜索填充了此类复杂形状的字段以查找与另一个 GeoJSON 对象(也可能是复杂形状)的接近度时,如何计算这些形状的距离?

它会比较形状的最近节点吗?最远的节点?节点的一些平均值?形状的任何边缘上的最近点?

【问题讨论】:

  • $nearSphere 返回一个点附近的地理空间对象 - 你能通过比较形状来澄清你的意思吗?
  • @AsyaKamsky $nearSphere 采用半径。地理空间对象可以是多边形或线串。我想知道当这些多边形部分位于 $nearSphere 的半径内而部分位于其外时会发生什么。
  • $nearSphere 需要一个点和可选的 maxDistance。所以你不能用它来得到一个形状附近的所有形状,只有一个点附近的形状。
  • @AsyaKamsky 这很明显,但 $nearSphere 也会自动按距离对结果进行排序。当它的一些点更远而一些更接近时,它如何计算哪个形状比另一个更近?

标签: mongodb geojson


【解决方案1】:

$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,尽管这些形状的大小和形状都不同。在到指定点的距离相同的文档中,没有定义顺序。这意味着即使它看起来是确定性的,也不能保证是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2016-06-28
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多