Caja Delimitadora tpcbox

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 nunca se consideran solapados, contenidos, iguales o adyacentes entre sí, independientemente de 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.

Constructores

  • Construir un tpcbox a partir de límites X/Y/Z/T explícitos y un pcid

    tpcbox(xmin,ymin,xmax,ymax,pcid,srid=0) → tpcbox

    tpcbox_z(xmin,ymin,zmin,xmax,ymax,zmax,pcid,srid=0) → tpcbox

    tpcbox_t(period,pcid) → tpcbox

    tpcbox_xt(xmin,ymin,xmax,ymax,period,pcid,srid=0) → tpcbox

    tpcbox_zt(xmin,ymin,zmin,xmax,ymax,zmax,period,pcid,srid=0) → tpcbox

    SELECT tpcbox(0, 0, 10, 10, 1, 0);
    -- TPCBOX(X((0,0),(10,10)), 1)
    SELECT tpcbox_zt(0, 0, 0, 10, 10, 10, tstzspan '[2024-01-01, 2024-01-02]', 1, 0);
    -- TPCBOX(ZT(((0,0,0),(10,10,10)),[2024-01-01, 2024-01-02]), 1)
    

Conversiones

  • Convertir un pcpoint a un tpcbox degenerado (de extensión cero); el SRID y el pcid provienen del esquema

    tpcbox(pcpoint) → tpcbox

    SELECT tpcbox(PC_MakePoint(1, ARRAY[10.0, 20.0, 30.0]));
    -- TPCBOX(Z((10,20,30),(10,20,30)), 1)
    
  • Convertir un pcpatch a un tpcbox usando los límites PCBOUNDS 2D integrados en el parche; la segunda forma acepta un SRID explícito en lugar de buscarlo en el esquema

    tpcbox(pcpatch) → tpcbox

    tpcbox(pcpatch,integer) → tpcbox

    SELECT tpcbox(PC_Patch(PC_MakePoint(1, ARRAY[10.0, 20.0, 30.0])));
    

Accesores

  • 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 tpcbox(0, 0, 10, 10, 1, 0) 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 tpcbox(0, 0, 10, 10, 1, 0) 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(tpcbox_t(tstzspan '[2024-01-01, 2024-01-02]', 1));
    -- 2024-01-01 00:00:00+00
    
  • Devuelve el identificador de esquema y el SRID

    pcid(tpcbox) → integer

    SRID(tpcbox) → integer

    WITH b AS (SELECT tpcbox(0, 0, 10, 10, 7, 4326) AS b)
      SELECT pcid(b), SRID(b) FROM b;
    -- 7 | 4326
    

Transformaciones

  • Devuelve un tpcbox con las coordenadas redondeadas al número de dígitos decimales indicado

    round(tpcbox,integer=0) → tpcbox

    SELECT round(tpcbox(0.123456, 1.234567, 2.345678, 3.456789, 1, 0), 2);
    -- TPCBOX(X((0.12,1.23),(2.35,3.46)), 1)
    
  • Devuelve un tpcbox con el SRID sobreescrito. No reproyecta las coordenadas — para ello, proyecte primero el tpcpoint subyacente y tome la caja delimitadora del resultado

    setSRID(tpcbox,integer) → tpcbox

    SELECT SRID(setSRID(tpcbox(0, 0, 10, 10, 1, 0), 4326));
    -- 4326
    

Operaciones de conjuntos

  • Devuelve la unión de dos tpcboxes; ambas deben compartir el mismo pcid

    tpcbox_union(tpcbox,tpcbox) → tpcbox

    tpcbox + tpcbox → tpcbox

    SELECT tpcbox(0, 0, 5, 5, 1, 0) + tpcbox(3, 3, 10, 10, 1, 0);
    -- TPCBOX(X((0,0),(10,10)), 1)
    
  • Devuelve la intersección de dos tpcboxes, NULL si son disjuntas o el pcid no coincide

    tpcbox_intersection(tpcbox,tpcbox) → tpcbox

    tpcbox * tpcbox → tpcbox

    SELECT tpcbox(0, 0, 5, 5, 1, 0) * tpcbox(3, 3, 10, 10, 1, 0);
    -- 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.

Operadores Topológicos

Todos los operadores topológicos toman dos valores tpcbox con pcid coincidente. Una discrepancia de pcid siempre devuelve false (no un error) para que los escaneos de índice se comporten de forma intuitiva.

  • Devuelve true si el primer tpcbox contiene al segundo

    tpcbox @> tpcbox → boolean

    SELECT tpcbox(0, 0, 10, 10, 1, 0) @> tpcbox(2, 2, 8, 8, 1, 0);
    -- t
    
  • Devuelve true si el primer tpcbox está contenido en el segundo

    tpcbox <@ tpcbox → boolean

    SELECT tpcbox(2, 2, 8, 8, 1, 0) <@ tpcbox(0, 0, 10, 10, 1, 0);
    -- t
    
  • Devuelve true si dos tpcboxes se solapan

    tpcbox && tpcbox → boolean

    SELECT tpcbox(0, 0, 5, 5, 1, 0) && tpcbox(3, 3, 10, 10, 1, 0);  -- t
    SELECT tpcbox(0, 0, 5, 5, 1, 0) && tpcbox(0, 0, 5, 5, 2, 0);  -- f (pcid mismatch)
    
  • Devuelve true si dos tpcboxes son exactamente iguales

    tpcbox ~= tpcbox → boolean

  • Devuelve true si dos tpcboxes son adyacentes (comparten un límite)

    tpcbox -|- tpcbox → boolean

Operadores de Posición

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. Todos requieren pcid coincidente; la discrepancia devuelve false. Los predicados del eje Z requieren que ambas cajas tengan dimensión Z; los del eje T requieren que ambas tengan dimensión T.

  • Comprueba el orden en el eje X de dos tpcboxes

    tpcbox << tpcbox → boolean (estrictamente a la izquierda)

    tpcbox &< tpcbox → boolean (no se extiende a la derecha)

    tpcbox >> tpcbox → boolean (estrictamente a la derecha)

    tpcbox &> tpcbox → boolean (no se extiende a la izquierda)

  • Comprueba el orden en el eje Y de dos tpcboxes

    tpcbox <<| tpcbox → boolean (estrictamente por debajo)

    tpcbox &<| tpcbox → boolean (no se extiende hacia arriba)

    tpcbox |>> tpcbox → boolean (estrictamente por encima)

    tpcbox |&> tpcbox → boolean (no se extiende hacia abajo)

  • Comprueba el orden en el eje Z de dos tpcboxes (devuelve false si alguna carece de Z)

    tpcbox <</ tpcbox → boolean (estrictamente al frente)

    tpcbox &</ tpcbox → boolean (no se extiende hacia atrás)

    tpcbox />> tpcbox → boolean (estrictamente detrás)

    tpcbox /&> tpcbox → boolean (no se extiende hacia el frente)

  • Comprueba el orden en el eje temporal de dos tpcboxes (devuelve false si alguna carece de T)

    tpcbox <<# tpcbox → boolean (estrictamente antes)

    tpcbox &<# tpcbox → boolean (no se extiende después)

    tpcbox #>> tpcbox → boolean (estrictamente después)

    tpcbox #&> tpcbox → boolean (no se extiende antes)

Comparaciones

  • Compara dos tpcboxes; orden total sobre la codificación canónica (pcid, srid, flags, período y a continuación límites espaciales en orden XYZ-min/max)

    tpcbox = tpcbox → boolean

    tpcbox <> tpcbox → boolean

    tpcbox < tpcbox → boolean

    tpcbox <= tpcbox → boolean

    tpcbox > tpcbox → boolean

    tpcbox >= tpcbox → boolean