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(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
SELECT numSequences(tpcpointSeqSet(ARRAY[tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)])])); -- 1 SELECT numInstants(tpcpointSeqSet(ARRAY[tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)])])); -- 2
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
SELECT pcid(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz)); -- 1
Devolver el SRID heredado del esquema
SRID(tpcpoint) → integer SRID(tpcpatch) → integer
-- The SRID is that of the schema registered for the pcid. SELECT SRID(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz)); -- 0 SELECT SRID(tpcpatch(PC_Patch(ARRAY[pcpoint(1, 1, 1, 1)]), '2001-01-01'::timestamptz)); -- 0
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
SELECT getDim(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)]), 'X'); -- Interp=Step;[1@2001-01-01, 2@2001-01-02]
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)
Transformar un tpcpoint en otro subtipo
tpcpointInst(tpcpoint) → tpcpoint tpcpointSeq(tpcpoint,interp='step') → tpcpoint tpcpointSeqSet(tpcpoint) → tpcpoint
SELECT numInstants(tpcpointInst(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz))); -- 1 SELECT numInstants(tpcpointSeq(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)]))); -- 2
Transformar un tpcpoint a otra interpolación
setInterp(tpcpoint,interp) → tpcpoint
-- A tpcpoint carries step interpolation. SELECT interp(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)])); -- Step SELECT interp(setInterp(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)], 'discrete'), 'step')); -- Step
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
SELECT tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz) = tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz); -- t SELECT tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz) <> tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz); -- t SELECT tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz) < tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz); -- t
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
SELECT eEq(pcpoint(1, 1, 1, 1), tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)])); -- t SELECT aEq(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), pcpoint(1, 1, 1, 1)); -- f
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
SELECT tEq(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), pcpoint(1, 1, 1, 1)); -- [t@2001-01-01, f@2001-01-02, f@2001-01-03]
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
-- With step interpolation the matching value is held on -- [2001-01-01, 2001-01-02); its closing bound is stored as a second instant. SELECT numInstants(atValue(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), pcpoint(1, 1, 1, 1))); -- 2 SELECT numInstants(minusValue(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), pcpoint(1, 1, 1, 1))); -- 2
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
SELECT numInstants(atTime(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), timestamptz '2001-01-02')); -- 1 SELECT numInstants(atTime(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), tstzspan '[2001-01-01, 2001-01-02]')); -- 2
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 boolean=TRUE) → tpcpoint minusTpcbox(tpcpoint,tpcbox,border_inc boolean=TRUE) → tpcpoint
SELECT numInstants(atTpcbox(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), tpcbox_zt(0, 0, 0, 2, 2, 2, tstzspan '[2001-01-01, 2001-01-03]', 1))); -- 2 -- The box does not intersect the tpcpoint, so nothing is removed. SELECT numInstants(minusTpcbox(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), tpcbox_zt(10, 10, 10, 12, 12, 12, tstzspan '[2001-01-01, 2001-01-03]', 1))); -- 3
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 boolean=TRUE) → tpcpoint afterTimestamp(tpcpoint,timestamptz,strict boolean=TRUE) → tpcpoint
SELECT timeSpan(beforeTimestamp(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), timestamptz '2001-01-02')); -- [2001-01-01, 2001-01-02) SELECT timeSpan(afterTimestamp(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), timestamptz '2001-01-02')); -- (2001-01-02, 2001-01-03]
Insertar un tpcpoint en otro, o actualizar otro con él
insert(tpcpoint,tpcpoint,connect boolean=TRUE) → tpcpoint update(tpcpoint,tpcpoint,connect boolean=TRUE) → tpcpoint
SELECT numInstants(insert(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)]), tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]))); -- 3
Eliminar un selector de tiempo (marca de tiempo, conjunto, período o conjunto de spans) de un tpcpoint
deleteTime(tpcpoint,timestamptz,connect boolean=TRUE) → tpcpoint deleteTime(tpcpoint,tstzset,connect boolean=TRUE) → tpcpoint deleteTime(tpcpoint,tstzspan,connect boolean=TRUE) → tpcpoint deleteTime(tpcpoint,tstzspanset,connect boolean=TRUE) → tpcpoint
-- Deleting the middle instant splits the sequence into
-- {[2001-01-01, 2001-01-02), (2001-01-02, 2001-01-03]}; each half stores
-- its bound at the deleted timestamp, giving four instants.
SELECT numInstants(deleteTime(tpcpointSeq(ARRAY[
tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz),
tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz),
tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), timestamptz '2001-01-02'));
-- 4
Añadir un instante o una secuencia a un tpcpoint
appendInstant(tpcpoint,tpcpoint) → tpcpoint appendSequence(tpcpoint,tpcpoint) → tpcpoint
SELECT numInstants(appendInstant(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz)]), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz))); -- 3
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
Devuelve el arreglo de lapsos de tiempo de los segmentos de un tpcpoint
spans(tpcpoint) → tstzspan[]
SELECT spans(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)]));
-- {"[2024-01-01, 2024-01-02]","[2024-01-02, 2024-01-03]"}
Devuelve los lapsos de tiempo de un tpcpoint dividido en un número dado de contenedores, o con un número dado de segmentos por contenedor
splitNSpans(tpcpoint, integer) → tstzspan[] splitEachNSpans(tpcpoint, integer) → tstzspan[]
SELECT splitNSpans(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)]), 2);
-- {"[2024-01-01, 2024-01-02]","[2024-01-02, 2024-01-03]"}
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.
SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(2,2,2)),[2024-01-01, 2024-01-03]), 1)' && tpcbox 'TPCBOX(ZT(((1,1,1),(3,3,3)),[2024-01-02, 2024-01-04]), 1)'; -- true SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(4,4,4)),[2024-01-01, 2024-01-04]), 1)' @> tpcbox 'TPCBOX(ZT(((1,1,1),(2,2,2)),[2024-01-02, 2024-01-03]), 1)'; -- true SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(2,2,2)),[2024-01-01, 2024-01-03]), 1)' ~= tpcbox 'TPCBOX(ZT(((0,0,0),(2,2,2)),[2024-01-01, 2024-01-03]), 1)'; -- true SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(2,2,2)),[2024-01-01, 2024-01-02)), 1)' -|- tpcbox 'TPCBOX(ZT(((0,0,0),(2,2,2)),[2024-01-02, 2024-01-03]), 1)'; -- true
Predicados direccionales estrictos sobre el eje X (<<, >>), eje Y (<<|, |>>), eje Z (<</, />>) y eje temporal (<<#, #>>), más sus variantes "solapa o X": &<, &>, &<|, |&>, &</, /&>, &<#, #&>.
SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(1,1,1)),[2024-01-01, 2024-01-02]), 1)' << tpcbox 'TPCBOX(ZT(((5,5,5),(6,6,6)),[2024-01-03, 2024-01-04]), 1)'; -- true SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(1,1,1)),[2024-01-01, 2024-01-02]), 1)' <<| tpcbox 'TPCBOX(ZT(((5,5,5),(6,6,6)),[2024-01-03, 2024-01-04]), 1)'; -- true SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(1,1,1)),[2024-01-01, 2024-01-02]), 1)' <</ tpcbox 'TPCBOX(ZT(((5,5,5),(6,6,6)),[2024-01-03, 2024-01-04]), 1)'; -- true SELECT tpcbox 'TPCBOX(ZT(((0,0,0),(1,1,1)),[2024-01-01, 2024-01-02]), 1)' <<# tpcbox 'TPCBOX(ZT(((5,5,5),(6,6,6)),[2024-01-03, 2024-01-04]), 1)'; -- true
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
SELECT round(nearestApproachDistance( tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 10, 10, 10), '2001-01-01'::timestamptz))::numeric, 4); -- 15.5885 -- A tpcbox without a time span measures the spatial approach only. SELECT round(nearestApproachDistance(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), tpcbox_z(10, 10, 10, 12, 12, 12, 1))::numeric, 4); -- 12.1244 SELECT round((tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz) |=| tpcpoint(pcpoint(1, 10, 10, 10), '2001-01-01'::timestamptz))::numeric, 4); -- 15.5885
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). Las relaciones ever/always están conectadas solo para tpcpoint; un tpcpatch responde en cambio las relaciones temporales, leyendo un parche como el multipunto de las posiciones que ocupan sus puntos. Un tpcpoint declara las relaciones que declara su destino de conversión, de modo que eContains, eCovers y eTouches y sus gemelas siempre también están conectadas: un esquema cuyas dimensiones no incluyen Z las responde, y uno que lleva Z encuentra el rechazo planar The tgeompoint cannot have Z dimension, exactamente como lo hace un punto geométrico temporal tridimensional.
Contiene, cubre y toca alguna vez / siempre
{eContains,aContains}(geometry,tpcpoint) → boolean
{eCovers,aCovers}(geometry,tpcpoint) → boolean
{eTouches,aTouches}(geometry,tpcpoint) → boolean
{eTouches,aTouches}(tpcpoint,geometry) → boolean
Un punto en movimiento no contiene ni cubre una geometría y dos puntos en movimiento no se tocan, de modo que estas toman la geometría en primer lugar únicamente, salvo eTouches y aTouches, que leen cualquiera de los dos órdenes. Son relaciones planares: un punto cuyo esquema declara una dimensión Z es rechazado.
SELECT eContains(geometry 'Polygon((0 0,0 4,4 4,4 0,0 0))', tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz)); -- ERROR: The tgeompoint cannot have Z dimension
Alguna vez / siempre intersecta.
eIntersects(tpcpoint,geometry) → boolean, aIntersects(tpcpoint,geometry) → boolean
eIntersects(tpcpoint,tpcpoint) → boolean, aIntersects(tpcpoint,tpcpoint) → boolean
SELECT eIntersects(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), geometry 'POINT Z (1 1 1)'); -- t SELECT aIntersects(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), geometry 'POINT Z (1 1 1)'); -- f SELECT eIntersects(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)])); -- t
Alguna vez / siempre disjunto.
eDisjoint(tpcpoint,geometry) → boolean, aDisjoint(tpcpoint,geometry) → boolean
eDisjoint(tpcpoint,tpcpoint) → boolean, aDisjoint(tpcpoint,tpcpoint) → boolean
SELECT eDisjoint(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), geometry 'POINT Z (1 1 1)'); -- t SELECT aDisjoint(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), geometry 'POINT Z (1 1 1)'); -- f
Alguna vez / siempre dentro de la distancia.
eDwithin(tpcpoint,geometry,float) → boolean, aDwithin(tpcpoint,geometry,float) → boolean
eDwithin(tpcpoint,tpcpoint,float) → boolean, aDwithin(tpcpoint,tpcpoint,float) → boolean
SELECT eDwithin(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), geometry 'POINT Z (5 5 5)', 4); -- t SELECT aDwithin(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 2, 2, 2), '2001-01-02'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]), geometry 'POINT Z (5 5 5)', 4); -- f
Las relaciones temporales calculan la relación topológica o de distancia en cada instante y dan como resultado un tbool. Leen la misma proyección a tgeompoint que leen las relaciones ever/always, y están conectadas en los mismos tres órdenes de argumentos. Un tpcpoint lleva la Z que declara su esquema, si la hay: tContains, tCovers y tTouches son relaciones planares, de modo que un esquema cuyas dimensiones no incluyen Z las responde y uno que lleva Z es rechazado. Esa proyección lleva la interpolación de su origen, de modo que una secuencia tpcpoint se responde a lo largo de su trayectoria y no solo en sus instantes.
Relaciones espaciales temporales
tDisjoint({geometry,tpcpoint},{geometry,tpcpoint}) → tbool
tDwithin({geometry,tpcpoint},{geometry,tpcpoint},float) → tbool
tIntersects({geometry,tpcpoint},{geometry,tpcpoint}) → tbool
tContains(geometry,tpcpoint) → tbool
tCovers(geometry,tpcpoint) → tbool
tTouches(geometry,tpcpoint) → tbool
tTouches(tpcpoint,geometry) → tbool
Un punto de nube de puntos temporal declara las relaciones que declara su destino de conversión, de modo que tContains y tCovers toman la geometría en primer lugar únicamente y tTouches no tiene dirección entre dos puntos de nube de puntos. Las tres son relaciones planares: un esquema cuyas dimensiones no incluyen Z las responde, y uno que lleva Z encuentra el rechazo The tgeompoint cannot have Z dimension.
SELECT tIntersects(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), geometry 'Polygon((0 0,0 2,2 2,2 0,0 0))'); -- t@2001-01-01 SELECT tDisjoint(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), geometry 'Polygon((0 0,0 2,2 2,2 0,0 0))'); -- f@2001-01-01 SELECT tDisjoint(tpcpoint(pcpoint(1, 9, 9, 9), '2001-01-02'::timestamptz), geometry 'Polygon((0 0,0 2,2 2,2 0,0 0))'); -- t@2001-01-02 SELECT tDisjoint(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 9, 9, 9), '2001-01-01'::timestamptz)); -- t@2001-01-01 SELECT tDwithin(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), geometry 'Point(1 2)', 2.0); -- t@2001-01-01 SELECT tDwithin(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), geometry 'Point(1 5)', 2.0); -- f@2001-01-01