我有一个MongoDB数据库,其中有一个名为
以下查询正确返回此文档:
然而,此查询不包括:
fooCollection
的集合。该集合中包含具有边界多边形形式的地理空间数据的文档。我在我的应用程序中使用C# MongoDB驱动程序。我注意到它不能找到某些空间查询的文档,尽管它可以处理大多数查询。我清空了集合,除了一个有问题的文档,我尝试通过直接执行查询来找到它。
我的文档看起来像这样:
{
"_id" : UUID("12345678-62d9-4024-86dc-123456789012"),
"polygon" : {
"type" : "Polygon",
"coordinates" : [ [
[ 18.414846, -33.9699577 ],
[ 18.414846, -26.0991189 ],
[ 31.0330578, -26.0991189 ],
[ 31.0330578, -33.9699577 ],
[ 18.414846, -33.9699577 ]
] ]
},
"foo": "bar"
}
我在那个集合上也有这个索引:
[
1,
{
"polygon" : "2dsphere"
},
"polygon_2dsphere",
"data.fooCollection",
3
]
以下查询正确返回此文档:
db.getCollection('fooCollection').find( {
"polygon": {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [[24.7698287, -28.7353533],[28.0423, -26.19793]]
}}}})
然而,此查询不包括:
db.getCollection('fooCollection').find( {
"polygon": {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]]
}}}})
如果您绘制这三个几何图形,我无法看出为什么一个会起作用而另一个不会。
- 两条线都完全位于多边形内
- 有效线路要长得多
- 有效线路的方位角在0°到90°之间,而另一条在90°到180°之间。
有人能解释这种行为吗?
编辑:我也测试了单独使用点而不是使用LineStrings。唯一的一个命中是[24.7698287,-28.7353533]
。我确实需要LineStrings - 即使只有边缘与多边形相交,没有点位于其中,查询也应该命中
您可以在http://geojson.io/中粘贴以下行来查看geojson here或自己绘制三个几何图形:
{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},{"type":"LineString","coordinates":[[27.7706902,-26.1091189],[28.0423,-26.19793]]},{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[28.0423,-26.19793]]}]}
$geoIntersects
中取得了一致的成功,Mongo文档也避免使用LineStrings的示例。正如你正确观察到的那样,查询应该可以工作,所以很奇怪它没有。你尝试过其他地理运算符吗?看看是否可以用它们来实现相同的结果?最后,你是找到完全落在边界框内的路线,还是那些与边界框部分“接触”或相交的路线? - nevi_me