Tabla de contenidos
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.
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
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))
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))
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)"}
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))
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