Tabla de contenidos
La extensión pgPointCloud almacena datos de nubes de puntos LIDAR en PostgreSQL mediante dos tipos estáticos: pcpoint, un único punto multidimensional cuyas dimensiones se describen mediante un esquema almacenado en la tabla de catálogo pointcloud_formats; y pcpatch, un lote comprimido de valores pcpoint que comparten el mismo pcid (identificador de esquema). Cada esquema fija las dimensiones presentes (X, Y, Z, Intensity, …), su tipo numérico, escala y desplazamiento.
MobilityDB eleva estos tipos al mundo temporal mediante tpcpoint (un sensor LIDAR/GPS en movimiento) y tpcpatch (una serie temporal de grupos de puntos comprimidos). También añade los tipos de conjunto pcpointset / pcpatchset y el tipo de caja delimitadora espaciotemporal tpcbox. Una referencia completa de los tipos estáticos pcpoint y pcpatch se ofrece en la documentación de pgPointCloud; este capítulo cubre las adiciones de MobilityDB sobre pgPointCloud.
Para usar los tipos descritos aquí, MobilityDB debe compilarse con la opción de CMake POINTCLOUD=ON. En tal compilación, el archivo mobilitydb.control generado declara requires = 'postgis, pointcloud', de modo que un único CASCADE crea la pila completa:
CREATE EXTENSION mobilitydb CASCADE; -- NOTICE: installing required extension "postgis" -- NOTICE: installing required extension "pointcloud"
Crear las extensiones a mano en el orden incorrecto, sin CASCADE, genera un error de tipo ausente.
Tanto tpcpoint como tpcpatch admiten la E/S binaria estándar de MobilityDB a través de asBinary / tpcpointFromBinary / tpcpatchFromBinary y a través de COPY ... (FORMAT BINARY) de PostgreSQL. La codificación lleva el pcid de cada valor junto a la carga de dimensiones y, siempre que el backend de codificación conozca el XML de esquema de ese pcid, el esquema mismo, por lo que un valor volcado de un clúster se importa en otro que nunca ha visto el pcid.
Cada valor pcpoint y pcpatch lleva un pcid que se resuelve en un esquema, que declara las dimensiones que contiene el valor (X, Y, Z, …), el tipo numérico con el que se almacena cada una, y su escala y desplazamiento. El esquema se declara en SQL, en dos tablas: pointcloud_schemas contiene lo que declara un esquema en conjunto, y pointcloud_dimensions una fila por dimensión. Un esquema 3D mínimo, con cada dimensión almacenada como int32_t con escala unitaria:
INSERT INTO pointcloud_schemas (pcid, srid, compression, description) VALUES (1, 4326, 'none', 'Minimal 3D schema'); INSERT INTO pointcloud_dimensions (pcid, dim_no, dim_name, interpretation, dim_scale, dim_offset, active, description) VALUES (1, 1, 'X', 'int32_t', 1, 0, true, 'Easting'), (1, 2, 'Y', 'int32_t', 1, 0, true, 'Northing'), (1, 3, 'Z', 'int32_t', 1, 0, true, 'Elevation');
El tamaño de cada dimensión y su desplazamiento dentro de un punto no aparecen porque se derivan de la interpretación, y las dimensiones X, Y, Z y M tampoco porque se resuelven a partir de los nombres. La columna dim_no declara el orden en el que se almacenan las dimensiones, de modo que no depende del orden en el que se insertan las filas, y dim_name es el nombre por el que se resuelven. Ningún nombre de columna necesita comillas en ninguno de los hosts en los que se materializan estas tablas. Un esquema es global a la base de datos y suele registrarse una sola vez, al cargar los datos; el SRID es por esquema y lo heredan todos los valores que llevan ese pcid.
Una base de datos cuyos esquemas ya están registrados en el catálogo pointcloud_formats de pgPointCloud, como documento XML, sigue funcionando: ese catálogo se lee para un pcid que las dos tablas anteriores no declaren.
La mezcla de esquemas se rechaza en el momento de la construcción: no se puede construir una secuencia tpcpoint cuyos instantes lleven valores pcid diferentes, y lo mismo vale para un pcpointset y un pcpatchset. El esquema es lo que da significado a las dimensiones, por lo que un valor que mezclara esquemas llevaría coordenadas que nada puede interpretar.
Tres funciones auxiliares responden lo que declara un pcid sin disponer de un valor de ese esquema y sin depender de la disposición de las tablas. Cada una responde NULL para un pcid que ningún esquema declara.
Devuelve el sistema de referencia espacial en el que se expresa todo valor de un esquema
pointCloudSchemaSRID(integer) → integer
SELECT pointCloudSchemaSRID(1); -- 4326
Devuelve cómo se almacena un parche de un esquema
pointCloudSchemaCompression(integer) → text
SELECT pointCloudSchemaCompression(1); -- none
Devuelve cuántas dimensiones de un esquema contienen valores
pointCloudSchemaNDims(integer) → integer
SELECT pointCloudSchemaNDims(1); -- 3