Capítulo 13. Búferes circulares temporales

Tabla de contenidos

Búferes circulares estáticos
Constructores
Conversión de tipos
Accesores
Transformaciones
Operaciones espaciales
Comparaciones
Búferes circulares temporales
Validez de los búferes circulares temporales
Entrada y salida
Constructores
Conversión de tipos
Accesores
Transformaciones
Modificaciones
Operaciones espaciales
Operaciones de distancia
Restricciones
Comparaciones
Operaciones de cuadro delimitador
Relaciones espaciales
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 13.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 13.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.

-- valor de punto incorrecto
SELECT cbuffer 'Cbuffer(Linestring(1 1,2 2), 1.0)';
-- punto 3D incorrecto
SELECT cbuffer 'Cbuffer(Point Z(1 1 1), 1.0)';
-- valor de radio incorrecto
SELECT cbuffer 'Cbuffer(Point(1 1), -2.0)';

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

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.

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

  • Redondear 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) → 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)
    
  • Transformar a una referencia espacial diferente

    transform(cbuffer,integer) → cbuffer

    transformPipeline(cbuffer,pipeline text,to_srid integer,is_forward bool=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 to_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)
    

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