MobilityDB generaliza los formatos de entrada y salida Well-Known Text (WKT), Moving Features JSON (MF-JSON) y Well-Known Binary (WKB) del Open Geospatial Consortium para todos los tipos temporales. Presentamos a continuación las funciones de entrada y salida para los tipos temporales. Empezamos describiendo formato WKT.
Un valor de instante es un par de la forma v@t
, donde v
es un valor del tipo de base y t
es un valor de timestamptz
. Ejemplos de entrada de valores de instante son los siguientes:
SELECT tbool 'true@2001-01-01 08:00:00'; SELECT tint '1@2001-01-01 08:00:00'; SELECT tfloat '1.5@2001-01-01 08:00:00'; SELECT ttext 'AAA@2001-01-01 08:00:00'; SELECT tgeompoint 'Point(0 0)@2017-01-01 08:00:05'; SELECT tgeogpoint 'Point(0 0)@2017-01-01 08:00:05';
Un valor de secuencia es un conjunto de valores v1@t1,...,vn@tn
delimitado por límites superior e inferior, que pueden ser inclusivo (representados por ‘[
’ y ‘]
’) o exclusivos (representados por ‘(
’ y ‘)
’). Un valor de secuencia compuesto por una sola pareja v@t
se denomina secuencia instantánea. Los valores de secuencia tienen una función de interpolación asociada que puede ser discreta, lineal o escalonada. Por definición, los límites inferior y superior de una secuencia instantánea o de un valor de secuencia con interpolación discreta son inclusivos. La extensión temporal de un valor de secuencia con interpolación discreta es un conjunto de marcas de tiempo. Ejemplos de valores de secuencia con interpolación discreta son los siguientes.
SELECT tbool '{true@2001-01-01 08:00:00, false@2001-01-03 08:00:00}'; SELECT tint '{1@2001-01-01 08:00:00, 2@2001-01-03 08:00:00}'; SELECT tint '{1@2001-01-01 08:00:00}'; -- Instantaneous sequence SELECT tfloat '{1.0@2001-01-01 08:00:00, 2.0@2001-01-03 08:00:00}'; SELECT ttext '{AAA@2001-01-01 08:00:00, BBB@2001-01-03 08:00:00}'; SELECT tgeompoint '{Point(0 0)@2017-01-01 08:00:00, Point(0 1)@2017-01-02 08:05:00}'; SELECT tgeogpoint '{Point(0 0)@2017-01-01 08:00:00, Point(0 1)@2017-01-02 08:05:00}';
La extensión temporal de un valor de secuencia con interpolación lineal o escalonada es un período definido por el primer y el últimpo instante, así como por los límites inferior y superior. Ejemplos de valores de secuencia con interpolación lineal son los siguientes:
SELECT tbool '[true@2001-01-01 08:00:00, true@2001-01-03 08:00:00]'; SELECT tint '[1@2001-01-01 08:00:00, 1@2001-01-03 08:00:00]'; SELECT tfloat '[2.5@2001-01-01 08:00:00, 3@2001-01-03 08:00:00, 1@2001-01-04 08:00:00]'; SELECT tfloat '[1.5@2001-01-01 08:00:00]'; -- Instantaneous sequence SELECT ttext '[BBB@2001-01-01 08:00:00, BBB@2001-01-03 08:00:00]'; SELECT tgeompoint '[Point(0 0)@2017-01-01 08:00:00, Point(0 0)@2017-01-01 08:05:00)'; SELECT tgeogpoint '[Point(0 0)@2017-01-01 08:00:00, Point(0 1)@2017-01-01 08:05:00, Point(0 0)@2017-01-01 08:10:00)';
Los valores de secuencia cuyo tipo base es continuo pueden especificar que la interpolación es escalonada con el prefijo Interp=Step
. Si no se especifica, se supone que la interpolación es lineal por defecto. A continuación se dan ejemplos de valores de secuencia con interpolación escalonada:
SELECT tfloat 'Interp=Step;[2.5@2001-01-01 08:00:00, 3@2001-01-01 08:10:00]'; SELECT tgeompoint 'Interp=Step;[Point(0 0)@2017-01-01 08:00:00, Point(1 1)@2017-01-01 08:05:00, Point(1 1)@2017-01-01 08:10:00)'; SELECT tgeompoint 'Interp=Step;[Point(0 0)@2017-01-01 08:00:00, Point(1 1)@2017-01-01 08:05:00, Point(0 0)@2017-01-01 08:10:00)'; ERROR: Invalid end value for temporal sequence with step interpolation SELECT tgeogpoint 'Interp=Step;[Point(0 0)@2017-01-01 08:00:00, Point(1 1)@2017-01-01 08:10:00]';
Los dos últimos instantes de un valor de secuencia con interpolación discreta y límite superior exclusivo deben tener el mismo valor base, como se muestra en el segundo y tercer ejemplo anteriores.
Un valor de conjunto de secuencias es un conjunto {v1,...,vn}
donde cada vi
es un valor de secuencia. La interpolación de los valores conjunto de secuencias solo puede ser lineal o escalonada, no discreta. Todas las secuencias que componen un valor de conjunto de secuencias deben tener la misma interpolación. La extensión temporal de un valor de conjunto de secuencias es un conjunto de períodos. Ejemplos de valores de conjunto de secuencias con interpolación lineal son los siguientes:
SELECT tbool '{[false@2001-01-01 08:00:00, false@2001-01-03 08:00:00), [true@2001-01-03 08:00:00], (false@2001-01-04 08:00:00, false@2001-01-06 08:00:00]}'; SELECT tint '{[1@2001-01-01 08:00:00, 1@2001-01-03 08:00:00), [2@2001-01-04 08:00:00, 3@2001-01-05 08:00:00, 3@2001-01-06 08:00:00]}'; SELECT tfloat '{[1@2001-01-01 08:00:00, 2@2001-01-03 08:00:00, 2@2001-01-04 08:00:00, 3@2001-01-06 08:00:00]}'; SELECT ttext '{[AAA@2001-01-01 08:00:00, BBB@2001-01-03 08:00:00, BBB@2001-01-04 08:00:00), [CCC@2001-01-05 08:00:00, CCC@2001-01-06 08:00:00]}'; SELECT tgeompoint '{[Point(0 0)@2017-01-01 08:00:00, Point(0 1)@2017-01-01 08:05:00), [Point(0 1)@2017-01-01 08:10:00, Point(1 1)@2017-01-01 08:15:00)}'; SELECT tgeogpoint '{[Point(0 0)@2017-01-01 08:00:00, Point(0 1)@2017-01-01 08:05:00), [Point(0 1)@2017-01-01 08:10:00, Point(1 1)@2017-01-01 08:15:00)}';
Los valores de conjunto de secuencias cuyo tipo base es continuo pueden especificar que la interpolación es escalonada con el prefijo Interp=Step
. Si no se especifica, se supone que la interpolación es lineal por defecto. A continuación se dan ejemplos de valores de conjunto de secuencias con interpolación escalonada:
SELECT tfloat 'Interp=Step;{[1@2001-01-01 08:00:00, 2@2001-01-03 08:00:00, 2@2001-01-04 08:00:00, 3@2001-01-06 08:00:00]}'; SELECT tgeompoint 'Interp=Step;{[Point(0 0)@2017-01-01 08:00:00, Point(0 1)@2017-01-01 08:05:00], [Point(0 1)@2017-01-01 08:10:00, Point(0 1)@2017-01-01 08:15:00)}'; SELECT tgeogpoint 'Interp=Step;{[Point(0 0)@2017-01-01 08:00:00, Point(0 1)@2017-01-01 08:05:00], [Point(0 1)@2017-01-01 08:10:00, Point(0 1)@2017-01-01 08:15:00)}';
Para los puntos temporales, es posible especificar el identificador de referencia espacial (SRID) utilizando la representación extendida de texto conocido (EWKT) de la siguiente manera:
SELECT tgeompoint 'SRID=5435;[Point(0 0)@2001-01-01,Point(0 1)@2001-01-02]'
Todas las geometrías componentes serán entonces del SRID dado. Además, cada geometría componente puede especificar su SRID con el formato EWKT como en el siguiente ejemplo
SELECT tgeompoint '[SRID=5435;Point(0 0)@2001-01-01,SRID=5435;Point(0 1)@2001-01-02]'
Se genera un error si las geometrías componentes no están todas en el mismo SRID o si el SRID de una geometría componente es diferente al del punto temporal.
SELECT tgeompoint '[SRID=5435;Point(0 0)@2001-01-01,SRID=4326;Point(0 1)@2001-01-02]'; -- ERROR: Geometry SRID (4326) does not match temporal type SRID (5435) SELECT tgeompoint 'SRID=5435;[SRID=4326;Point(0 0)@2001-01-01, SRID=4326;Point(0 1)@2001-01-02]' -- ERROR: Geometry SRID (4326) does not match temporal type SRID (5435)
Damos a continuación las funciones de entrada y salida en formato textual (Well-Known Text o WKT), binario (Well-Known Binary o WKB) y Moving Features JSON (MF-JSON) para los tipos alfanuméricos temporales. Las funciones correspondientes para los puntos temporales se detallan en la “Entrada y salida”. El formato de salida predeterminado de todos los tipos alfanuméricos temporales es el formato de texto conocido. La función asText
que se da a continuación permite determinar la salida de valores temporales de punto flotante.
Devuelve la representación textual conocida (Well-Known Text o WKT)
asText(tfloat,maxdecdigits=15) → text
El argumento maxdecdigits
puede usarse para establecer el número máximo de decimales en la salida de los valores en punto flotante (por defecto 15).
SELECT asText(tfloat '[10.55@2001-01-01, 25.55@2001-01-02]', 0); -- [11@2001-01-01, 26@2001-01-02]
Devuelve la representación binaria conocida (Well-Known Binary o WKB)
asBinary(ttype,endian text='') → bytea
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(tbool 'true@2001-01-01'); -- \x011a000101009c57d3c11c0000 SELECT asBinary(tint '1@2001-01-01', 'XDR'); -- \x000023010000000100001cc1d3579c00 SELECT asBinary(tfloat '1.5@2001-01-01'); -- \x01210001000000000000f83f009c57d3c11c0000 SELECT asBinary(ttext 'AAA@2001-01-01'); -- \x01290001040000000000000041414100009c57d3c11c0000
Devuelve la representación hexadecimal binaria conocida (HexWKB) en formato texto
asHexWKB(ttype,endian text='') → text
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 asHexWKB(tbool 'true@2001-01-01'); -- 011A000101009C57D3C11C0000 SELECT asHexWKB(tint '1@2001-01-01', 'XDR'); -- 000023010000000100001CC1D3579C00 SELECT asHexWKB(tfloat '1.5@2001-01-01'); -- 01210001000000000000F83F009C57D3C11C0000 SELECT asHexWKB(ttext 'AAA@2001-01-01'); -- 01290001040000000000000041414100009C57D3C11C0000
Devuelve la representación JSON de características móviles (Moving Features JSON o MF-JSON)
asMFJSON(ttype,options=0,flags=0,maxdecdigits=15) → bytea
El argumento options
puede usarse para agregar un cuadro delimitador en la salida MFJSON:
0: significa que no hay opción (valor por defecto)
1: cuadro delimitador MFJSON
El argumento flags
puede usarse para personalizar la salida JSON, por ejemplo, para producir una salida JSON fácil de leer (para lectores humanos). Consulte la documentación de la biblioteca json-c
para conocer los valores possible. Los valores típicos son los siguientes:
0: means no option (default value)
1: JSON_C_TO_STRING_SPACED
2: JSON_C_TO_STRING_PRETTY
El argumento maxdecdigits
puede usarse para establecer el número máximo de decimales en la salida de los valores en punto flotante (por defecto 15).
SELECT asMFJSON(tbool 't@2001-01-01 18:00:00', 1); /* {"type":"MovingBoolean","period":{"begin":"2001-01-01T18:00:00+01", "end":"2001-01-01T18:00:00+01","lowerInc":true,"upperInc":true}, "values":[true],"datetimes":["2001-01-01T18:00:00+01"],"interpolation":"None"} */ SELECT asMFJSON(tint '{10@2001-01-01 18:00:00, 25@2001-01-01 18:10:00}', 1); /* {"type":"MovingInteger","bbox":[10,25],"period":{"begin":"2001-01-01T18:00:00+01", "end":"2001-01-01T18:10:00+01"},"values":[10,25],"datetimes":["2001-01-01T18:00:00+01", "2001-01-01T18:10:00+01"],"lowerInc":true,"upperInc":true, "interpolation":"Discrete"} */ SELECT asMFJSON(tfloat '[10.5@2001-01-01 18:00:00+02, 25.5@2001-01-01 18:10:00+02]'); /* {"type":"MovingFloat","values":[10.5,25.5],"datetimes":["2001-01-01T17:00:00+01", "2001-01-01T17:10:00+01"],"lowerInc":true,"upperInc":true,"interpolation":"Linear"} */ SELECT asMFJSON(ttext '{[walking@2001-01-01 18:00:00+02, driving@2001-01-01 18:10:00+02]}'); /* {"type":"MovingText","sequences":[{"values":["walking","driving"], "datetimes":["2001-01-01T17:00:00+01","2001-01-01T17:10:00+01"], "lowerInc":true,"upperInc":true}],"interpolation":"Step"} */
Entrar un valor temporal de su representación binaria conocida (WKB)
ttypeFromBinary(bytea) → ttype
Hay una función por tipo temporal, el nombre de la función tiene como prefijo el nombre del tipo, que son tbool
o tint
en los ejemplos a continuación.
SELECT tboolFromBinary('\x010d000101009c57d3c11c0000'); -- t@2001-01-01 SELECT tintFromBinary('\x000016010000000100001cc1d3579c00'); -- 1@2001-01-01 SELECT tfloatFromBinary('\x01130081000000000000f83f009c57d3c11c0000'); -- 1.5@2001-01-01 SELECT ttextFromBinary('\x01170001040000000000000041414100009c57d3c11c0000'); -- "AAA"@2001-01-01
Entrar un valor temporal de su representación hexadecimal binaria conocida (HexWKB)
ttypeFromHexWKB(text) → ttype
Hay una función por tipo temporal, el nombre de esta función tiene como prefijo el nombre del tipo, que son tbool
o tint
en los ejemplos a continuación
SELECT tboolFromHexWKB('010D000101009C57D3C11C0000'); -- t@2001-01-01 SELECT tintFromHexWKB('000016010000000100001CC1D3579C00'); -- 1@2001-01-01 SELECT tfloatFromHexWKB('01130081000000000000F83F009C57D3C11C0000'); -- 1.5@2001-01-01 SELECT ttextFromHexWKB('01170001040000000000000041414100009C57D3C11C0000'); -- "AAA"@2001-01-01
Entrar un valor temporal de su representación Moving Features JSON (MF-JSON)
ttypeFromMFJSON(bytea) → ttype
Hay una función por tipo temporal, el nombre de esta función tiene como prefijo el nombre del tipo, que son tbool
o tint
en los ejemplos a continuación
SELECT tboolFromMFJSON(text '{"type":"MovingBoolean","period":{"begin":"2001-01-01T18:00:00+01", "end":"2001-01-01T18:00:00+01","lowerInc":true,"upperInc":true}, "values":[true],"datetimes":["2001-01-01T18:00:00+01"],"interpolation":"None"}'); -- t@2001-01-01 18:00:00 SELECT tintFromMFJSON(text '{"type":"MovingInteger","bbox":[10,25],"period":{"begin":"2001-01-01T18:00:00+01", "end":"2001-01-01T18:10:00+01"},"values":[10,25],"datetimes":["2001-01-01T18:00:00+01", "2001-01-01T18:10:00+01"],"lowerInc":true,"upperInc":true, "interpolation":"Discrete"}'); -- {10@2001-01-01 18:00:00, 25@2001-01-01 18:10:00} SELECT tfloatFromMFJSON(text '{"type":"MovingFloat","values":[10.5,25.5],"datetimes":["2001-01-01T17:00:00+01", "2001-01-01T17:10:00+01"],"lowerInc":true,"upperInc":true, "interpolation":"Linear"}'); -- [10.5@2001-01-01 18:00:00, 25.5@2001-01-01 18:10:00]' SELECT ttextFromMFJSON(text '{"type":"MovingText","sequences":[{"values":["walking","driving"], "datetimes":["2001-01-01T17:00:00+01","2001-01-01T17:10:00+01"], "lowerInc":true,"upperInc":true}],"interpolation":"Step"}'); -- {["walking"@2001-01-01 18:00:00, "driving"@2001-01-01 18:10:00]}');