MongoDb/GeoJson: MultiPolygon与仅包含多边形的GeometryCollection的区别

3
我正在收集不同来源的位置信息并将所有内容存储在MongoDb集合中。除了单一的纬度/经度坐标点位置外,我还在存储区域。
现在,一个数据源将位置信息作为“GeometryCollection”给出,但其中所有元素都是“Polygons”。另一个数据源将位置作为“MultiPolygon”给出。虽然我实际上考虑为每个数据源创建一个集合,但我想知道哪种方法更好。
“GeometryCollection”当然更灵活,但也许“MultiPolygon”显示更好的查询性能(假设我总是在位置字段上创建2dspehere索引)。转换一种表示形式到另一种对此是否有价值?
2个回答

3

好消息:对于所有支持的GeoJSON类型,MongoDB中的查询性能和可索引性都是相同的。

您的决策的主要驱动因素应该是您的地理字段的信息架构以及使用它的软件是否需要包含比多边形更多的类型。您说您正在存储点位置?如果您想在单个字段(例如location)中保存所有地理数据(并且可能具有该字段上的2dsphere索引),则需要GeometryCollection,其中您可以放置PointMultiPolygon。根据GeoJSON规范https://www.rfc-editor.org/rfc/rfc7946#page-9的建议不要嵌套GeometryCollection,因此对于那些给您提供GeometryCollection的数据源,您需要迭代内容并填充自己的GeometryCollection,其中还包括您的Point等。

如果您将点分别存储,例如将eventCentereventAreasEffected分开,则eventCenter可以仅为一个Point,而eventAreasEffected可以是单个“MultiPolygon”;不需要GeometryCollection。在多个字段中拥有地理位置信息完全没有问题,并且这些字段上是否具有多个2dsphere索引也可以选择性地设置。从MongoDB 4.0开始,您可以通过包含key选项,在具有多个2dsphere索引的集合上使用$geoNear
这里有一个非官方但合理的定义方法:一个MultiPolygon不是任意多个Polygon的集合,而是一个单一的“形状概念”,恰好由不相交的多边形组成。美国可以用一个包含阿拉斯加、夏威夷、大陆美国和可能还有波多黎各等地的MultiPolygon来描述。实际上,为此,你会注意到存储每个MultiPolygon成员相关数据有点棘手,因为coordinates只能是一个点数组的数组。例如,关于第三个多边形的信息必须在与单个顶级coordinates字段对等的字段中传递。但是,离散的Polygon数组或PolygonGeometryCollection可以在每个形状中存储额外的信息。请注意,无论是GeoJSON还是MongoDB都不限制您为每个形状添加除typecoordinates之外的字段。
一个更微妙的问题是 GeometryCollection 的设计和语义,包括 PolygonMultiPolygon。更进一步的复杂性在于,Polygon 中定义显式孔与由地理软件在数据库外进行后处理的隐含“分层”Polygon 的集合之间存在问题。

这是一个非常全面和有用的答案!谢谢!关于数据库的设计,我目前使用了两个集合:(a)一个用于点,其中每个位置字段都是“Point”,(b)一个用于区域,其中位置字段为“MultiPolygon”(如果只有一个多边形,则数组的长度为1)。现在,我不认为我会对MultiPolygon中的每个形状/多边形进行单独的信息处理,但你的观点是正确的。我并不固执于当前的设计——特别是使用2而不是1个集合——但知道性能不是那么重要是很好的。 - Christian

0

不同类型在概念层面上的差异似乎相当直观。我的问题更多地涉及实现/性能方面。GeometryCollection 只是允许将多边形、线和点放入同一位置对象中。当然,这意味着 GeometryCollection 可能只包含多边形,从我所知道的来看,这使它在概念上与 MultiPolygon 对象相同。我只想知道在使用这些位置类型查询大型集合时是否存在性能差异。 - Christian
我会将所有内容转换为MultiPolygon对象。因为GeometryCollection包含一个MultiPolygon对象,所以按照这个逻辑,选择MultiPolygon是最好的选项。 - Lars Hendriks
对于类型为“MultiPolygon”的对象,坐标数组中的每个元素都是一个坐标数组,就像类型为“Polygon”的对象一样。 具有类型为“GeometryCollection”的GeoJSON几何对象是表示几何对象集合的几何对象。 几何对象集合必须具有名为“geometries”的成员。与“geometries”对应的值是一个数组。该数组中的每个元素都是一个GeoJSON几何对象。 - Lars Hendriks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接