MongoDb 无法在包含 Polygon 和 MultiPolygon 的集合上创建 2dsphere 索引

MongoDb cannot create 2dsphere index on collection with Polygon and MultiPolygon

我正在尝试将 2dsphere 索引和 运行 添加到几何格式错误的问题中(使用 MongoDB 2.6 和 2dsphere 索引版本 2)

该集合包含具有 Polygon 几何图形的文档和具有 MultiPolygon 几何图形的文档。 Mongo 在到达具有 MultiPolygon 几何图形的文档时立即抛出 #16755 错误(格式错误的几何图形)。 GeoJSON 根据 GeoJSONlint.com

是正确的

是否允许在设置索引时混用几何类型?

我该如何处理这个问题?

失败的文档如下所示:(为了便于阅读,我省略了几点。两个多边形仍在闭合...)

{
    "type" : "MultiPolygon",
    "coordinates" : [ 
        [ 
            [ 
                [ 
                    4.8730935147694279, 
                    51.4125385138567450
                ], 
                [ 
                    4.8731073690744831, 
                    51.4124188435040280
                ], 
                [ 
                    4.8719363156445858, 
                    51.4121631573312000
                ], 
                [ 
                    4.8720931816264326, 
                    51.4120192196300750
                ], 
                [ 
                    4.8730935147694279, 
                    51.4125385138567450
                ]
            ]
        ], 
        [ 
            [ 
                [ 
                    4.9354151466562142, 
                    51.4320525317730240
                ], 
                [ 
                    4.9341804433318899, 
                    51.4319519241268350
                ], 
                [ 
                    4.9341480860178217, 
                    51.4323138673607550
                ], 
                [ 
                    4.9341289343773811, 
                    51.4329459213489240
                ], 
                [ 
                    4.9341142802746933, 
                    51.4334292461250870
                ], 
                [ 
                    4.9354151466562142, 
                    51.4320525317730240
                ]
            ]
        ]
    ]
}

我花了一些时间才找到可用的 "tuit",但这里的答案真的很简单。看来这里的问题在于 "MultiPolygon" 定义中的第一个 "Polygon" 对象。

刚刚提取:

{
    "type": "Polygon",
    "coordinates": [[
        [ 
            4.9354151466562142, 
            51.4320525317730240
        ], 
        [ 
            4.9341804433318899, 
            51.4319519241268350
        ], 
        [ 
            4.9341480860178217, 
            51.4323138673607550
        ], 
        [ 
            4.9341289343773811, 
            51.4329459213489240
        ], 
        [ 
            4.9341142802746933, 
            51.4334292461250870
        ], 
        [ 
            4.9354151466562142, 
            51.4320525317730240
        ]
    ]]
}

这就是部分内容,但当然有助于了解它的外观:

所以这里最大的 "OOPS!" 是 "Polygon" 本身相交形成 "two" 不同的区域。现在 MongoDB 和其他支持 GIS 的引擎 "do not like that" 并期望 "Polygon" 至少具有一致的外部边界。有一个 "inner ring" 很好,但由于这将两个区域分开,因此该形状被视为无效存储。

解决此问题的明确方法是检查您的数据并找到任何此类 "intersecting" 边界。然后在存储它们时将它们分成单独的 "Polygon" 对象定义(在 "MultiPolygon" 的数组中也可以)。

因此,您当前的 "MultiPolygon" 定义定义了 "two" "Polygon" 个对象,但此处预期的是 "three",相交对象被分解为 "two"交点处的物体。 只要您符合这些限制,那么您的 "indexing" 就可以工作,您可以使用所有正常的地理空间操作查询这些对象。