$ geoIntersects不能像预期的那样工作

时间:2014-04-04 14:11:12

标签: mongodb geospatial geo

我对$ geoIntersects-Operator有疑问。 我有以下searchBox和collection-content:

> BOX
{
        "type" : "Polygon",
        "coordinates" : [
                [
                        [
                                0,
                                0
                        ],
                        [
                                3,
                                0
                        ],
                        [
                                3,
                                3
                        ],
                        [
                                0,
                                3
                        ],
                        [
                                0,
                                0
                        ]
                ]
        ]
}
> db.polygon.find()
{ "_id" : "Poly1", "shape" : { "type" : "Polygon", "coordinates" : [  [  [  0, 0 ],  [  3,  0 ],  [  3,  3 ],  [  0, 3 ],  [  0,  0 ] ] ] } } 
{ "_id" : "Poly2", "shape" : { "type" : "Polygon", "coordinates" : [  [  [  3, 0 ],  [  6,  0 ],  [  6,  3 ],  [  3,  3 ],  [  3,  0 ] ] ] } }
> db.polygon.find( {shape: {$geoIntersects: {$geometry: BOX}}}, {_id:1})
{ "_id" : "Poly1" }

您可以看到,BOX和Poly1完全相同。 Poly2与BOX共享边缘。 因此,当我执行$ geoIntersects-Query时,我期望由于共享边缘而返回两个多边形,但只找到了Poly1。 有人可以向我解释一下吗?或者我做了一个我没看到的愚蠢错误:(

Auf Wiedersehen,Andre

2 个答案:

答案 0 :(得分:2)

好问题。它看起来像是一个错误或文档不准确。只想分享我对该问题的小型研究结果

<强>点:

.find( {shape: {$geoIntersects: {$geometry: {type: "Point", coordinates : [3,0] }}}}, {_id:1})

毫不奇怪,它同时返回Poly1和Poly2。

<强>线段形式:

.find( {shape: {$geoIntersects: {$geometry: {type: "LineString", coordinates : [[3,0], [3, 3]] }}}}, {_id:1})

仅返回Poly1,如果我们还原线点的顺序怎么办?

.find( {shape: {$geoIntersects: {$geometry: {type: "LineString", coordinates : [[3,3], [3, 0]] }}}}, {_id:1})

现在只返回Poly2。所以点的顺序对于LineString 很重要,这对我来说真的很奇怪。

<强>多边形: 我们还尝试更改多边形查询的点的顺序。

.find( {shape: {$geoIntersects: {$geometry: {type: "Polygon", coordinates : [  [  [  3, 0 ],  [  3,  3 ],  [  6,  3 ],  [  6, 0 ],  [  3,  0 ] ] ]}}

现在,即使行[ 3, 0 ], [ 3, 3 ]的点数顺序与Poly1定义匹配,但它仍然只返回Poly2。

<强>要点:

所以当文档说明

  

这包括具有共享边缘的文档

对于Point来说这并不奇怪,对于LineString来说部分是正确的,因为点的顺序很重要! Finnaly对Polygon来说根本不是真的。

实际上这很难过但很高兴知道。我希望在研究过程中我做错了什么,如果有人提出好的解释,我会很高兴。

答案 1 :(得分:0)

只使用较小的数字。对于像这样的三角形:

[{
_id:54cfbc19d9e1f418373ee427,
geo:{type:Polygon,
coordinates:[[[0.3,0.3],[0,0.3],[0,0],[0.3,0.3]]]}
},
{_id:54cfbc19d9e1f418373ee428,
geo:{type:Polygon,
coordinates:[[[0,0],[0.3,0],[0.3,0.3],[0,0]]]}
}]

.find({
    geo: {
        $geoIntersects: {
            $geometry: {
                type: "Point" ,
                coordinates: [0.005,0.005]
            }
        }
    }
})

会给你正确的结果。 我想$ geoIntersects会认为地球就是球体。