Puntos de nube de puntos temporales

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.

Entrada y salida

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

Constructores

  • 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
    

Conversiones

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

Accesores

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

Transformaciones

  • 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
    

Modificaciones

  • 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
    

Restricciones

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

Operaciones de división

  • 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]"}
    

Operaciones de caja delimitadora

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
    

Operaciones de distancia

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

Relaciones siempre y alguna vez

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
    

Relaciones espaciotemporales

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

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