我正在从不同来源收集位置信息,并将所有内容存储在MongoDb集合中。除了具有单个纬度/经度坐标的点位置之外,我还存储区域。
现在,一个数据给我的位置信息为GeometryCollection
,但所有元素均为Polygons
。另一个数据源为我提供了MultiPolygon
的位置。虽然我实际上正在考虑为每个数据源收集一个数据,但我想知道哪种方法总体上更好。
GeometryCollection
当然更灵活,但也许MultiPolygon
显示出更好的查询性能(假设我总是在location字段上创建2dspehere
索引)。将一个表示转换成另一个表示值得吗?
答案 0 :(得分:1)
好消息:对于所有受支持的GeoJSON类型,MongoDB中的查询性能和可索引性都相同。
决策的主要驱动力应该是地理字段的信息体系结构和使用它的软件是否需要包含比多边形更多的类型。您说您要存储地点位置?如果您想将所有地理数据保存在一个字段中,例如location
(并可能带有2dsphere索引),那么您将需要GeometryCollection
,其中可以放入Point
和MultiPolygon
。在GeoJSON规范https://tools.ietf.org/html/rfc7946#page-9中,建议不要嵌套GeometryCollection
,因此对于为您提供GeometryCollection
的那些数据源,您将迭代内容并填充自己的内容GeometryCollection
,其中也包含您的Point
等。
如果要单独存储点,例如eventCenter
与eventAreasEffected
分开,则eventCenter
可以只是一个Point
,而eventAreasEffected
可以是一个'MultiPolygon';不需要GeometryCollection
。在一个以上的字段中具有地理区域,并且在这些字段上具有或不具有多个2dsphere索引是非常好的。从MongoDB 4.0开始,通过包含$geoNear
选项,可以在具有多个2dsphere索引的集合上使用key
。
这是一种非正式但合理的定义方法:MultiPolygon
不是Polygon
的任意集合,而是一个碰巧具有不相交多边形的单个“形状概念”。可以用一个MultiPolygon
来描述美国,其中有阿拉斯加,夏威夷,美国大陆,也许还有波多黎各,等等。实际上,为此,您会注意到,存储数据有些麻烦与MultiPolygon
的每个成员相关,因为coordinates
只能是点数组。例如,有关第三多边形的信息必须在对等字段中携带到单个顶级coordinates
字段中。但是Polygon
或GeometryCollection
的{{1}}的离散数组可以按每个形状存储其他信息。请注意,对于每种形状,除了Polygon
和type
之外,GeoJSON和MongoDB都不限制您添加字段。
一个更微妙的问题是coordinates
与GeometryCollection
的{{1}}的设计和语义。更复杂的是,在Polygon
中定义了显式漏洞,而不是通过地理软件在数据库外部进行后处理的隐式“分层” MultiPolygon
集合。
答案 1 :(得分:0)
这个问题的问题是没有一个好的答案。 这就是您想要或需要的一切。这是在stackExchange上写的一个很好的答案。
,我不了解GeometryCollection,所以无法告诉您任何有关此的信息。但是此链接将向您显示很多信息。