Cadenas de poses temporales

El tipo de cadena de poses temporal tposechain representa la evolución en el tiempo de una cadena de marcos anidados, es decir, de un objeto articulado cuyas articulaciones se mueven unas respecto de otras. Como todos los tipos temporales, tiene tres subtipos, a saber, instante, secuencia y conjunto de secuencias. A continuación se dan ejemplos de valores tposechain en estos subtipos.

SELECT asEWKT(tposechain 'PoseChain(Pose(Point(1 1), 0.5), Pose(Point(2 0),
  0))@2001-01-01');
-- PoseChain(Pose(POINT(1 1),0.5),Pose(POINT(2 0),0))@2001-01-01
SELECT asEWKT(tposechain '{PoseChain(Pose(Point(1 1), 0.3))@2001-01-01,
  PoseChain(Pose(Point(1 1), 0.5))@2001-01-02}');
-- {PoseChain(Pose(POINT(1 1),0.3))@2001-01-01,
-- PoseChain(Pose(POINT(1 1),0.5))@2001-01-02}
SELECT asEWKT(tposechain '[PoseChain(Pose(Point(1 1), 0.2))@2001-01-01,
  PoseChain(Pose(Point(1 1), 0.5))@2001-01-03]');
-- [PoseChain(Pose(POINT(1 1),0.2))@2001-01-01,
-- PoseChain(Pose(POINT(1 1),0.5))@2001-01-03]
SELECT asEWKT(tposechain '{[PoseChain(Pose(Point(1 1), 1))@2001-01-01,
  PoseChain(Pose(Point(2 2), 1))@2001-01-02],
  [PoseChain(Pose(Point(2 2), 2))@2001-01-04]}');
/* {[PoseChain(Pose(POINT(1 1),1))@2001-01-01, PoseChain(Pose(POINT(2 2),1))@2001-01-02],
   [PoseChain(Pose(POINT(2 2),2))@2001-01-04]} */

Todos los valores de una cadena de poses temporal tienen el mismo número de eslabones. Una cadena que gana una articulación es una estructura distinta y no un valor posterior de la misma, y ese número constante es también lo que hace que la interpolación siguiente esté bien definida. En caso contrario se genera un error.

SELECT tposechain '[PoseChain(Pose(Point(0 0), 0))@2001-01-01,
  PoseChain(Pose(Point(0 0), 0), Pose(Point(1 0), 0))@2001-01-02]';
-- ERROR:  Operation on pose chains of 1 and 2 links

Una cadena de poses temporal se interpola eslabón por eslabón, cada eslabón como lo hace una pose, es decir, linealmente en la posición y a lo largo del arco más corto en la rotación. En el ejemplo siguiente un brazo de dos eslabones gira un cuarto de vuelta en el hombro mientras el codo permanece donde está: a la mitad, el hombro ha girado un octavo de vuelta y el codo no ha cambiado.

SELECT asEWKT(round(valueAtTimestamp(tposechain
  '[PoseChain(Pose(Point(0 0), 0), Pose(Point(10 0), 0))@2001-01-01,
    PoseChain(Pose(Point(0 0), 1.5707963267948966), Pose(Point(10 0), 0))@2001-01-03]',
  timestamptz '2001-01-02'), 6));
-- PoseChain(Pose(POINT(0 0),0.785398),Pose(POINT(10 0),0))

Como para los demás tipos espaciotemporales, el tipo de cadena de poses temporal acepta modificadores de tipo (o typmod en la terminología de PostgreSQL) para especificar el subtipo, la dimensionalidad y/o el identificador de referencia espacial (SRID).

SELECT asEWKT(tposechain(Sequence,5676) 'SRID=5676;[PoseChain(Pose(Point(1 1),
  0.2))@2001-01-01,
  PoseChain(Pose(Point(1 1), 0.5))@2001-01-03]');
/* SRID=5676;[PoseChain(Pose(POINT(1 1),0.2))@2001-01-01,
   PoseChain(Pose(POINT(1 1),0.5))@2001-01-03] */
SELECT tposechain(Sequence) 'PoseChain(Pose(Point(1 1), 0.2))@2001-01-01';
/* ERROR:  Temporal subtype of the tposechain value (Instant) does not match
   column subtype (Sequence) */

A continuación damos las funciones y los operadores para las cadenas de poses temporales. La mayoría de las funciones y los operadores para los tipos temporales y espaciotemporales descritos en los capítulos anteriores pueden aplicarse a las cadenas de poses temporales. Por lo tanto, en las firmas de las funciones, el tipo posechain puede usarse siempre que se especifiquen los tipos base y spatial, y el tipo tposechain puede usarse siempre que se especifiquen los tipos ttype y tspatial. Para evitar redundancias, solo presentamos algunos ejemplos de estas funciones y operadores y remitimos a los capítulos anteriores para explicaciones detalladas sobre ellos.

Una cadena de poses no tiene función de distancia, ya que la distancia entre dos configuraciones articuladas no está definida por el estándar que sigue el tipo. Por ello el tipo de cadena de poses temporal no tiene ni las relaciones espaciales siempre y alguna vez ni las temporales, todas ellas definidas en términos de una distancia.

Entrada y salida

  • Devuelve la representación de texto conocido (WKT) o de texto conocido extendido (EWKT)

    asText({tposechain,tposechain[]}) → {text,text[]}
    asEWKT({tposechain,tposechain[]}) → {text,text[]}
    
    SELECT asText(tposechain 'PoseChain(Pose(Point(1 1), 0.5))@2001-01-01');
    -- PoseChain(Pose(POINT(1 1),0.5))@2001-01-01
    
  • Devuelve una cadena de poses temporal a partir de su representación textual o binaria

    tposechainFromText(text) → tposechain
    tposechainFromBinary(bytea) → tposechain
    tposechainFromHexEWKB(text) → tposechain
    
    SELECT asEWKT(tposechainFromText('SRID=5676;PoseChain(Pose(Point(1 1),0.5))@2001-01-01'));
    -- SRID=5676;PoseChain(Pose(POINT(1 1),0.5))@2001-01-01
    SELECT asEWKT(tposechainFromBinary(asBinary(tposechain
      'PoseChain(Pose(Point(1 1), 0.5))@2001-01-01')));
    -- PoseChain(Pose(POINT(1 1),0.5))@2001-01-01
    SELECT asEWKT(tposechainFromHexEWKB(asHexEWKB(tposechain
      'SRID=5676;PoseChain(Pose(Point(1 1), 0.5))@2001-01-01')));
    -- SRID=5676;PoseChain(Pose(POINT(1 1),0.5))@2001-01-01
    
  • Devuelve la representación JSON de Moving Features

    asMFJSON(tposechain) → text
    

    Una cadena se escribe como el arreglo de sus eslabones, en el orden que indica en el marco de quién se lee cada uno de ellos.

    SELECT asMFJSON(tposechain 'PoseChain(Pose(Point(1 1), 0.5))@2001-01-01');
    /* {"type":"MovingPoseChain","values":[[{"position":{"lat":1,"lon":1},"yaw":0.5}]],
       "datetimes":["2001-01-01T00:00:00-08"],"interpolation":"None"} */
    

Constructores

  • Construye una cadena de poses temporal a partir de una cadena de poses y un valor de tiempo

    tposechain(posechain, timestamptz) → tposechain
    tposechain(posechain, tstzset) → tposechain
    tposechain(posechain, tstzspan, text DEFAULT 'linear') → tposechain
    tposechain(posechain, tstzspanset, text DEFAULT 'linear') → tposechain
    
    SELECT asEWKT(tposechain(posechain 'PoseChain(Pose(Point(1 1), 0.5))',
      timestamptz '2001-01-01'));
    -- PoseChain(Pose(POINT(1 1),0.5))@2001-01-01
    SELECT asEWKT(tposechain(posechain 'PoseChain(Pose(Point(1 1), 0.5))',
      tstzset '{2001-01-01, 2001-01-02}'));
    -- {PoseChain(Pose(POINT(1 1),0.5))@2001-01-01,
    -- PoseChain(Pose(POINT(1 1),0.5))@2001-01-02}
    SELECT asEWKT(tposechain(posechain 'PoseChain(Pose(Point(1 1), 0.5))',
      tstzspan '[2001-01-01, 2001-01-02]'));
    -- [PoseChain(Pose(POINT(1 1),0.5))@2001-01-01,
    -- PoseChain(Pose(POINT(1 1),0.5))@2001-01-02]
    

Conversiones

  • Convierte una cadena de poses temporal en una pose temporal

    tpose(tposechain) → tpose
    

    Cada instante contiene la pose a la que compone toda la cadena, que es donde se sitúa su marco más interno en el marco de la cadena. El resultado es una función escalonada: componer una cadena multiplica las rotaciones de sus eslabones, por lo que la pose de la cadena interpolada entre dos instantes no es la pose interpolada entre las dos poses compuestas, y un resultado lineal respondería una pose que la cadena nunca tiene. Una cadena de un solo eslabón se compone a sí misma, y allí la interpolación del argumento se conserva sin cambios.

    SELECT asEWKT(round(tpose(tposechain
      'PoseChain(Pose(Point(0 0), 0), Pose(Point(10 0), 0))@2001-01-01'), 6));
    -- Pose(POINT(10 0),0)@2001-01-01
    SELECT asEWKT(round((tposechain
      '[PoseChain(Pose(Point(0 0), 0), Pose(Point(10 0), 0))@2001-01-01,
        PoseChain(Pose(Point(0 0), 1.5707963267948966), Pose(Point(10 0),
      0))@2001-01-03]')::tpose, 6));
    /* Interp=Step;[Pose(POINT(10 0),0)@2001-01-01,
       Pose(POINT(0 10),1.570796)@2001-01-03] */
    

Funciones de acceso

  • Devuelve el número de eslabones que tiene todo valor de una cadena de poses temporal

    numPoses(tposechain) → integer
    

    El número es el mismo en todo instante, por lo que un instante responde por todo el valor.

    SELECT numPoses(tposechain
      'PoseChain(Pose(Point(0 0), 0), Pose(Point(10 0), 0))@2001-01-01');
    -- 2
    
  • Devuelve el valor de un instante temporal, el conjunto de valores o el lapso de tiempo

    getValue(tposechain) → posechain
    getValues(tposechain) → posechainset
    timeSpan(tposechain) → tstzspan
    
    SELECT asEWKT(getValue(tposechain 'PoseChain(Pose(Point(1 1), 0.5))@2001-01-01'));
    -- PoseChain(Pose(POINT(1 1),0.5))
    SELECT asEWKT(getValues(tposechain '{PoseChain(Pose(Point(1 1), 0.5))@2001-01-01,
      PoseChain(Pose(Point(2 2), 0.5))@2001-01-02}'));
    -- {"PoseChain(Pose(POINT(1 1),0.5))", "PoseChain(Pose(POINT(2 2),0.5))"}
    SELECT timeSpan(tposechain '[PoseChain(Pose(Point(1 1), 0.5))@2001-01-01,
      PoseChain(Pose(Point(2 2), 0.5))@2001-01-02]');
    -- [2001-01-01, 2001-01-02]
    
  • Devuelve la caja espaciotemporal de una cadena de poses temporal

    stbox(tposechain) → stbox
    

    La caja abarca la posición compuesta de cada prefijo de la cadena, es decir, de cada una de sus articulaciones, y no solo la posición que almacenan sus eslabones.

    SELECT round(stbox(tposechain
      '[PoseChain(Pose(Point(0 0), 0), Pose(Point(10 0), 0))@2001-01-01,
        PoseChain(Pose(Point(1 5), 0), Pose(Point(10 0), 0))@2001-01-02]'), 6);
    -- STBOX XT(((0,0),(11,5)),[2001-01-01, 2001-01-02])
    

Funciones de transformación

  • Redondea las coordenadas a un número de decimales, o desplaza el tiempo

    round(tposechain, integer DEFAULT 0) → tposechain
    shiftTime(tposechain, interval) → tposechain
    
    SELECT asEWKT(round(tposechain
      'PoseChain(Pose(Point(1.123456789 2.123456789), 0.5))@2001-01-01', 3));
    -- PoseChain(Pose(POINT(1.123 2.123),0.5))@2001-01-01
    SELECT asEWKT(shiftTime(tposechain 'PoseChain(Pose(Point(1 1), 0.5))@2001-01-01',
      interval '1 day'));
    -- PoseChain(Pose(POINT(1 1),0.5))@2001-01-02
    

Sistema de referencia espacial

  • Devuelve o establece el identificador de referencia espacial del marco exterior de una cadena de poses temporal

    SRID(tposechain) → integer
    setSRID(tposechain,integer) → tposechain
    
    SELECT SRID(tposechain 'SRID=3812;{PoseChain(Pose(Point(1 2),0),
      Pose(Point(3 0),0.5))@2001-01-01, PoseChain(Pose(Point(2 3),0),
      Pose(Point(3 0),0.5))@2001-01-02}');
    -- 3812
    SELECT asEWKT(setSRID(tposechain '{PoseChain(Pose(Point(1 2),0))@2001-01-01,
      PoseChain(Pose(Point(2 3),0))@2001-01-02}', 3812));
    /* SRID=3812;{PoseChain(Pose(POINT(1 2),0))@2001-01-01,
       PoseChain(Pose(POINT(2 3),0))@2001-01-02} */
    
  • Transforma a un identificador de referencia espacial

    transform(tposechain,integer) → tposechain
    transformPipeline(tposechain,pipeline text,to_srid integer,
      is_forward boolean=true) → tposechain
    

    La cadena de cada instante se transforma como se transforma la cadena estática correspondiente, es decir, solo se transforma el eslabón exterior, tal como se describe para transform.

    SELECT asEWKT(round(transform(tposechain 'SRID=4326;PoseChain(
      Pose(Point(4.35 50.85),1),Pose(Point(10 0),0))@2001-01-01', 3812), 6));
    /* SRID=3812;PoseChain(Pose(POINT(648679.018035 671067.055638),1),
       Pose(POINT(10 0),0))@2001-01-01 */
    SELECT asEWKT(round(transformPipeline(tposechain
      'SRID=4326;PoseChain(Pose(Point(4.35 50.85),1))@2001-01-01',
      'urn:ogc:def:coordinateOperation:EPSG::16031', 4326), 6));
    -- SRID=4326;PoseChain(Pose(POINT(595032.294558 5634012.833372),1))@2001-01-01
    

Cadena compuesta OGC GeoPose

  • Escribe o lee un documento de cadena compuesta OGC GeoPose

    asGeoPose(tposechain,maxdecimaldigits integer=-1) → text
    tposechainFromGeoPose(text) → tposechain
    

    Un documento de cadena es un marco exterior y una secuencia de transformaciones que alcanza un marco interior final, que es lo que contiene una cadena de poses. El documento nombra el marco LTP-ENU tangente en la posición del eslabón exterior y una transformación por eslabón: la primera lleva ese marco tangente al marco propio del eslabón exterior, y cada una posterior es el eslabón tal como se almacena, leído en los ejes de su padre.

    El documento lleva un único tiempo de validez, por lo que se escribe a partir de un solo instante; atTime obtiene uno de un valor más largo. Su cadena de marcos contiene al menos dos marcos, por lo que una cadena de un solo eslabón no tiene documento de cadena.

    La clase de cadena nombra sus dos marcos /Extrinsic/LTP-ENU e /Intrinsic/Translate-Rotate, mientras que las clases Advanced, Series y Stream nombran esos mismos dos marcos LTP-ENU y RotateTranslate. Un documento se escribe con el par que usa su propia clase, y cualquiera de los dos pares se acepta al leer.

    SELECT asGeoPose(tposechain 'SRID=4326;PoseChain(
      GeodPose(Point Z(-122.3 47.7 11), 1, 0, 0, 0),
      Pose(Point Z(2 0 0), 1, 0, 0, 0))@2021-04-28 05:36:10.083+00', 6);
    /* {"validTime":1619588170083,"outerFrame":{"authority":"/geopose/1.0",
       "id":"/Extrinsic/LTP-ENU","parameters":"longitude=-122.3&latitude=47.7&
       height=11&crs=EPSG:4979"},"frameChain":[{"authority":"/geopose/1.0",
       "id":"/Intrinsic/Translate-Rotate","parameters":"translation=[0, 0, 0]&
       rotation=[1, 0, -1.38778e-17, 0]"},{"authority":"/geopose/1.0",
       "id":"/Intrinsic/Translate-Rotate","parameters":"translation=[2, 0, 0]&
       rotation=[1, 0, 0, 0]"}]} */
    

Grafo compuesto OGC GeoPose

  • Escribe un documento de grafo compuesto OGC GeoPose

    asGeoPose(tposechain[],maxdecimaldigits integer=-1) → text
    

    Un documento de grafo es un conjunto de marcos y las transformaciones entre ellos, que es lo que contienen varias cadenas de poses que comparten su marco más exterior. La lista de marcos nombra el marco LTP-ENU tangente en ese eslabón más exterior seguido de los eslabones de cada cadena, y la lista de transformaciones nombra el padre y el hijo de cada arista por su posición en esa lista. Las aristas no llevan transformación propia; esta reside en los marcos que nombran.

    El documento lleva un único tiempo de validez, por lo que se escribe a partir de cadenas leídas en uno y el mismo instante; atTime las obtiene de valores más largos. Su lista de marcos contiene al menos dos marcos, que un solo eslabón de una sola cadena ya proporciona junto al marco tangente.

    SELECT asGeoPose(ARRAY[
      tposechain 'SRID=4326;PoseChain(
        GeodPose(Point Z(-122.3 47.7 11), 1, 0, 0, 0),
        Pose(Point Z(2 0 0), 1, 0, 0, 0))@2021-04-28 05:36:10.083+00',
      tposechain 'SRID=4326;PoseChain(
        GeodPose(Point Z(-122.3 47.7 11), 1, 0, 0, 0),
        Pose(Point Z(0 3 0), 1, 0, 0, 0))@2021-04-28 05:36:10.083+00'], 6);
    /* {"validTime":1619588170083,"frameList":[{"authority":"/geopose/1.0",
       "id":"/Extrinsic/LTP-ENU","parameters":"longitude=-122.3&latitude=47.7&
       height=11&crs=EPSG:4979"},{"authority":"/geopose/1.0",
       "id":"/Intrinsic/Translate-Rotate","parameters":"translation=[0, 0, 0]&
       rotation=[1, 0, -1.38778e-17, 0]"},{"authority":"/geopose/1.0",
       "id":"/Intrinsic/Translate-Rotate","parameters":"translation=[2, 0, 0]&
       rotation=[1, 0, 0, 0]"},{"authority":"/geopose/1.0",
       "id":"/Intrinsic/Translate-Rotate","parameters":"translation=[0, 0, 0]&
       rotation=[1, 0, -1.38778e-17, 0]"},{"authority":"/geopose/1.0",
       "id":"/Intrinsic/Translate-Rotate","parameters":"translation=[0, 3, 0]&
       rotation=[1, 0, 0, 0]"}],"transformList":[{"link":[0,1]},{"link":[1,2]},
       {"link":[0,3]},{"link":[3,4]}]} */
    

Funciones de restricción

  • Restringe una cadena de poses temporal a un tiempo o a un valor

    atTime(tposechain, time) → tposechain
    atValue(tposechain, posechain) → tposechain
    
    SELECT asEWKT(atTime(tposechain '[PoseChain(Pose(Point(1 1), 0.5))@2001-01-01,
      PoseChain(Pose(Point(2 2), 0.5))@2001-01-03]', timestamptz '2001-01-02'));
    -- PoseChain(Pose(POINT(1.5 1.5),0.5))@2001-01-02
    SELECT asEWKT(atValue(tposechain '{PoseChain(Pose(Point(1 1), 0.5))@2001-01-01,
      PoseChain(Pose(Point(2 2), 0.5))@2001-01-02}',
      posechain 'PoseChain(Pose(Point(2 2), 0.5))'));
    -- {PoseChain(Pose(POINT(2 2),0.5))@2001-01-02}
    

Funciones y operadores de comparación

  • Compara dos cadenas de poses temporales, o una cadena de poses temporal y una cadena de poses

    tposechain operator tposechain → boolean
    eEq(tposechain, posechain) → boolean
    
    SELECT tposechain 'PoseChain(Pose(Point(1 1), 0.5))@2001-01-01' =
      tposechain 'PoseChain(Pose(Point(1 1), 0.5))@2001-01-01';
    -- t
    SELECT eEq(tposechain '{PoseChain(Pose(Point(1 1), 0.5))@2001-01-01,
      PoseChain(Pose(Point(2 2), 0.5))@2001-01-02}',
      posechain 'PoseChain(Pose(Point(2 2), 0.5))');
    -- t
    

Operadores topológicos y de posición

  • Compara la caja delimitadora de una cadena de poses temporal con otra caja delimitadora

    tposechain op {stbox,tposechain} → boolean
    
    SELECT tposechain '[PoseChain(Pose(Point(1 1), 0.5))@2001-01-01,
      PoseChain(Pose(Point(2 2), 0.5))@2001-01-02]' && stbox 'STBOX X((1,1),(2,2))';
    -- t
    SELECT tposechain '[PoseChain(Pose(Point(1 1), 0.5))@2001-01-01,
      PoseChain(Pose(Point(2 2), 0.5))@2001-01-02]' <<# tstzspan '[2001-01-03, 2001-01-04]';
    -- t
    

Relaciones espaciales temporales

  • Las relaciones temporales calculan la relación topológica o de distancia en cada instante y dan como resultado un tbool. Una cadena de poses temporal las responde en la posición que ocupa la pose que compone, de modo que una cadena con interpolación lineal se responde a lo largo de su trayectoria y no solo en sus instantes. La cadena declara las relaciones que responde un punto en movimiento: tContains y tCovers toman la geometría en primer lugar únicamente, y tTouches no tiene dirección entre dos cadenas, ya que un punto en movimiento no contiene ni cubre una geometría y dos puntos en movimiento no se tocan.

    tContains(geometry,tposechain) → tbool
    tCovers(geometry,tposechain) → tbool
    tDisjoint({geometry,tposechain},{geometry,tposechain}) → tbool
    tDwithin({geometry,tposechain},{geometry,tposechain},float) → tbool
    tIntersects({geometry,tposechain},{geometry,tposechain}) → tbool
    tTouches(geometry,tposechain) → tbool
    tTouches(tposechain,geometry) → tbool
    
    SELECT tIntersects(tposechain '{PoseChain(Pose(Point(1 1), 0.1))@2001-01-01,
      PoseChain(Pose(Point(3 3), 0.1))@2001-01-03}',
      geometry 'Polygon((0 0,0 2,2 2,2 0,0 0))');
    -- {t@2001-01-01, f@2001-01-03}
    SELECT tDisjoint(tposechain '{PoseChain(Pose(Point(1 1), 0.1))@2001-01-01,
      PoseChain(Pose(Point(3 3), 0.1))@2001-01-03}',
      geometry 'Polygon((0 0,0 2,2 2,2 0,0 0))');
    -- {f@2001-01-01, t@2001-01-03}
    SELECT tContains(geometry 'Polygon((0 0,0 2,2 2,2 0,0 0))',
      tposechain 'PoseChain(Pose(Point(0 0), 0.1))@2001-01-01');
    -- f@2001-01-01
    SELECT tCovers(geometry 'Polygon((0 0,0 2,2 2,2 0,0 0))',
      tposechain 'PoseChain(Pose(Point(0 0), 0.1))@2001-01-01');
    -- t@2001-01-01
    SELECT tDwithin(tposechain 'PoseChain(Pose(Point(1 1), 0.1))@2001-01-01',
      tposechain 'PoseChain(Pose(Point(1 2), 0.1))@2001-01-01', 2.0);
    -- t@2001-01-01
    

Agregaciones

  • Conteo temporal

    tCount(tposechain) → {tintSeq,tintSeqSet}
    
    WITH Temp(temp) AS (
      SELECT tposechain '[PoseChain(Pose(Point(1 1), 0.1))@2001-01-01,
        PoseChain(Pose(Point(1 1), 0.3))@2001-01-03)' UNION
      SELECT tposechain '[PoseChain(Pose(Point(1 1), 0.2))@2001-01-02,
        PoseChain(Pose(Point(1 1), 0.4))@2001-01-04)' UNION
      SELECT tposechain '[PoseChain(Pose(Point(1 1), 0.3))@2001-01-03,
        PoseChain(Pose(Point(1 1), 0.5))@2001-01-05)' )
    SELECT tCount(Temp)
    FROM Temp;
    -- {[1@2001-01-01, 2@2001-01-02, 1@2001-01-04, 1@2001-01-05)}
    
  • Conteo de ventana

    wCount(tposechain, interval) → {tintSeq,tintSeqSet}
    
    WITH Temp(temp) AS (
      SELECT tposechain '[PoseChain(Pose(Point(1 1), 0.1))@2001-01-01,
        PoseChain(Pose(Point(1 1), 0.3))@2001-01-03]' UNION
      SELECT tposechain '[PoseChain(Pose(Point(1 1), 0.2))@2001-01-02,
        PoseChain(Pose(Point(1 1), 0.4))@2001-01-04]' )
    SELECT wCount(Temp, interval '2 days')
    FROM Temp;
    /* {[1@2001-01-01, 2@2001-01-02, 2@2001-01-05],
       (1@2001-01-05, 1@2001-01-06]} */
    
  • Extensión del cuadro delimitador

    extent(tposechain) → stbox
    
    SELECT extent(temp) FROM ( VALUES
      (NULL::tposechain),
      (tposechain 'PoseChain(Pose(Point(1 1), 0.1))@2001-01-01'),
      (tposechain '{PoseChain(Pose(Point(2 2), 0.2))@2001-01-01,
        PoseChain(Pose(Point(3 3), 0.3))@2001-01-02}')) t(temp);
    -- STBOX XT(((1,1),(3,3)),[2001-01-01, 2001-01-02])
    
  • Fusionar las cadenas de poses temporales agregadas. El nombre merge denota la misma agregación

    mergeAgg(tposechain) → tposechain
    
    SELECT asText(mergeAgg(temp)) FROM (VALUES
      (tposechain 'PoseChain(Pose(Point(1 1), 0.1))@2001-01-01'),
      (tposechain 'PoseChain(Pose(Point(2 2), 0.2))@2001-01-02')) t(temp);
    /* {PoseChain(Pose(POINT(1 1),0.1))@2001-01-01,
       PoseChain(Pose(POINT(2 2),0.2))@2001-01-02} */
    
  • Agregar los instantes agregados en una secuencia. El nombre appendInstant denota la misma agregación

    appendInstantAgg(tposechain) → tposechain
    
    SELECT asText(appendInstantAgg(inst)) FROM (VALUES
      (tposechain 'PoseChain(Pose(Point(1 1), 0.1))@2001-01-01'),
      (tposechain 'PoseChain(Pose(Point(2 2), 0.2))@2001-01-02')) t(inst);
    /* [PoseChain(Pose(POINT(1 1),0.1))@2001-01-01,
       PoseChain(Pose(POINT(2 2),0.2))@2001-01-02] */
    
  • Agregar las secuencias agregadas en un conjunto de secuencias. El nombre appendSequence denota la misma agregación

    appendSequenceAgg(tposechain) → tposechain
    
    SELECT asText(appendSequenceAgg(seq)) FROM (VALUES
      (tposechain '[PoseChain(Pose(Point(1 1), 0.1))@2001-01-01]'),
      (tposechain '[PoseChain(Pose(Point(2 2), 0.2))@2001-01-02]')) t(seq);
    /* {[PoseChain(Pose(POINT(1 1),0.1))@2001-01-01],
       [PoseChain(Pose(POINT(2 2),0.2))@2001-01-02]} */