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.
Construye un tpcbox a partir de límites X/Y/Z/T explícitos y un pcid, cuyo esquema declara el SRID
tpcboxX(xmin,ymin,xmax,ymax,pcid) → tpcbox tpcboxZ(xmin,ymin,zmin,xmax,ymax,zmax,pcid) → tpcbox tpcboxT(period,pcid) → tpcbox tpcboxXT(xmin,ymin,xmax,ymax,period,pcid) → tpcbox tpcboxZT(xmin,ymin,zmin,xmax,ymax,zmax,period,pcid) → 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