Un tpcpoint es el levantamiento de pcpoint a través de la maquinaria temporal de MobilityDB. Admite los mismos tres subtipos que los demás tipos temporales — instante, secuencia (con interpolación discreta o de pasos) y conjunto de secuencias. Todos los instantes de un único valor tpcpoint deben compartir el mismo pcid; el constructor impone esta restricción.
La caja delimitadora de un tpcpoint es un tpcbox, calculada en el momento de la construcción a partir de las dimensiones X/Y/Z de los valores pcpoint subyacentes junto con las marcas temporales de los instantes.
Una columna o dominio puede fijar el esquema añadiendo el pcid como un typmod de entero único, exactamente igual que el geometry(Point, SRID) de PostGIS. La mezcla de esquemas en dicha columna es rechazada en el momento de INSERT o de la conversión. El mismo constructor se aplica a tpcpatch.
CREATE TABLE scans (id int, traj tpcpoint(1), full_scan tpcpatch(1));
-- accepts pcid 1
INSERT INTO scans VALUES (1,
tpcpoint(pcpoint(1, 1.0, 2.0, 3.0), '2024-01-01'::timestamptz),
tpcpatch(pcpatch(1, pcpoint(1, 1, 1, 1), pcpoint(1, 2, 2, 2)),
'2024-01-01'::timestamptz));
-- rejects any other pcid:
-- ERROR: Pcid of tpcpoint value (2) does not match column typmod pcid (1)
Omitir el typmod (tpcpoint sin pcid entre paréntesis) deja la columna sin restricción de esquema. La comprobación en tiempo de ejecución del agregado extent sigue rechazando entradas con pcid mixtos a mitad de consulta incluso en columnas sin restricciones.
Construir un pcpoint temporal de subtipo instante
tpcpoint(pcpoint,timestamptz) → tpcpoint
SELECT tpcpoint(PC_MakePoint(1, ARRAY[10.0, 20.0, 30.0]), '2024-01-01 12:00+00');
Construir un pcpoint temporal de subtipo secuencia a partir de un array de instantes. La interpolación es una de 'discrete', 'step'; 'step' es el valor predeterminado para tpcpoint, ya que los pcpoints llevan dimensiones heterogéneas que no se interpolan de manera lineal
tpcpointSeq(tpcpoint[]) → tpcpoint
tpcpointSeq(tpcpoint[],text) → tpcpoint
SELECT tpcpointSeq(ARRAY[tpcpoint(PC_MakePoint(1, ARRAY[1.0, 2.0, 3.0]), '2024-01-01'::timestamptz), tpcpoint(PC_MakePoint(1, ARRAY[4.0, 5.0, 6.0]), '2024-01-02'::timestamptz)], 'step');
Construir un pcpoint temporal de subtipo conjunto de secuencias a partir de un array de secuencias
tpcpointSeqSet(tpcpoint[]) → tpcpoint
Se aplican todas las funciones de acceso temporales genéricas (véase Capítulo 4, Tipos temporales (Parte 1)): numInstants, startInstant, endInstant, instantN, instants, startValue, endValue, getValues, numTimestamps, startTimestamp, endTimestamp, getTime, duration, memSize, interp. Adicionalmente:
Proyectar un tpcpoint sobre una dimensión espacial, produciendo un tfloat
getX(tpcpoint) → tfloat
getY(tpcpoint) → tfloat
getZ(tpcpoint) → tfloat
SELECT startValue(getX(tpcpoint(PC_MakePoint(1, ARRAY[10.0, 20.0, 30.0]), '2024-01-01'::timestamptz))); -- 10
Proyectar un tpcpoint sobre cualquier dimensión de esquema con nombre, produciendo un tfloat
getDim(tpcpoint,text) → tfloat
Convertir un tpcpoint a un punto de geometría temporal, proyectando todas las dimensiones no espaciales mientras se preservan las marcas temporales. El resultado tiene el mismo SRID que el esquema; su dimensionalidad (2D frente a 3D) sigue la presencia de Z en el esquema. No se proporciona una conversión inversa: reconstruir un pcpoint requiere un esquema destino que el valor temporal solo no puede suministrar
tgeompoint::tpcpoint no está definida
tpcpoint::tgeompoint
SELECT ST_AsText(startValue(tpcpoint(PC_MakePoint(1, ARRAY[10.0, 20.0, 30.0]), '2024-01-01'::timestamptz)::tgeompoint)); -- POINT Z (10 20 30)
Comparar dos tpcpoints lexicográficamente sobre sus codificaciones canónicas
tpcpoint = tpcpoint → boolean
tpcpoint <> tpcpoint → boolean
tpcpoint < tpcpoint → boolean
tpcpoint <= tpcpoint → boolean
tpcpoint > tpcpoint → boolean
tpcpoint >= tpcpoint → boolean
Comprobar si el valor en algún instante (alguna vez) o en todos los instantes (siempre) es igual a, o distinto de, un pcpoint u otro tpcpoint
eEq(pcpoint,tpcpoint) → boolean
eEq(tpcpoint,pcpoint) → boolean
eEq(tpcpoint,tpcpoint) → boolean
aEq, eNe y aNe reciben los mismos tres pares de argumentos
pcpoint ?= tpcpoint → boolean
tpcpoint ?= pcpoint → boolean
tpcpoint ?= tpcpoint → boolean
Los operadores %=, ?<> y %<> reciben los mismos tres pares de operandos
Devolver la igualdad o desigualdad temporal de un tpcpoint con un pcpoint o con otro tpcpoint, como un tbool
tEq(pcpoint,tpcpoint) → tbool
tEq(tpcpoint,pcpoint) → tbool
tEq(tpcpoint,tpcpoint) → tbool
tNe recibe los mismos tres pares de argumentos
pcpoint #= tpcpoint → tbool
tpcpoint #= pcpoint → tbool
tpcpoint #= tpcpoint → tbool
El operador #<> recibe los mismos tres pares de operandos
Restringir un tpcpoint a (al complemento de) un valor pcpoint o un conjunto de valores pcpoint
atValue(tpcpoint,pcpoint) → tpcpoint
minusValue(tpcpoint,pcpoint) → tpcpoint
atValues(tpcpoint,pcpointset) → tpcpoint
minusValues(tpcpoint,pcpointset) → tpcpoint
Restringir un tpcpoint a un selector temporal (marca de tiempo, periodo, conjunto o spanset), o eliminarlo
atTime(tpcpoint,timestamptz) → tpcpoint
atTime(tpcpoint,tstzspan) → tpcpoint
atTime(tpcpoint,tstzset) → tpcpoint
atTime(tpcpoint,tstzspanset) → tpcpoint
minusTime(tpcpoint,timestamptz) → tpcpoint
minusTime(tpcpoint,tstzspan) → tpcpoint
minusTime(tpcpoint,tstzset) → tpcpoint
minusTime(tpcpoint,tstzspanset) → tpcpoint
Restringir un tpcpoint al extent espacial / temporal de un tpcbox, o eliminarlo. Devuelve NULL cuando el pcid del tpcbox no coincide con el del tpcpoint. Internamente proyecta a un tgeompoint a través de la caché de esquemas, restringe la proyección mediante el stbox equivalente y devuelve el span temporal del resultado al tpcpoint original para preservar los valores pcpoint completos
atTpcbox(tpcpoint,tpcbox,border_inc bool=TRUE) → tpcpoint
minusTpcbox(tpcpoint,tpcbox,border_inc bool=TRUE) → tpcpoint
Restringir un tpcpoint a los instantes anteriores o posteriores a una marca de tiempo. El indicador strict excluye el instante en la marca de tiempo misma
beforeTimestamp(tpcpoint,timestamptz,strict bool=TRUE) → tpcpoint
afterTimestamp(tpcpoint,timestamptz,strict bool=TRUE) → tpcpoint
Insertar un tpcpoint en otro, o actualizar otro con él
insert(tpcpoint,tpcpoint,connect bool=TRUE) → tpcpoint
update(tpcpoint,tpcpoint,connect bool=TRUE) → tpcpoint
Eliminar un selector de tiempo (marca de tiempo, conjunto, período o conjunto de spans) de un tpcpoint
deleteTime(tpcpoint,timestamptz,connect bool=TRUE) → tpcpoint
deleteTime(tpcpoint,tstzset,connect bool=TRUE) → tpcpoint
deleteTime(tpcpoint,tstzspan,connect bool=TRUE) → tpcpoint
deleteTime(tpcpoint,tstzspanset,connect bool=TRUE) → tpcpoint
Añadir un instante o una secuencia a un tpcpoint
appendInstant(tpcpoint,tpcpoint) → tpcpoint
appendSequence(tpcpoint,tpcpoint) → tpcpoint
Devolver los valores distintos de un tpcpoint con el conjunto de spans durante el cual toma cada uno de ellos
unnest(tpcpoint) → {(value,time)}
SELECT (un).time
FROM (SELECT unnest(tpcpointSeq(ARRAY[
tpcpoint(pcpoint(1, 1, 1, 1), '2024-01-01'::timestamptz),
tpcpoint(pcpoint(1, 2, 2, 2), '2024-01-02'::timestamptz),
tpcpoint(pcpoint(1, 1, 1, 1), '2024-01-03'::timestamptz)])) AS un) t;
-- {[2024-01-01, 2024-01-02), [2024-01-03, 2024-01-03]}
-- {[2024-01-02, 2024-01-03)}
Fragmentar un tpcpoint en fragmentos, uno por cada intervalo de tiempo
timeSplit(tpcpoint,bin_width interval,origin timestamptz='2000-01-03') → {(time,tpcpoint)}
SELECT (ts).time, numInstants((ts).temp) FROM (SELECT timeSplit(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2024-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2024-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2024-01-03'::timestamptz)]), interval '1 day', '2024-01-01'::timestamptz) AS ts) t; -- 2024-01-01 | 2 -- 2024-01-02 | 2 -- 2024-01-03 | 1
Los operadores de caja delimitadora evalúan contra el tpcbox del valor; véase “Operadores Topológicos” y “Operadores de Posición” para la geometría por operador. Cada operador a continuación está conectado contra tpcbox, tstzspan y el propio tpcpoint.
Predicados topológicos: && solapa, @> contiene, <@ contenido en, ~= mismo, -|- adyacente.
Predicados direccionales estrictos sobre el eje X (<<, >>), eje Y (<<|, |>>), eje Z (<</, />>) y eje temporal (<<#, #>>), más sus variantes "solapa o X": &<, &>, &<|, |&>, &</, /&>, &<#, #&>.
Distancia de aproximación más cercana, ordenable KNN mediante la clase de operadores GiST: SELECT … ORDER BY temp |=| query LIMIT N se acelera con índice. El desajuste de pcid produce infinito.
nearestApproachDistance(tpcpoint,tpcbox) → float
nearestApproachDistance(tpcpoint,tpcpoint) → float
La clase de operadores tpcpoint_btree_ops produce un orden total sobre los valores tpcpoint, pero el orden es byte a byte sobre la serialización pcpoint subyacente, no geométrico. Se aplican las mismas advertencias que al B-tree de tpcpatch:
pcid es el discriminador primario. Los puntos con pcid menor se ordenan antes que los puntos con pcid mayor, independientemente de las coordenadas. La mezcla de pcids en una única columna agrupa las filas por esquema primero al ordenar.
Dentro de un único pcid, el orden sigue la disposición de dimensiones en disco del esquema — típicamente X, Y, Z codificados como int32 (tras aplicar la escala por dimensión del esquema). Dos puntos cuya distancia euclidiana es pequeña pueden ordenarse muy separados si sus dimensiones X difieren, ya que X se compara primero.
La igualdad es igualdad exacta de bytes. Dos pcpoints con los mismos valores de dimensión en el mismo esquema son iguales; el mismo conjunto de coordenadas codificado en un esquema con escala u orden de dimensiones diferente no lo es.
Para una ordenación con significado espacial, proyecte a un tgeompoint mediante la conversión con conocimiento de esquema y use el KNN <-> de PostGIS sobre la geometría resultante, o use el operador KNN GiST |=| directamente sobre el tpcpoint. Para una ordenación con significado temporal, proyecte a startTimestamp o timespan y ordene sobre ese valor.
Se evalúan proyectando el tpcpoint a un tgeompoint a través de la caché de esquemas y delegando en la relación tgeompoint correspondiente. Cada función está conectada en tres órdenes de argumentos: (geometry, tpcpoint), (tpcpoint, geometry) y (tpcpoint, tpcpoint). tpcpatch queda intencionalmente fuera del alcance — la intersección a nivel de parche requeriría la descompresión punto a punto y un diseño diferente.
Alguna vez / siempre intersecta.
eIntersects(tpcpoint,geometry) → bool, aIntersects(tpcpoint,geometry) → bool
eIntersects(tpcpoint,tpcpoint) → bool, aIntersects(tpcpoint,tpcpoint) → bool
Alguna vez / siempre disjunto.
eDisjoint(tpcpoint,geometry) → bool, aDisjoint(tpcpoint,geometry) → bool
eDisjoint(tpcpoint,tpcpoint) → bool, aDisjoint(tpcpoint,tpcpoint) → bool
Alguna vez / siempre dentro de la distancia.
eDwithin(tpcpoint,geometry,float) → bool, aDwithin(tpcpoint,geometry,float) → bool
eDwithin(tpcpoint,tpcpoint,float) → bool, aDwithin(tpcpoint,tpcpoint,float) → bool