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 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.

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
    
  • 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);
    -- ERROR:  Operation on TPCBox values with different schemas: 1 vs 2
    
  • Devuelve true si dos tpcboxes son iguales en las dimensiones que comparten

    tpcbox ~= tpcbox → boolean
    
    SELECT tpcbox(0, 0, 2, 2) ~= tpcbox(0, 0, 2, 2);
    -- t
    
  • Devuelve true si dos tpcboxes son adyacentes (comparten un límite)

    tpcbox -|- tpcbox → boolean
    
    SELECT tpcbox(0, 0, 2, 2) -|- tpcbox(5, 5, 7, 7);
    -- f
    

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)

    SELECT tpcbox(0, 0, 2, 2) << tpcbox(5, 5, 7, 7);
    -- t
    
  • 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)

    SELECT tpcbox(0, 0, 2, 2) <<| tpcbox(5, 5, 7, 7);
    -- t
    
  • 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)

    -- Neither box carries a z dimension, so the front/back test is false.
    SELECT tpcbox(0, 0, 2, 2) <</ tpcbox(5, 5, 7, 7);
    -- f
    
  • 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)

    -- Neither box carries a time span, so the before/after test is false.
    SELECT tpcbox(0, 0, 2, 2) <<# tpcbox(5, 5, 7, 7);
    -- f
    

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
    
    SELECT tpcbox(0, 0, 2, 2) = tpcbox(0, 0, 2, 2);
    -- t
    SELECT tpcbox(0, 0, 2, 2) <> tpcbox(5, 5, 7, 7);
    -- t
    SELECT tpcbox(0, 0, 2, 2) < tpcbox(5, 5, 7, 7);
    -- t