Capítulo 12. Búferes circulares temporales

Tabla de contenidos

Búferes circulares estáticos
Entrada y salida
Constructores
Conversión de tipos
Accesores
Transformaciones
Operaciones espaciales
Operaciones de distancia
Comparaciones
Búferes circulares temporales
Validez de los búferes circulares temporales
Entrada y salida
Constructores
Conversión de tipos
Accesores
Transformaciones
Modificaciones
Restricciones
Operaciones espaciales
Operaciones de cuadro delimitador
Operaciones de distancia
Relaciones siempre y alguna vez
Relaciones espaciotemporales
Comparaciones
Agregaciones
Simplificación
Indexación

Un tipo de búfer circular estático cbuffer representa un punto 2D y un radio mayor o igual que 0 alrededor del punto. El radio representa el «impacto» del punto sobre su entorno. Este impacto puede interpretarse como ruido, contaminación o aspectos similares según los requisitos de la aplicación.

El tipo cbuffer sirve como tipo base para definir el tipo de búfer circular temporal tcbuffer. El tipo tcbuffer tiene una funcionalidad similar al tipo de punto temporal tgeompoint con la excepción de que solo considera dos dimensiones. Por lo tanto, la mayoría de las funciones y operadores descritos anteriormente para el tipo tgeompoint también son aplicables para el tipo tcbuffer. Además, hay funciones específicas definidas para el tipo tcbuffer.

La Figura 12.1, “Ilustración del uso del tipo tcbuffer para modelar el búfer circular alrededor de la franja de viento de las tormentas tropicales en 2024.” ilustra el uso del tipo tcbuffer para modelar el búfer circular alrededor de la franja de viento de las tormentas tropicales en 2024. Los datos se obtienen de la National Oceanic and Atmospherique Administration (NOAA). Como se ilustra en la figura, los tipos tgeompoint y tcbuffer permiten la interpolación lineal, mientras que, como hemos visto en la Figura 7.2, “Ilustración del uso de los tipos tgeompoint (arriba) y tgeometry (abajo) para modelizar la trayectoria y la franja de viento de las tormentas tropicales en 2024.”, el tipo tgeometry solo permite la interpolación escalonada.

Figura 12.1. Ilustración del uso del tipo tcbuffer para modelar el búfer circular alrededor de la franja de viento de las tormentas tropicales en 2024.

Ilustración del uso del tipo tcbuffer para modelar el búfer circular alrededor de la franja de viento de las tormentas tropicales en 2024.

Búferes circulares estáticos

Un valor cbuffer es un par de la forma (point,radius) donde point es un punto geométrico y radius es un valor float mayor o igual que cero que representa un radio alrededor del punto expresado utilizando las unidades del SRID del punto. Ejemplos de entrada de valores de búfer circular son los siguientes:

SELECT cbuffer 'Cbuffer(Point(1 1), 0.3)';
SELECT cbuffer 'Cbuffer(Point(1 1), 10.0)';

El tipo cbuffer corresponde al resultado de la función de PostGIS ST_MinimumBoundingRadius.

Los valores del tipo de búfer circular deben satisfacer varias restricciones para que estén bien definidos. Ejemplos de valores incorrectos del tipo de búfer circular son los siguientes.

-- Incorrect point value
SELECT cbuffer 'Cbuffer(Linestring(1 1,2 2), 1.0)';
-- Incorrect 3D point
SELECT cbuffer 'Cbuffer(Point Z(1 1 1), 1.0)';
-- Incorrect radius value
SELECT cbuffer 'Cbuffer(Point(1 1), -2.0)';

A continuación damos las funciones y operadores para el tipo de búfer circular.

Entrada y salida

  • Devuelve la representación de texto conocido (WKT) o la representación extendida de texto conocido (EWKT)

    asText({cbuffer,cbuffer[]}) → {text,text[]}
    asEWKT({cbuffer,cbuffer[]}) → {text,text[]}
    
    SELECT asText(cbuffer 'Cbuffer(Point(1 1), 0.5)');
    -- Cbuffer(POINT(1 1),0.5)
    SELECT asText(ARRAY[cbuffer 'Cbuffer(Point(1 1),0.2)', 'Cbuffer(Point(1 1),0.5)']);
    -- {"Cbuffer(POINT(1 1),0.2)","Cbuffer(POINT(1 1),0.5)"}
    SELECT asEWKT(cbuffer 'Cbuffer(SRID=5676;Point(1 1),0.5)');
    -- SRID=5676;Cbuffer(POINT(1 1),0.5)
    SELECT asEWKT(ARRAY[cbuffer 'Cbuffer(SRID=5676;Point(1 1),0.2)',
      'Cbuffer(SRID=5676;Point(1 1),0.5)']);
    -- {"SRID=5676;Cbuffer(POINT(1 1),0.2)","SRID=5676;Cbuffer(POINT(1 1),0.5)"}
    
  • Devuelve la representación binaria conocida (WKB), la representación extendida binaria conocida (EWKB), la representación hexadecimal binaria conocida (HexWKB), o la representación hexadecimal extendida binaria conocida (HexEWKB)

    asBinary(cbuffer,endian text='') → bytea
    asEWKB(cbuffer,endian text='') → bytea
    asHexWKB(cbuffer,endian text='') → text
    asHexEWKB(cbuffer,endian text='') → text
    

    El resultado se codifica utilizando la codificación little-endian (NDR) o big-endian (XDR). Si no se especifica ninguna codificación, se utiliza la codificación de la máquina. Un búfer circular toma su SRID de su punto subyacente: asEWKB y asHexEWKB lo incluyen, mientras que las formas simples asBinary y asHexWKB lo omiten.

    SELECT asBinary(cbuffer 'Cbuffer(SRID=5676;Point(1 1),0.5)');
    -- \x0100000000000000f03f000000000000f03f000000000000e03f
    SELECT asEWKB(cbuffer 'Cbuffer(SRID=5676;Point(1 1),0.5)');
    -- \x01402c160000000000000000f03f000000000000f03f000000000000e03f
    SELECT asHexWKB(cbuffer 'Cbuffer(SRID=5676;Point(1 1),0.5)');
    -- 0100000000000000F03F000000000000F03F000000000000E03F
    SELECT asHexEWKB(cbuffer 'Cbuffer(SRID=5676;Point(1 1),0.5)');
    -- 01402C160000000000000000F03F000000000000F03F000000000000E03F
    
  • Entrada desde la representación de texto conocido (WKT) o desde la representación extendida de texto conocido (EWKT)

    cbufferFromText(text) → cbuffer
    cbufferFromEWKT(text) → cbuffer
    
    SELECT asText(cbufferFromText(text 'Cbuffer(Point(1 1),0.5)'));
    -- Cbuffer(POINT(1 1),0.5)
    SELECT asEWKT(cbufferFromEWKT(text 'SRID=5676;Cbuffer(Point(1 1),0.5)'));
    -- SRID=5676;Cbuffer(POINT(1 1),0.5)
    
  • Entrada desde la representación binaria conocida (WKB), desde la representación extendida binaria conocida (EWKB), o desde la representación hexadecimal extendida binaria conocida (HexEWKB)

    cbufferFromBinary(bytea) → cbuffer
    cbufferFromEWKB(bytea) → cbuffer
    cbufferFromHexEWKB(text) → cbuffer
    
    SELECT asEWKT(cbufferFromBinary(
      '\x0100000000000000f03f000000000000f03f000000000000e03f'));
    -- Cbuffer(POINT(1 1),0.5)
    SELECT asEWKT(cbufferFromEWKB(
      '\x01402c160000000000000000f03f000000000000f03f000000000000e03f'));
    -- SRID=5676;Cbuffer(POINT(1 1),0.5)
    SELECT asEWKT(cbufferFromHexEWKB(
      '01402C160000000000000000F03F000000000000F03F000000000000E03F'));
    -- SRID=5676;Cbuffer(POINT(1 1),0.5)
    

Constructores

  • Constructor para búferes circulares

    cbuffer(geompoint,float) → cbuffer
    
    SELECT asText(cbuffer(ST_Point(1,1), 0.3));
    -- Cbuffer(POINT(1 1),0.3)
    

Conversión de tipos

Los valores del tipo cbuffer se pueden convertir al tipo geometry utilizando un CAST explícito o utilizando la notación :: como se muestra a continuación. De manera similar, una geometry se puede convertir a un valor cbuffer utilizando la función ST_MinimumBoundingRadius de PostGIS.

  • Convierte entre un búfer circular y una geometría

    {geometry,cbuffer}::{cbuffer,geometry}
    
    SELECT ST_AsText(cbuffer(ST_Point(1,1), 1)::geometry);
    -- CURVEPOLYGON(CIRCULARSTRING(0 1,2 1,0 1))
    SELECT asText(geometry 'SRID=5676;CIRCULARSTRING(0 1,2 1,0 1)'::cbuffer);
    -- Cbuffer(POINT(1 1),1)
    SELECT asText(geometry 'SRID=5676;LINESTRING(0 0,2 2)'::cbuffer);
    -- Cbuffer(POINT(1 1),1.414213562373095)
    
  • Convierte un búfer circular y, opcionalmente, una marca de tiempo o un período, a un cuadro espaciotemporal

    stbox(cbuffer) → stbox
    stbox(cbuffer,{timestamptz,tstzspan}) → stbox
    
    SELECT stbox(cbuffer 'SRID=5676;Cbuffer(Point(1 1),0.3)');
    -- SRID=5676;STBOX X((0.7,0.7),(1.3,1.3))
    SELECT stbox(cbuffer 'Cbuffer(Point(1 1),0.3)', timestamptz '2001-01-01');
    -- STBOX XT(((0.7,0.7),(1.3,1.3)),[2001-01-01, 2001-01-01])
    SELECT stbox(cbuffer 'Cbuffer(Point(1 1),0.3)', tstzspan '[2001-01-01,2001-01-02]');
    -- STBOX XT(((0.7,0.7),(1.3,1.3)),[2001-01-01, 2001-01-02])
    

Accesores

  • Devuelve el punto

    point(cbuffer) → geompoint
    
    SELECT ST_AsText(point(cbuffer 'Cbuffer(Point(1 1), 0.3)'));
    -- POINT(1 1)
    
  • Devuelve el radio

    radius(cbuffer) → float
    
    SELECT radius(cbuffer 'Cbuffer(Point(1 1), 0.3)');
    -- 0.3
    

Transformaciones

  • Redondea el punto y el radio del búfer circular en el número de lugares decimales

    round(cbuffer,integer=0) → cbuffer
    
    SELECT asText(round(cbuffer(ST_Point(1.123456789,1.123456789), 0.123456789), 6));
    -- Cbuffer(POINT(1.123457 1.123457),0.123457)
    

Operaciones espaciales

  • Devuelve o establece el identificador de referencia espacial

    SRID(cbuffer) → integer
    setSRID(cbuffer,integer) → cbuffer
    
    SELECT SRID(cbuffer 'Cbuffer(SRID=5676;Point(1 1), 0.3)');
    -- 5676
    SELECT asEWKT(setSRID(cbuffer 'Cbuffer(Point(0 0),1)', 4326));
    -- SRID=4326;Cbuffer(POINT(0 0),1)
    
  • Transforma a una referencia espacial diferente

    transform(cbuffer,integer) → cbuffer
    transformPipeline(cbuffer,pipeline text,srid integer,
      is_forward boolean=true) → cbuffer
    

    La función transform especifica la transformación con un SRID de destino. Se genera un error cuando el búfer circular de entrada tiene un SRID desconocido (representado por 0).

    La función transformPipeline especifica la transformación con una canalización de transformación de coordenadas definida representada con el siguiente formato de cadena:

    urn:ogc:def:coordinateOperation:AUTHORITY::CODE

    El SRID del búfer circular de entrada se ignora y el SRID del búfer circular de salida se establecerá en cero a menos que se proporcione un valor a través del parámetro opcional srid. Como se indica en el último parámetro, la canalización se ejecuta de forma predeterminada en dirección hacia adelante; al establecer el parámetro en falso, la canalización se ejecuta en la dirección inversa.

    SELECT asEWKT(transform(cbuffer 'SRID=4326;Cbuffer(Point(4.35 50.85),1)', 3812));
    -- SRID=3812;Cbuffer(POINT(648679.0180353033 671067.0556381135),1)
    
    WITH test(cbuffer, pipeline) AS (
      SELECT cbuffer 'Cbuffer(SRID=4326;Point(4.3525 50.846667),1)',
        text 'urn:ogc:def:coordinateOperation:EPSG::16031' )
    SELECT asEWKT(transformPipeline(transformPipeline(cbuffer, pipeline, 4326), pipeline,
      4326, false), 6) FROM test;
    -- SRID=4326;Cbuffer(POINT(4.3525 50.846667),1)
    

Operaciones de distancia

  • Devuelve la distancia

    distance({geo,cbuffer},cbuffer) → float
    distance(cbuffer,{geo,cbuffer}) → float
    {geo,cbuffer} <-> cbuffer → float
    

    La distancia entre dos búferes circulares es la distancia entre sus puntos reducida por ambos radios, y es cero cuando los búferes se superponen. El resultado es NULL cuando la geometría está vacía.

    SELECT round(distance(geometry 'Point(1 0)', cbuffer 'Cbuffer(Point(4 0),0.5)'), 6);
    -- 2.5
    SELECT round(cbuffer 'Cbuffer(Point(0 0),0.5)' <-> cbuffer 'Cbuffer(Point(3 4),0.5)', 6);
    -- 4
    SELECT round(cbuffer 'Cbuffer(Point(0 0),3)' <-> cbuffer 'Cbuffer(Point(3 4),3)', 6);
    -- 0
    
  • Devuelve la distancia de aproximación más cercana

    nearestApproachDistance({stbox,cbuffer},{cbuffer,stbox}) → float
    {stbox,cbuffer} |=| {cbuffer,stbox} → float
    

    El valor es la menor distancia sobre el tiempo que comparten los dos argumentos, y es NULL cuando no comparten ninguno. Un búfer circular no lleva período, por lo que está presente en todo tiempo que abarca la caja.

    SELECT round(nearestApproachDistance(stbox 'STBOX X((1,-1),(3,1))', cbuffer 'Cbuffer(Point(4 0),0.5)'), 6);
    -- 0.5
    SELECT round(cbuffer 'Cbuffer(Point(4 0),0.5)' |=| stbox 'STBOX X((1,-1),(3,1))', 6);
    -- 0.5
    

Comparaciones

Los operadores de comparación (=, < y así sucesivamente) están disponibles para búferes circulares. Comparan primero los puntos y luego el radio de los argumentos. Excepto la igualdad y la desigualdad, los otros operadores de comparación no son útiles en el mundo real pero permiten que los índices de árbol B se construyan en búferes circulares.

  • Comparaciones tradicionales

    cbuffer {=, <>, <, >, <=, >=} cbuffer
    
    SELECT cbuffer 'Cbuffer(Point(3 3), 0.5)' = cbuffer 'Cbuffer(Point(3 3), 0.5)';
    -- true
    SELECT cbuffer 'Cbuffer(Point(3 3), 0.5)' <> cbuffer 'Cbuffer(Point(3 3), 0.6)';
    -- true
    SELECT cbuffer 'Cbuffer(Point(3 3), 0.5)' < cbuffer 'Cbuffer(Point(3 3), 0.6)';
    -- true
    SELECT cbuffer 'Cbuffer(Point(3 3), 0.6)' > cbuffer 'Cbuffer(Point(2 2), 0.6)';
    -- true
    SELECT cbuffer 'Cbuffer(Point(1 1), 0.5)' <= cbuffer 'Cbuffer(Point(2 2), 0.5)';
    -- true
    SELECT cbuffer 'Cbuffer(Point(1 1), 0.6)' >= cbuffer 'Cbuffer(Point(1 1), 0.5)';
    -- true
    
  • ¿Son los dos valores aproximadamente iguales con respecto a un valor épsilon?

    same(cbuffer,cbuffer) → boolean
    cbuffer ~= cbuffer → boolean
    
    SELECT cbuffer 'Cbuffer(Point(1 1), 0.3)' ~= cbuffer 'Cbuffer(Point(1 1.0000001),
      0.30000001)';
    -- true