$geoIntersects 不像预期的那样工作

Posted

技术标签:

【中文标题】$geoIntersects 不像预期的那样工作【英文标题】:$geoIntersects don't work like expected 【发布时间】:2014-05-16 21:47:01 【问题描述】:

我有一个问题要咨询 $geoIntersects-Operator。 我有以下搜索框和集合内容:

> 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 时,我期待两个多边形的 where 由于共享边而返回,但只找到了 Poly1。 有人可以向我解释一下吗?还是我犯了一个我看不到的愚蠢错误:(

Auf Wiedersehen,安德烈

【问题讨论】:

【参考方案1】:

好问题。看起来这是一个错误或文档不准确。只是想分享一下我对这个问题的小研究成果

要点:

.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 来说部分正确,因为点的顺序很重要!最后,Polygon 完全不是这样。

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

【讨论】:

@Andre 你好,你没有对我的回答做出任何贡献,只是想知道它是否对你有帮助?如果没有,我能帮您解决问题吗?【参考方案2】:

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

[
_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 认为地球是球体。

【讨论】:

以上是关于$geoIntersects 不像预期的那样工作的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse:runningAccumulate() 不像我预期的那样工作

sleep() 不像我预期的那样工作

glBindAttribLocation 不像预期的那样工作

Xamarin XAML变量范围不像预期的那样工作

变形金刚 BartTokenizer::add_tokens() 不像我对后缀的预期那样工作

Postgres Serializable 似乎不像描述的那样工作