Cajas delimitadoras de nubes de puntos

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.

Entrada y salida

  • 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)
    

Constructores

  • 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)
    

Conversiones

  • 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)
    

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

Transformaciones

  • 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
    

Operaciones de conjuntos

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

Operaciones topológicas

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
    

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

  • 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