Tipo Temporal tpcpoint

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.

Constructores

  • 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

Funciones de Acceso

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:

  • Devolver el id de esquema de pgPointCloud compartido por todos los instantes

    pcid(tpcpoint) → integer

  • Devolver el SRID heredado del esquema

    SRID(tpcpoint) → integer

Proyecciones por Dimensión

  • 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

Conversiones

  • 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)
    

Comparaciones

  • 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 un pcpoint dado

    tpcpoint ?= pcpoint → boolean

    tpcpoint %= pcpoint → boolean

Restricciones

  • 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

Operadores de caja delimitadora

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

Ordenación B-tree — qué significa ORDER BY tpcpoint

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.

Relaciones espaciales

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