Fue bastante difícil encontrar mucha información sobre esto, pero después de mirar algunas fuentes, esto es lo que he llegado a comprender.
La mayor diferencia es que GeometryCollection es un tipo de geometría, y Geometry es una palabra de código que significa “cualquier tipo de geometría” . La geometría incluye los siguientes tipos: Punto, Cadena de líneas, Polígono, MultiPoint, MultiLinestring, MultiPolygon y GeometryCollection.
La parte confusa de todo esto es que, cuando define una columna de Geometría en PostGIS, en realidad acepta “Geometría” como un tipo válido. Creo que lo que sucede aquí es que las columnas de geometría con el tipo Geometry pueden tener cualquier tipo de geometría, donde una columna GeometryCollection solo puede tener geometría GeometryCollection.
Entonces, la primera gran pregunta es: ¿ cuándo notarías la diferencia?
- Como no puedo saber el valor exacto de la raíz 3, ¿no implica esto que no puedo saber el área exacta de un triángulo equilátero?
- Estoy creando una biblioteca de códigos para usar en la resolución de problemas de geometría en concursos de programación como el ICPC. ¿De cuánta importancia es saber cómo se ha derivado una fórmula geométrica?
- Cómo diseñar un sistema de dirección para un automóvil de 3 ruedas con geometría Ackerman
- ¿Cómo demostramos que una esfera maximiza el volumen encerrado entre todas las superficies cerradas simples de un área de superficie dada?
- ¿Cuáles son los requisitos previos para estudiar geometría no conmutativa?
Una GeometryCollection siempre es una colección, lo que significa que siempre tiene un número variable de geometrías dentro de ella (incluso si ese número es uno), y que las funciones que operan en colecciones siempre funcionan en una GeometryCollection. Una geometría de tipo Geometría puede no ser una colección. Puede ser un solo punto o cadena lineal.
No tengo una manera simple de probar esto en este momento, pero déjame darte un ejemplo de dónde podrías ver una diferencia. Digamos que tienes dos columnas de geometría. La columna A se define como el tipo Geometry, y la columna B se define como el tipo GeometryCollection.
- La diferencia más obvia es que ST_GeometryType (B) siempre sería GeometryCollection, y ST_GeometryType (A) podría ser cualquier tipo de geometría.
- ST_NumGeometries (B) nunca contendría valores NULL, ni siquiera si la geometría está vacía. ST_NumGeometries (A) sería NULL si el tipo no es Multi-type o GeometryCollection.
Ahora, para la otra gran pregunta: ¿ cuál debería elegir?
Leía muchos consejos de varias fuentes de documentación que leía diciendo que, en general, no debe definir una columna de GeometryCollection (principalmente de esta página: SpatiaLite Cookbook). La razón principal de esto es porque GeometryCollections no funciona bien con todo el software SIG. Es posible que no pueda exportar una GeometryCollection como una capa que su otro software SIG comprenderá. Y realmente, ¿con qué frecuencia necesita una sola capa que contenga geometría heterogénea de todos modos?
Bueno … hay momentos en que podrías necesitar una columna de geometría heterogénea. Un buen ejemplo sería si tiene una tabla que simplemente contiene capas SIG generadas por el usuario. Si necesita una columna que no use un tipo de geometría consistente, recomendaría definir la columna como el tipo de Geometría. Reduce el desorden de tener que separar las colecciones, y dudo que tenga muchas filas que son, en sí mismas, colecciones heterogéneas, por lo que podría evitar las dificultades que conlleva almacenar GeometryCollections haciendo una columna Geometry.
Esta respuesta fue el resultado de un poco de investigación, que fue necesaria porque no he hecho mucho trabajo serio de PostGIS en algunos años. Por lo tanto, alentaría a otros a que revisen mi respuesta en busca de inexactitudes, porque no pude probar la mayor parte de esto por mí mismo para respaldar esta respuesta. Sin embargo, por ahora, he respondido lo mejor que he podido, y espero que te ayude con el trabajo de tu base de datos.