El tipo tpcbox es la caja delimitadora espaciotemporal para los tipos de nube de puntos temporal. Refleja la estructura de stbox (véase Capítulo 3, Tipos de cuadro delimitador), mismos ejes X/Y/Z/T, mismos bits de indicador para las dimensiones presentes, y añade un único campo: el pcid. Dos valores tpcbox con distintos valores de pcid describen esquemas distintos, y una operación entre ellos genera un error en lugar de comparar su extensión geométrica o temporal.
Propagar el pcid a través de la aritmética de cajas delimitadoras garantiza que la poda por caja delimitadora nunca descarte una fila cuyo esquema difiera del esquema de la consulta, y nunca devuelva un resultado entre esquemas incompatibles.
Devuelve la representación binaria conocida (WKB) o la representación hexadecimal binaria conocida (HexWKB) de una caja de nube de puntos
asBinary(tpcbox,endian text='') → bytea asHexWKB(tpcbox,endian text='') → text
El resultado es la representación de la stbox que abarca la caja seguida de su pcid, codificada utilizando la codificación little-endian (NDR) o big-endian (XDR), la codificación de la máquina cuando no se especifica ninguna. Como para todo tipo espacial, la representación plana no escribe el SRID, que escriben asEWKB y asHexEWKB.
SELECT asHexWKB(tpcboxX(0, 0, 10, 10, 1)); -- 0101000000000000000000000000000024400000000000000000000000000000244001000000 SELECT asHexWKB(tpcboxX(0, 0, 10, 10, 5), 'XDR'); -- 0001000000000000000040240000000000000000000000000000402400000000000000000005
Devuelve la representación binaria conocida extendida (EWKB) o la representación hexadecimal binaria conocida extendida (HexEWKB) de una caja de nube de puntos
asEWKB(tpcbox,endian text='') → bytea asHexEWKB(tpcbox,endian text='') → text
El resultado es la representación que escriben asBinary y asHexWKB con el SRID de la caja, el que indica el esquema de su pcid, como todo tipo espacial escribe su SRID en su representación extendida.
SELECT asHexEWKB(tpcboxX(0, 0, 10, 10, 1)); -- 0101000000000000000000000000000024400000000000000000000000000000244001000000 SELECT asHexEWKB(tpcboxX(0, 0, 10, 10, 5), 'XDR'); -- 0041000010E6000000000000000040240000000000000000000000000000402400000000000000000005
Entrada de una caja de nube de puntos desde la representación binaria conocida (WKB) o la representación hexadecimal binaria conocida (HexWKB)
tpcboxFromBinary(bytea) → tpcbox tpcboxFromHexWKB(text) → tpcbox
El SRID del resultado es el que indica el esquema de su pcid, que la representación plana no escribe.
SELECT asText(tpcboxFromBinary(asBinary(tpcboxX(0, 0, 10, 10, 5)))); -- SRID=4326;TPCBOX(X((0,0),(10,10)), 5)
Entrada de una caja de nube de puntos desde la representación binaria conocida extendida (EWKB) o la representación hexadecimal binaria conocida extendida (HexEWKB)
tpcboxFromEWKB(bytea) → tpcbox tpcboxFromHexEWKB(text) → tpcbox
El SRID que indica la entrada debe ser el que indica el esquema de su pcid, cuando ese esquema indica uno.
SELECT tpcboxFromHexEWKB(asHexEWKB(tpcboxX(0, 0, 10, 10, 1))); -- TPCBOX(X((0,0),(10,10)), 1) SELECT tpcboxFromHexEWKB(replace(asHexEWKB(tpcboxX(0, 0, 10, 10, 5)), 'E6100000', '110F0000')); -- ERROR: Could not parse tpcbox value: The value states SRID 3857 and the schema of pcid 5 states SRID 4326
Devuelve la representación de texto conocido (WKT)
asText(tpcbox,maxdecimaldigits integer=15) → text
El argumento maxdecimaldigits se puede utilizar para definir el número máximo de decimales para la salida de los valores de coma flotante (por defecto 15).
SELECT asText(tpcbox 'TPCBOX(X((0.12,1.23),(2.35,3.46)), 1)'); -- TPCBOX(X((0.12,1.23),(2.35,3.46)), 1) SELECT asText(tpcbox 'TPCBOX(X((0.12,1.23),(2.35,3.46)), 1)', 1); -- TPCBOX(X((0.1,1.2),(2.4,3.5)), 1)
Entrada desde la representación de texto conocido (WKT)
tpcboxFromText(text) → tpcbox
La función es la inversa de asText: lee el texto en el que se escribe un literal del tipo, tanto de una constante como de una columna text.
SELECT tpcboxFromText('TPCBOX(ZT(((0,0,0),(10,10,10)),[2024-01-01, 2024-01-02]), 1)');
-- TPCBOX(ZT(((0,0,0),(10,10,10)),[2024-01-01, 2024-01-02]), 1)
Construye un tpcbox a partir de límites X/Y/Z/T explícitos y un pcid, cuyo esquema declara el SRID
tpcboxX(xmin float,ymin float,xmax float,ymax float,pcid integer=0) → tpcbox tpcboxZ(xmin float,ymin float,zmin float,xmax float,ymax float,zmax float, pcid integer=0) → tpcbox tpcboxT(period tstzspan,pcid integer=0) → tpcbox tpcboxXT(xmin float,ymin float,xmax float,ymax float,period tstzspan, pcid integer=0) → tpcbox tpcboxZT(xmin float,ymin float,zmin float,xmax float,ymax float,zmax float, period tstzspan,pcid integer=0) → tpcbox
El SRID no es un parámetro: se lee del esquema nombrado por el pcid, y un pcid que no nombra ningún esquema registrado es un error
SELECT tpcboxX(0, 0, 10, 10, 1); -- TPCBOX(X((0,0),(10,10)), 1) SELECT tpcboxZT(0, 0, 0, 10, 10, 10, tstzspan '[2024-01-01, 2024-01-02]', 1); -- TPCBOX(ZT(((0,0,0),(10,10,10)),[2024-01-01, 2024-01-02]), 1)
Convierte un pcpoint a un tpcbox degenerado (de extensión cero); el SRID y el pcid provienen del esquema
tpcbox(pcpoint) → tpcbox
SELECT tpcbox(pcpoint(1, 10.0, 20.0, 30.0)); -- TPCBOX(Z((10,20,30),(10,20,30)), 1)
Convierte un pcpatch a un tpcbox
tpcbox(pcpatch) → tpcbox
La extensión en X y en Y del resultado es la de los límites PCBOUNDS integrados en el parche, y su extensión en Z, cuando el esquema que nombra el pcid tiene una dimensión Z, es la que indican los puntos del parche. El SRID es el que declara el esquema nombrado por el pcid.
SELECT tpcbox(pcpatch(pcpoint(1, 10.0, 20.0, 30.0))); -- TPCBOX(Z((10,20,30),(10,20,30)), 1)
Devuelve si un tpcbox tiene establecidas las dimensiones X/Y, Z o T
hasX(tpcbox) → boolean hasZ(tpcbox) → boolean hasT(tpcbox) → boolean
WITH b AS (SELECT tpcboxX(0, 0, 10, 10, 1) AS b) SELECT hasX(b), hasZ(b) FROM b; -- t | f
Devuelve un límite de coordenada, NULL si la dimensión correspondiente está ausente
xmin(tpcbox) → float xmax(tpcbox) → float ymin(tpcbox) → float ymax(tpcbox) → float zmin(tpcbox) → float zmax(tpcbox) → float
WITH b AS (SELECT tpcboxX(0, 0, 10, 10, 1) AS b) SELECT xmin(b), xmax(b) FROM b; -- 0 | 10
Devuelve un límite temporal, NULL si la caja no tiene dimensión T
tmin(tpcbox) → timestamptz tmax(tpcbox) → timestamptz
SELECT tmin(tpcboxT(tstzspan '[2024-01-01, 2024-01-02]', 1)); -- 2024-01-01
Devuelve el identificador de esquema y el SRID que declara dicho esquema
pcid(tpcbox) → integer SRID(tpcbox) → integer
WITH b AS (SELECT tpcboxX(0, 0, 10, 10, 1) AS b) SELECT pcid(b), SRID(b) FROM b; -- 1 | 4326
Devuelve un tpcbox con las coordenadas redondeadas al número de dígitos decimales indicado
round(tpcbox,integer=0) → tpcbox
SELECT round(tpcboxX(0.123456, 1.234567, 2.345678, 3.456789, 1), 2); -- TPCBOX(X((0.12,1.23),(2.35,3.46)), 1)
Devuelve un tpcbox que declara un sistema de referencia que su esquema no declara
setSRID(tpcbox,integer) → tpcbox
El esquema nombrado por el pcid es el que contiene el sistema de referencia, por lo que cuando ese esquema declara uno la caja se rechaza: un pcid de 0 no nombra ningún esquema, y un esquema puede no declarar ninguno. No reproyecta las coordenadas, para ello, proyecte primero el tpcpoint subyacente y tome la caja delimitadora del resultado
SELECT SRID(setSRID(tpcboxX(0, 0, 10, 10), 4326)); -- 4326 SELECT setSRID(tpcboxX(0, 0, 10, 10, 1), 3857); -- ERROR: The SRID of a TPCBox is the one its schema states: pcid 1 states SRID 4326
Unión e intersección de dos tpcboxes
tpcbox {+, *} tpcbox → tpcbox
Ambos operandos deben compartir el mismo pcid, y la intersección es NULL cuando las dos cajas son disjuntas.
SELECT tpcboxX(0, 0, 5, 5, 1) + tpcboxX(3, 3, 10, 10, 1); -- TPCBOX(X((0,0),(10,10)), 1) SELECT tpcboxX(0, 0, 5, 5, 1) * tpcboxX(3, 3, 10, 10, 1); -- TPCBOX(X((3,3),(5,5)), 1)
Nota: no se proporciona un minus genérico entre cajas, siguiendo la convención de stbox y tbox: la diferencia de dos cajas no es en general una caja.
Todos los operadores topológicos toman dos valores tpcbox que declaran el mismo esquema, el mismo sistema de referencia y el mismo tipo de coordenada, plana o esférica. Una discrepancia en cualquiera de los dos genera un error en lugar de responder falso: el pcid es lo que da a un número almacenado su significado como coordenada, por lo que dos cajas que nombran esquemas distintos no tienen una extensión común que comparar.
También toman dos cajas que comparten un eje. Una caja que contiene coordenadas y una caja que contiene un período no coinciden en ningún eje, por lo que un predicado topológico entre ellas no tiene nada que comparar y genera un error a su vez.
Operadores topológicos
tpcbox {&&, @>, <@, ~=, -|-} tpcbox → boolean
SELECT tpcboxX(0, 0, 10, 10, 1) @> tpcboxX(2, 2, 8, 8, 1); -- t SELECT tpcboxX(2, 2, 8, 8, 1) <@ tpcboxX(0, 0, 10, 10, 1); -- t SELECT tpcboxX(0, 0, 5, 5, 1) && tpcboxX(3, 3, 10, 10, 1); -- t SELECT tpcboxX(0, 0, 2, 2) ~= tpcboxX(0, 0, 2, 2); -- t SELECT tpcboxX(0, 0, 2, 2) -|- tpcboxX(5, 5, 7, 7); -- f SELECT tpcboxX(0, 0, 5, 5, 1) && tpcboxX(0, 0, 5, 5, 2); -- ERROR: Operation on TPCBox values with different schemas: 1 vs 2 SELECT tpcboxX(0, 0, 10, 10, 1) && tpcboxT(tstzspan '[2024-01-01, 2024-01-02]', 0); -- ERROR: The temporal values must have at least one common dimension SELECT tpcbox 'SRID=4326;TPCBOX(X((1,1),(2,2)), 1)' && tpcbox 'GEODTPCBOX(X((1,1),(2,2)), 1)'; -- ERROR: Operation on mixed planar and geodetic coordinates
Dieciséis predicados de posición alineados por eje, paralelos a los de stbox. Cada uno comprueba la relación estricta o de solapamiento a lo largo de un eje. Los doce que leen coordenadas requieren el mismo esquema, el mismo sistema de referencia y el mismo tipo de coordenada, y una discrepancia en cualquiera de los tres genera un error; los cuatro que leen el eje temporal no requieren ninguno de los dos, ya que una marca de tiempo significa lo mismo sea cual sea el esquema en el que se leen las coordenadas. Todo predicado requiere que ambas cajas lleven el eje que él lee, de modo que los del eje Z necesitan una dimensión Z en ambas y los del eje T un período en ambas.
Operadores de posición
tpcbox {<<, &<, >>, &>} tpcbox → boolean
tpcbox {<<|, &<|, |>>, |&>} tpcbox → boolean
tpcbox {<</, &</, />>, /&>} tpcbox → boolean
tpcbox {<<#, &<#, #>>, #&>} tpcbox → boolean
Los cuatro grupos prueban el eje X, el eje Y, el eje Z y el eje temporal, y cada uno indica, en orden, estrictamente antes, no se extiende después, estrictamente después y no se extiende antes a lo largo de su eje.
SELECT tpcboxX(0, 0, 2, 2) << tpcboxX(5, 5, 7, 7); -- t SELECT tpcboxX(0, 0, 2, 2) <<| tpcboxX(5, 5, 7, 7); -- t -- Neither box carries a z dimension or a time span, so neither of the next two -- has an axis to compare along. The last pair states two schemas, which the -- time axis does not read. SELECT tpcboxX(0, 0, 2, 2) <</ tpcboxX(5, 5, 7, 7); -- ERROR: The tpcbox must have Z dimension SELECT tpcboxX(0, 0, 2, 2) <<# tpcboxX(5, 5, 7, 7); -- ERROR: The tpcbox must have T dimension SELECT tpcboxXT(0, 0, 5, 5, tstzspan '[2024-01-01, 2024-01-15]', 1) <<# tpcboxXT(0, 0, 5, 5, tstzspan '[2025-01-01, 2025-01-15]', 2); -- t
Comparaciones tradicionales
tpcbox {=, <>, <, <=, >, >=} tpcbox → boolean
La función compara en el orden siguiente: pcid, srid, flags, período y a continuación límites espaciales en orden XYZ-min/max)
SELECT tpcboxX(0, 0, 2, 2) = tpcboxX(0, 0, 2, 2); -- t SELECT tpcboxX(0, 0, 2, 2) <> tpcboxX(5, 5, 7, 7); -- t SELECT tpcboxX(0, 0, 2, 2) < tpcboxX(5, 5, 7, 7); -- t