【发布时间】:2017-06-01 12:16:28
【问题描述】:
我有一个 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 - 即使只有边缘与多边形相交并且没有点位于其中,查询也应该是一个命中
您可以查看geojson here 或者您可以通过将以下行粘贴到http://geojson.io/ 中自己绘制三个几何图形:
{"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]]}]}
【问题讨论】:
-
嘿 Ivan,我通过指定多边形在
$geoIntersects上取得了一致的成功,Mongo 文档也回避了使用 LineStrings 的示例。正如您正确观察到的那样,查询应该可以工作,所以奇怪的是它不是。您是否尝试过其他地理运算符,看看您是否可以使用它们达到相同的结果?最后,您是在寻找完全落在边界框内的路线,还是与边界框“接触”或部分相交的路线?
标签: c# mongodb mongodb-query geospatial geojson