La operación de buffer es común en los flujos de trabajo GIS, y también está disponible en PostGIS. PostGIS es una extensión que convierte el sistema de base de datos PostgreSQL en una base de datos espacial. La combinación de ambos es una solución perfecta para el almacenamiento, gestión y mantenimiento de datos espaciales. PostGIS además se convierte en una alternativa real al uso de archivos shapefile.
La herramienta ST_Buffer de PostGIS
La función ST_Buffer es una herramienta de geoprocesamiento de geometrías que nos devuelve una geometría que representa todos los puntos cuya distancia a esta geometría es menor o igual a la distancia dada.
Para el tipo geometry los cálculos están en el Sistema de Referencia Espacial de esta geometría. Para el tipo geography se utiliza una transformación plana.
Antes de continuar vamos a explicar que es esto de los tipos geometry y geography:
La base para el tipo de geometría PostGIS es un plano. El camino más corto entre dos puntos en el plano es una línea recta. Eso significa que los cálculos sobre geometrías (áreas, distancias, longitudes, intersecciones, etc) se pueden calcular utilizando matemáticas cartesianas y vectores de línea recta. Utilizamos el tipo geometry para cálculos sobre áreas a escala local, regional o nacional.
La base para el tipo geográfico de PostGIS es una esfera. El camino más corto entre dos puntos de la esfera es un arco de círculo máximo. Eso significa que los cálculos sobre las geografías (áreas, distancias, longitudes, intersecciones, etc) debe calcularse sobre la esfera, usando matemáticas más complicadas. Utilizaremos el tipo geography si necesitamos realizar cálculos a escala continental o mundial.
La sintaxis a emplear para calcular un buffer con PostGIS si trabajamos con el tipo geometry es:
ST_Buffer(geometry g1, float radius_of_buffer);
Para el tipo geography:
ST_Buffer(geography g1, float radius_of_buffer_in_meters);
Utiliza como datos de entrada la geometría y la distancia de separación. Se genera un polígono con un borde a una distancia de separación fuera de la geometría de entrada.
Existen otras opciones como: ‘quad_segs=#’ : número de segmentos utilizados para crear un cuarto de círculo (por defecto 8), ‘endcap=round|flat|square’: estilo de los tramos finales, ‘join=round|mitre|bevel’: estilo de la unión, ‘mitre_limit=#.#’ : ángulo mínimo.
Ejemplo
Utilizaremos la función ST_Buffer para crear una área de influencia alrededor de una capa de puntos.
En primer lugar crearemos una nueva tabla que contendrá la nueva geometría.
Llamaremos a la nueva tabla buffer.
Para definir la nueva tabla, al menos hay que crear dos campos:
- un id que será la clave primaria
- un campo geom, ya que trabajaremos con el tipo geometry, que será de tipo polígono y en el EPSG:4326, el mismo Sistema de Referencia Espacial que la tabla de entrada.
CREATE TABLE buffer ( id serial primary key, geom geometry (Polygon, 4326) );
Después, insertaremos en nuestra tabla las nuevas geometrías generadas con la función ST_Buffer:
INSERT INTO buffer (geom) SELECT ST_Buffer(geom, 2) FROM cities;
Con estas tres líneas insertamos dentro de la tabla que acabamos de crear una geometría poligonal creada a partir de la geometría de cities con un radio de 2. El número 2 indica las unidades del Sistema de Referencia Espacial de la capa de entrada, como estamos trabajando con el EPSG:4326, que es el WGS84, las unidades son los grados decimales. Por lo tanto estamos creando un buffer con un radio de 2 grados.
Un buffer con los atributos de la tabla de origen
¿La tabla buffer conserva los mismos atributos que la original?
Cuando creamos un buffer a partir de una tabla de puntos, la nueva tabla ( que denominamos buffer) debe tener los mismos campos que la tabla a partir de la que crearemos este buffer.
Ejemplo:
CREATE TABLE buffer ( id serial primary key, "name" varchar(50), geom geometry (Polygon, 4326) );
Aquí hemos añadido los campos id, name y geom.
A continuación creamos el buffer insertando tanto la geometría (que procede de un buffer) y el nombre (que procede del campo nombre de la tabla original)
INSERT INTO buffer (geom, name) SELECT ST_Buffer(geom,2), name FROM cities;
Visualizando el resultado con QGIS
Una vez realizamos la conexión desde QGIS a PostGIS añadimos las capas cities y la nueva tabla del buffer:
Un buffer en metros
Para calcular el radio del buffer en metros tenemos dos opciones, o emplear un EPSG proyectado o trabajar con el tipo geography.
Vamos a trabajar con el tipo geography, manteniendo la capa original (la de las ciudades) en su EPSG original, es decir, EPSG:4326. En primer lugar creamos la tabla con un campo de tipo geography (geog):
CREATE TABLE buffer_m ( id serial primary key, geog geography (Polygon, 4326) );
A continuación debemos calcular el buffer a partir de la capa cities, teniendo en cuenta que debemos realizar una conversión de la columna de geometría de esta capa, el campo geom, desde el tipo geometry al tipo geography mediante el uso de cast (geom::geography).
INSERT INTO buffer_m (geog) SELECT ST_Buffer(geom::geography, 200) FROM cities;
Creación de un buffer automáticamente mediante el uso de vistas
Las vistas son tablas que se actualizan dinámicamente. Por ejemplo, al añadir una tabla espacial a la base de datos, la vista geometry_columns se actualiza automáticamente con el contenido espacial de la capa.
Al consultar la vista geometry_columns, los clientes y librerías SIG pueden determinar que es lo que se puede esperar cuando se recuperan los datos y de esta manera realizar cualquier proyección que sea necesaria, el procesamiento o la representación sin necesidad de inspeccionar cada geometría.
Un uso interesante es la actualización dinámica de capas en QGIS con vistas de PostGIS.
Se puede hacer por ejemplo que una vista almacene buffers de una capa de puntos. De tal modo que al crear un nuevo punto (por ejemplo con QGIS) en la base de datos, se genera automáticamente el buffer alrededor de ese punto.
En este pequeño ejercicio vamos a ver una demostración de por qué es una buena idea utilizar PostGIS como almacén de datos en combinación con QGIS.
Vamos ver cómo se pueden utilizar vistas para crear capas dinámicas que se actualizan cuando cambian las capas de su entorno.
En primer lugar en PostGIS, en nuestra base de datos creamos una vista con esta sentencia SQL:
CREATE VIEW vw_cities_buffer as SELECT gid, st_buffer(geom, 2) as geom, name FROM cities;
Si vamos a la lista de vistas veremos que se ha creado una nueva vista con el nombre vw_cities_buffer
Puedes abrir esta vista para comprobar cómo se ha rellenado automáticamente con los mismos registros de la capa cities, ya que en la sentencia le hemos dicho que cree una vista que contenga un buffer con un radio de 2 grados.
Ahora vamos a QGIS y realizamos la conexión a nuestra base de datos y añadimos las capas de ciudades y la nueva vista:
A continuación vamos a añadir un nuevo punto, para ello marcamos la capa cities y con el botón derecho seleccionamos la opción “Conmutar edición”:
Asegúrate de que tienes visible la barra de herramientas “digitalización” y haz clic sobre el botón “Añadir objeto espacial”.
Añadimos una nueva ciudad y hacemos clic en Aceptar en la ventana de los atributos del objeto (no es necesario que rellenes ningún campo).
Una vez añadido el punto debemos guardar la edición para que se guarde este objeto espacial en nuestra tabla de PostGIS. Volvemos a hacer clic en “Conmutar edición” y guardamos los cambios.
¿Qué ha sucedido? Se ha generado automáticamente un buffer sobre la nueva ciudad.
Licenciado en Geografía. Máster en Sistemas de Información Geográfica. Consultor GIS desde el año 2004. En MappingGIS desde el año 2012 para ayudarte a impulsar tu perfil GIS y diferenciarte de la competencia. Echa un vistazo a todos nuestros cursos de SIG online.
Hola Aurelio Morales
De nuevo aquí siguiendo tu brillante trabajo.
Me ayudo a construir buffers en metros a una capa multi polígono con SRID 3857.
CREATE or replace temp VIEW buffer_secciones as
SELECT gid, (ST_transform(st_buffer(ST_transform(the_geom, 3857), -100),4326)) as the_geom, seccion FROM seccion;
Saludos desde México 😉
Muchas gracias por la información Aurelio, soy seguidor de la pagina y la consulto frecuentemente para aprender nuevas cosas del mundo SIG, saludos desde Colombia.
Muchas gracias a ti por seguirnos Juan Pablo. Me alegro de que nuestros artículos sean de tu interés. Saludos desde España!
Q buen ejemplo Aurelio Felicidades y muchas gracias mas claro no podría ser . sigue adelante y no dejes de ayudarnos.
Gracias Sergio 🙂 ¡Estos comentarios nos animan a seguir! Saludos.