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.
Presentamos a continuación las funciones y operadores para los puntos de nube de puntos temporales. La mayoría de las funciones y operadores para tipos temporales descritos en los capítulos anteriores pueden aplicarse a los puntos de nube de puntos temporales. Por lo tanto, en las signaturas de las funciones, la notación base representa un pcpoint y las notaciones ttype y tpoint representan también un tpcpoint. Para evitar redundancias, solo presentamos a continuación algunos ejemplos de estas funciones y operadores para los puntos de nube de puntos temporales.
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.
Devuelve la representación textual de un tpcpoint, o de un arreglo de ellos, con o sin su SRID, y convertir un tpcpoint a texto
asText(tpcpoint) → text asText(tpcpoint[]) → text[] asEWKT(tpcpoint) → text asEWKT(tpcpoint[]) → text[] tpcpoint::text → text
asEWKT antepone el SRID que declara el esquema del pcid, y escribe solo la forma textual bajo un esquema que no declara ninguno, como el pcid 1 a continuación.
-- The pcpoint payload renders as hex-encoded WKB. SELECT asText(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz)); -- 5C00000001000000640000006400000064000000000000@2001-01-01 SELECT asEWKT(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz)); -- 5C00000001000000640000006400000064000000000000@2001-01-01
Devuelve la representación JSON de características móviles (MF-JSON)
asMFJSON(tpcpoint,options int=0,flags int=0,maxdecimaldigits int=15) → text
Un tpcpoint se emite como {"type":"MovingPCPoint", … "coordinates":[[X,Y,Z], …], "datetimes":[…]}, y las X, Y y Z de cada instante se leen de su pcpoint mediante la caché de esquemas; un esquema que no indica ni X ni Y deja vacío el array de coordenadas de ese instante.
SELECT asMFJSON(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz));
/* {"type":"MovingPCPoint","coordinates":[[1,1,1]],
"datetimes":["2001-01-01T00:00:00"],"interpolation":"None"} */
Devuelve la representación binaria o binaria bien conocida hexadecimal de un tpcpoint, con o sin su SRID
asBinary(tpcpoint,endian text='') → bytea asEWKB(tpcpoint,endian text='') → bytea asHexWKB(tpcpoint,endian text='') → text asHexEWKB(tpcpoint,endian text='') → text
SELECT tpcpointFromEWKB(asEWKB(t)) = t FROM (SELECT tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz) AS t) s; -- t
Devuelve un tpcpoint a partir de su representación textual, binaria o binaria bien conocida hexadecimal, con o sin su SRID
tpcpointFromText(text) → tpcpoint tpcpointFromEWKT(text) → tpcpoint tpcpointFromBinary(bytea) → tpcpoint tpcpointFromEWKB(bytea) → tpcpoint tpcpointFromHexWKB(text) → tpcpoint tpcpointFromHexEWKB(text) → tpcpoint
El pcid que lleva cada punto nombra su esquema, por lo que la forma textual se lee de vuelta como la binaria, y un SRID indicado por la entrada debe ser el que declara ese esquema.
SELECT tpcpointFromText(asText(t)) = t
FROM (SELECT tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz) AS t) s;
-- t
SELECT tpcpointFromEWKT('SRID=4326;' ||
asText(tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz)));
-- ERROR: The SRID of a pcpoint is the one its schema declares and cannot be set
asText no toma un argumento maxdecimaldigits, ya que un pcpoint se imprime como el WKB hexadecimal de su forma serializada, que no tiene decimales que redondear. MF-JSON es solo de salida, ya que indica las X, Y y Z de cada punto y no las demás dimensiones de su esquema, y lleva una clave "bbox" cuando options es 1, un objeto JSON TPCBox que añade un campo "pcid" junto al array "bbox" con forma de stbox estándar.
Constructor para puntos de nube de puntos temporales con un valor constante
tpcpoint(pcpoint,timestamptz) → tpcpointInst tpcpoint(pcpoint,tstzset) → tpcpointDiscSeq tpcpoint(pcpoint,tstzspan,interp text='step') → tpcpointContSeq tpcpoint(pcpoint,tstzspanset,interp text='step') → tpcpointSeqSet
SELECT asText(tpcpoint(pcpoint(1, 1, 1, 1), timestamptz '2001-01-01')); -- 5C00000001000000640000006400000064000000000000@2001-01-01 SELECT asText(tpcpoint(pcpoint(1, 1, 1, 1), tstzspan '[2001-01-01, 2001-01-02]')); -- [5C000000010000006400…000000@2001-01-01, 5C000000010000006400…000000@2001-01-02]
Constructor para puntos de nube de puntos temporales de subtipo secuencia
tpcpointSeq(tpcpointInst[],interp text='step',leftInc boolean=true, rightInc boolean=true) → tpcpointSeq
La interpolación es 'discrete' o 'step'; las dimensiones que lleva un pcpoint no interpolan linealmente, por lo que 'linear' genera The temporal type cannot have linear interpolation.
SELECT tpcpointSeq(ARRAY[tpcpoint(pcpoint(1, 1.0, 2.0, 3.0), '2024-01-01'::timestamptz), tpcpoint(pcpoint(1, 4.0, 5.0, 6.0), '2024-01-02'::timestamptz)], 'step');
Construye un pcpoint temporal de subtipo conjunto de secuencias a partir de un array de secuencias
tpcpointSeqSet(tpcpoint[]) → tpcpointSeqSet
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
Convierte un punto de nube de puntos temporal a un punto de geometría temporal
tpcpoint::tgeompoint
Toda dimensión no espacial se proyecta y las marcas temporales se preservan. El resultado lleva el SRID que indica el esquema, y es tridimensional cuando el esquema indica una dimensión Z. No se proporciona la conversión inversa, ya que reconstruir un pcpoint necesita un esquema destino que el valor temporal por sí solo no lleva.
SELECT ST_AsText(startValue(tpcpoint(pcpoint(1, 10.0, 20.0, 30.0), '2024-01-01'::timestamptz)::tgeompoint)); -- POINT Z (10 20 30)
Devuelve 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
Devuelve el SRID heredado del esquema
SRID({tpcpoint,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(pcpatch(pcpoint(1, 1, 1, 1)), '2001-01-01'::timestamptz)); -- 0
Proyecta un tpcpoint sobre una dimensión espacial, produciendo un tfloat
getX(tpcpoint) → tfloat getY(tpcpoint) → tfloat getZ(tpcpoint) → tfloat
SELECT startValue(getX(tpcpoint(pcpoint(1, 10.0, 20.0, 30.0), '2024-01-01'::timestamptz))); -- 10
Proyecta 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]
Transforma un tpcpoint en otro subtipo
tpcpointInst(tpcpoint) → tpcpoint tpcpointSeq(tpcpoint,interp text='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
Transforma 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
Inserta 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
Elimina un selector de tiempo (marca de tiempo, conjunto, período o conjunto de spans) de un tpcpoint
deleteTime(tpcpoint,time,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ñade 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
Restringe 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
Restringe un tpcpoint a un selector temporal (marca de tiempo, periodo, conjunto o spanset), o eliminarlo
atTime(tpcpoint,time) → tpcpoint minusTime(tpcpoint,time) → 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
Restringe un tpcpoint al extent espacial / temporal de un tpcbox, o eliminarlo
atTpcbox(tpcpoint,tpcbox,border_inc boolean=true) → tpcpoint minusTpcbox(tpcpoint,tpcbox,border_inc boolean=true) → tpcpoint
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
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)]), tpcboxZT(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)]), tpcboxZT(10, 10, 10, 12, 12, 12, tstzspan '[2001-01-01, 2001-01-03]', 1))); -- 3
Restringe un tpcpoint a los instantes anteriores o posteriores a una marca de tiempo
beforeTimestamp(tpcpoint,timestamptz,strict boolean=true) → tpcpoint afterTimestamp(tpcpoint,timestamptz,strict boolean=true) → tpcpoint
El indicador strict excluye el instante en la marca de tiempo misma
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]
Devuelve 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)}
Fragmenta un tpcpoint en fragmentos, uno por cada intervalo de tiempo
timeSplit(tpcpoint,duration 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 “Operaciones topológicas” y “Operaciones de posición” para la geometría por operador. Cada operador a continuación está conectado contra tpcbox, tstzspan y el propio tpcpoint.
Operadores topológicos
{tstzspan,tpcbox,tpcpoint} {&&, @>, <@, ~=, -|-} {tstzspan,tpcbox,tpcpoint} → boolean
SELECT tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]) && tstzspan '[2001-01-02, 2001-01-04]'; -- true SELECT tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]) @> tpcboxZ(1, 1, 1, 2, 2, 2, 1); -- true
Operadores de posición
{tpcbox,tpcpoint} {<<, >>, <<|, |>>, <</, />>} {tpcbox,tpcpoint} → boolean
{tstzspan,tpcbox,tpcpoint} {<<#, #>>} {tstzspan,tpcbox,tpcpoint} → boolean
SELECT tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]) << tpcboxZ(10, 10, 10, 12, 12, 12, 1); -- true SELECT tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 3, 3, 3), '2001-01-03'::timestamptz)]) <<# tstzspan '[2001-01-05, 2001-01-06]'; -- true
Devuelve la distancia más cercana
nearestApproachDistance(tpcpoint,{tpcbox,tpcpoint}) → float
Dos valores cuyos esquemas difieren no son comparables, por lo que un desajuste de pcid genera Operation on pcpoint values with different schemas, nombrando ambos, en lugar de responder.
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)]), tpcboxZ(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
Devuelve el instante del tpcpoint en el que los dos argumentos están a la distancia más cercana
nearestApproachInstant({geometry,tpcpoint},{geometry,tpcpoint}) → tpcpoint
SELECT asText(nearestApproachInstant(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 4, 4, 4), '2001-01-02'::timestamptz)]), geometry 'Point Z(5 5 5)')); -- 5C00000001000000900100009001000090010000000000@2001-01-02
Devuelve la línea que une el punto de acercamiento más cercano entre los dos argumentos
shortestLine({geometry,tpcpoint},{geometry,tpcpoint}) → geometry
SELECT ST_AsText(shortestLine(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 4, 4, 4), '2001-01-02'::timestamptz)]), geometry 'Point Z(5 5 5)')); -- LINESTRING Z (4 4 4,5 5 5)
Devuelve la distancia temporal
{geometry,tpcpoint} <-> {geometry,tpcpoint} → tfloat
SELECT round(tpcpointSeq(ARRAY[ tpcpoint(pcpoint(1, 1, 1, 1), '2001-01-01'::timestamptz), tpcpoint(pcpoint(1, 4, 4, 4), '2001-01-02'::timestamptz)]) <-> geometry 'Point Z(5 5 5)', 4); -- [6.9282@2001-01-01, 1.7321@2001-01-02]
Un tpcpoint se proyecta a un tgeompoint mediante la caché de esquemas y la relación se responde allí, de modo que un tpcpoint declara las relaciones que declara su destino de conversión.
Relaciones ever y always
eContains(geometry,tpcpoint) → boolean
aContains(geometry,tpcpoint) → boolean
eCovers(geometry,tpcpoint) → boolean
aCovers(geometry,tpcpoint) → boolean
eDisjoint({geometry,tpcpoint},{geometry,tpcpoint}) → boolean
aDisjoint({geometry,tpcpoint},{geometry,tpcpoint}) → boolean
eDwithin({geometry,tpcpoint},{geometry,tpcpoint},dist float) → boolean
aDwithin({geometry,tpcpoint},{geometry,tpcpoint},dist float) → boolean
eIntersects({geometry,tpcpoint},{geometry,tpcpoint}) → boolean
aIntersects({geometry,tpcpoint},{geometry,tpcpoint}) → boolean
eTouches(geometry,tpcpoint) → boolean
aTouches(geometry,tpcpoint) → boolean
eTouches(tpcpoint,geometry) → boolean
aTouches(tpcpoint,geometry) → boolean
Un punto en movimiento ni contiene ni cubre una geometría, y dos puntos en movimiento no se tocan, por lo que eContains, eCovers y sus gemelas always toman primero la geometría, y eTouches y aTouches leen cualquiera de los dos órdenes pero no dos puntos. Son relaciones planares, por lo que un punto cuyo esquema indica una dimensión Z encuentra el rechazo The tgeompoint cannot have Z dimension.
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 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 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 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 espaciotemporales
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
Comparaciones tradicionales
tpcpoint {=, <>, <, <=, >, >=} tpcpoint → boolean
El orden es lexicográfico sobre las codificaciones canónicas de los dos valores, no geométrico.
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
Comparaciones alguna vez y siempre
{pcpoint,tpcpoint} {?=, %=, ?<>, %<>} {pcpoint,tpcpoint} → boolean
SELECT 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 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
Comparaciones temporales
{pcpoint,tpcpoint} {#=, #<>} {pcpoint,tpcpoint} → tbool
SELECT 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]