Tabla de contenidos
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.

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.
Devuelve la representación de texto conocido (Well-Known Text o WKT) o la representación extendida de texto conocido (Extended Well-Known Text o 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 (Well-Known Binary o WKB), la representación extendida binaria conocida (Extended Well-Known Binary o EWKB), la representación hexadecimal binaria conocida (Hexadecimal Well-Known Binary o HexWKB), o la representación hexadecimal extendida binaria conocida (Hexadecimal Extended Well-Known Binary o 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 (Well-Known Text o WKT) o desde la representación extendida de texto conocido (Extended Well-Known Text o 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 (Well-Known Binary o WKB), desde la representación extendida binaria conocida (Extended Well-Known Binary o EWKB), o desde la representación hexadecimal extendida binaria conocida (Hexadecimal Extended Well-Known Binary o 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)
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])
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 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 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)
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