Capítulo 14. Cadenas de poses

Tabla de contenidos

Cadenas de poses estáticas
Entrada y salida
Constructores
Conversión de tipos
Accesores
Transformaciones
Sistema de referencia espacial
Comparaciones
Cadenas de poses temporales
Entrada y salida
Constructores
Conversiones
Funciones de acceso
Funciones de transformación
Sistema de referencia espacial
Cadena compuesta OGC GeoPose
Grafo compuesto OGC GeoPose
Funciones de restricción
Funciones y operadores de comparación
Operadores topológicos y de posición
Relaciones espaciales temporales
Agregaciones

El tipo posechain representa un cuerpo cuyas partes se sitúan unas respecto de otras: una cámara sobre un cardán sobre un vehículo, o un brazo cuyo antebrazo se sitúa respecto del brazo. Una cadena de poses es una lista ordenada de al menos una pose. El primer eslabón se expresa en el marco exterior de la cadena, y cada eslabón posterior se expresa en el marco que define el eslabón anterior, de modo que un eslabón indica dónde se sitúa una parte respecto de la parte que la sostiene y no respecto del mundo.

El estándar OGC GeoPose denomina a esta estructura una cadena de transformaciones de marcos, donde cada transformación es un par de marcos de referencia en el que el marco exterior es el dominio y el marco interior es el rango. El estándar establece que un marco interior no puede ser un marco topocéntrico, por lo que una cadena lleva exactamente un marco que nombra un lugar sobre la tierra, en su exterior. De ello se derivan dos propiedades, ambas verificadas: toda la cadena tiene un solo SRID y todos los eslabones tienen la misma dimensión. Solo el eslabón exterior puede ser geodésico y solo el eslabón exterior puede llevar un SRID.

La composición de todos los eslabones da la pose del marco más interior en el marco exterior de la cadena, que es lo que devuelve la conversión al tipo pose. Esa única conversión otorga a una cadena toda la superficie definida para las poses, de modo que el tipo en sí permanece reducido.

Cuando el marco exterior es geográfico, la posición del eslabón exterior está en grados mientras que la traslación de un eslabón posterior está en metros a lo largo de los ejes locales Este-Norte-Arriba en su marco padre. La composición realiza esa suma en coordenadas geocéntricas y lee de vuelta la posición como geográfica, de modo que una cadena sobre un marco geográfico se compone sobre el elipsoide y no en el plano, y la orientación se vuelve a expresar respecto de la base Este-Norte-Arriba en la posición que alcanza la composición.

Cadenas de poses estáticas

Entrada y salida

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

    asText({posechain,posechain[]}) → {text,text[]}
    asEWKT({posechain,posechain[]}) → {text,text[]}
    

    El eslabón exterior se escribe como una pose que lleva el marco de la cadena, y cada eslabón posterior se escribe sin él.

    SELECT asText(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),1))');
    -- PoseChain(Pose(POINT(0 0),0),Pose(POINT(1 0),1))
    SELECT asText(ARRAY[posechain 'PoseChain(Pose(Point(0 0),0))',
      'PoseChain(Pose(Point(1 1),2))']);
    -- {"PoseChain(Pose(POINT(0 0),0))","PoseChain(Pose(POINT(1 1),2))"}
    SELECT asEWKT(posechain 'SRID=3812;PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),1))');
    -- SRID=3812;PoseChain(Pose(POINT(0 0),0),Pose(POINT(1 0),1))
    
  • Devuelve la representación en binario conocido (WKB), en binario conocido extendido (EWKB), en binario conocido hexadecimal (HexWKB) o en binario conocido extendido hexadecimal (HexEWKB)

    asBinary(posechain,endian text='') → bytea
    asEWKB(posechain,endian text='') → bytea
    asHexWKB(posechain,endian text='') → text
    asHexEWKB(posechain,endian text='') → text
    

    La cadena escribe sus indicadores y su único SRID una sola vez, después el número de eslabones y después los valores de cada eslabón en orden. El resultado se codifica utilizando la codificación little-endian (NDR) o big-endian (XDR). Si no se especifica ninguna codificación, se utiliza la codificación de la máquina.

    SELECT asBinary(posechain 'PoseChain(Pose(Point(1 2),1))');
    -- \x010101000000000000000000f03f0000000000000040000000000000f03f
    SELECT asHexWKB(posechain 'PoseChain(Pose(Point(1 2),1))');
    -- 010101000000000000000000F03F0000000000000040000000000000F03F
    SELECT asHexEWKB(posechain 'SRID=3812;PoseChain(Pose(Point(1 2),1))');
    -- 0141E40E000001000000000000000000F03F0000000000000040000000000000F03F
    
  • Entrada desde la representación en texto conocido (WKT) o en texto conocido extendido (EWKT)

    posechainFromText(text) → posechain
    posechainFromEWKT(text) → posechain
    
    SELECT asEWKT(posechainFromText('PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),1))'));
    -- PoseChain(Pose(POINT(0 0),0),Pose(POINT(1 0),1))
    SELECT asEWKT(posechainFromEWKT('SRID=3812;PoseChain(Pose(Point(0 0),0))'));
    -- SRID=3812;PoseChain(Pose(POINT(0 0),0))
    
  • Entrada desde la representación en binario conocido (WKB), en binario conocido extendido (EWKB) o en binario conocido extendido hexadecimal (HexEWKB)

    posechainFromBinary(bytea) → posechain
    posechainFromEWKB(bytea) → posechain
    posechainFromHexEWKB(text) → posechain
    
    SELECT posechainFromBinary(asBinary(posechain 'PoseChain(Pose(Point(1 2),0.5))')) =
      posechain 'PoseChain(Pose(Point(1 2),0.5))';
    -- t
    SELECT posechainFromHexEWKB(asHexEWKB(
      posechain 'SRID=3812;PoseChain(Pose(Point(1 2),0.5))')) =
      posechain 'SRID=3812;PoseChain(Pose(Point(1 2),0.5))';
    -- t
    

Constructores

  • Construye una cadena de poses a partir de un arreglo de poses ordenadas desde el marco más exterior hacia dentro

    posechain(pose[]) → posechain
    
    SELECT asEWKT(posechain(ARRAY[pose 'Pose(Point(0 0),0)', pose 'Pose(Point(1 0),0)']));
    -- PoseChain(Pose(POINT(0 0),0),Pose(POINT(1 0),0))
    
  • Devuelve una cadena de poses con una pose añadida como su eslabón más interior

    appendPose(posechain,pose) → posechain
    

    La pose se lee en el marco que define el último eslabón de la cadena, por lo que no lleva ni un SRID ni el marcador geodésico.

    SELECT asEWKT(appendPose(posechain 'PoseChain(Pose(Point(0 0),0))',
      pose 'Pose(Point(1 0),0)'));
    -- PoseChain(Pose(POINT(0 0),0),Pose(POINT(1 0),0))
    

Conversión de tipos

  • Convierte una pose en una cadena de poses de un solo eslabón

    posechain(pose) → posechain
    
    SELECT asEWKT(posechain(pose 'SRID=3812;Pose(Point(1 2),0.5)'));
    -- SRID=3812;PoseChain(Pose(POINT(1 2),0.5))
    
  • Devuelve la pose de un marco que define la cadena, leída en el marco exterior de la cadena

    pose(posechain) → pose
    pose(posechain,integer) → pose
    

    Con un argumento se compone toda la cadena, lo que da la pose de su marco más interior. Con dos se componen los primeros n eslabones, lo que da la pose del marco que define el eslabón n-ésimo, es decir, dónde se sitúa esa articulación de la cadena.

    SELECT asEWKT(pose(posechain
      'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0),Pose(Point(1 0),0))'));
    -- Pose(POINT(2 0),0)
    SELECT asEWKT(pose(posechain
      'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0),Pose(Point(1 0),0))', 2));
    -- Pose(POINT(1 0),0)
    
  • Convierte una cadena de poses en el punto geométrico de su marco más interior

    point(posechain) → geometry
    
    SELECT ST_AsText(point(posechain
      'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))'));
    -- POINT(1 0)
    
  • Convierte una cadena de poses en una caja espaciotemporal

    stbox(posechain) → stbox
    

    La caja cubre la posición compuesta de cada prefijo de la cadena y no solo la del conjunto: cada articulación es un lugar, y una ventana de consulta que alcanza el codo pero no la mano alcanza igualmente la cadena.

    SELECT stbox(posechain
      'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0),Pose(Point(1 0),0))');
    -- STBOX X((0,0),(2,0))
    

Accesores

  • Devuelve el número de eslabones de una cadena de poses

    numPoses(posechain) → integer
    
    SELECT numPoses(posechain
      'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0),Pose(Point(2 0),0))');
    -- 3
    
  • Devuelve los eslabones de una cadena de poses

    startPose(posechain) → pose
    endPose(posechain) → pose
    poseN(posechain,integer) → pose
    poses(posechain) → pose[]
    

    Un eslabón se devuelve tal como está almacenado, es decir, en el marco que define el eslabón anterior. Dónde se sitúa ese marco en el marco exterior de la cadena es lo que responde pose(posechain,integer). La función poseN devuelve NULL si la cadena tiene menos eslabones que el número dado.

    SELECT asEWKT(startPose(posechain
      'SRID=3812;PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))'));
    -- SRID=3812;Pose(POINT(0 0),0)
    SELECT asEWKT(endPose(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))'));
    -- Pose(POINT(1 0),0)
    SELECT asEWKT(poseN(posechain
      'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))', 2));
    -- Pose(POINT(1 0),0)
    SELECT asEWKT(poses(posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))'));
    -- {"Pose(POINT(0 0),0)","Pose(POINT(1 0),0)"}
    

Transformaciones

  • Redondea los valores de los eslabones de una cadena de poses a un número de decimales

    round(posechain,integer=0) → posechain
    
    SELECT asEWKT(round(posechain
      'PoseChain(Pose(Point(1.123456789 2.123456789),0.123456789))', 3));
    -- PoseChain(Pose(POINT(1.123 2.123),0.123))
    

Sistema de referencia espacial

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

    SRID(posechain) → integer
    setSRID(posechain,integer) → posechain
    
    SELECT SRID(posechain 'SRID=3812;PoseChain(Pose(Point(1 2),0))');
    -- 3812
    SELECT asEWKT(setSRID(posechain 'PoseChain(Pose(Point(1 2),0))', 3812));
    -- SRID=3812;PoseChain(Pose(POINT(1 2),0))
    
  • Transforma a un identificador de referencia espacial

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

    Solo el eslabón exterior nombra un marco, por lo que solo se transforma el eslabón exterior: cada uno de los demás eslabones es una transformación rígida leída en los ejes de su marco padre, y un cambio del marco exterior deja esos ejes como estaban. Se genera un error cuando la cadena de entrada tiene un SRID desconocido (representado por 0).

    Para una cadena tridimensional sobre un marco geográfico, la orientación del eslabón exterior se vuelve a expresar en la base del marco de destino en su punto, exactamente como ocurre con una pose. Para una cadena bidimensional el ángulo es intrínseco a la proyección de origen y se transmite sin cambios.

    La función transformPipeline especifica la transformación con una tubería de transformación de coordenadas definida representada con el siguiente formato de cadena:

    urn:ogc:def:coordinateOperation:AUTHORITY::CODE

    El SRID de la cadena de entrada se ignora, y el SRID de la cadena de salida es el que indica el parámetro to_srid. Según indica el último parámetro, la tubería se ejecuta de forma predeterminada en sentido directo; si se establece el parámetro en falso, la tubería se ejecuta en sentido inverso.

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

Comparaciones

  • Operadores de comparación tradicionales

    {posechain} {=,<>,<,>,<=,>=} {posechain} → boolean
    

    El orden compara la dimensión, después el SRID, después los eslabones en orden y por último el número de eslabones, de modo que una cadena precede a toda cadena que la extiende.

    SELECT posechain 'PoseChain(Pose(Point(0 0),0))' =
      posechain 'PoseChain(Pose(Point(0 0),0))';
    -- t
    SELECT posechain 'PoseChain(Pose(Point(0 0),0))' <
      posechain 'PoseChain(Pose(Point(0 0),0),Pose(Point(1 0),0))';
    -- t
    
  • Devuelve verdadero si dos cadenas de poses son iguales hasta la tolerancia de la comparación de valores de punto flotante

    posechain ~= posechain → boolean
    
    SELECT posechain 'PoseChain(Pose(Point(0 0),0))' ~=
      posechain 'PoseChain(Pose(Point(0 0),0))';
    -- t