我对$ 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
答案 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会认为地球就是球体。