Cómo hacer consultas espaciales con PostGIS

Contribución:
Ing. Sist. Mauricio Márquez Goa
Equipo IDECOR


14 de abril 2021.

PostgreSQL es un sistema de gestión de bases de datos relacionales, orientada a objetos y de código abierto. Con su extensión PostGIS añade importantes capacidades geoespaciales, que permiten realizar consultas y procesos geográficos de forma rápida y segura, optimizando los tiempos de respuesta y el trabajo de los usuarios.

En un artículo anterior (“Paso a paso: cómo añadir capas PostGIS en QGIS”) explicamos las ventajas del trabajo con bases de datos espaciales y cómo conectar sesiones de QGIS a ella. En esta 2da entrega te mostramos cómo realizar consultas espaciales básicas con PostGIS.

Preparación del set de datos

Los datos a utilizar en los ejemplos se han obtenido de la sección Descargas de MapasCordoba. Se seleccionaron las siguientes capas:

  • Redes viales, del apartado Transporte.
  • Parcelas (pedanía Capital), desde el apartado Catastro.
  • Establecimientos Educativos y Centros de Salud Públicos, del apartado Geografía Social.

Descargados los archivos y siguiendo los pasos descritos en la nota anterior, se logra disponer los datos en una base de datos local (Imagen 1), para luego proseguir con la ejecución de las sentencias y los análisis particulares (1).

Imagen 1. Vista de los datos descargados e implementados en un proyecto QGIS.

La construcción de consultas SQL para la generación de nuevo datos, requiere el uso de términos específicos como Where, Select, geom, From, AS, entre otros.

Cálculo de superficies

La función st_area se encarga de devolver el área de un polígono. Para calcular el área simplemente debe anteponerse la función “st_area” al campo “geom” (campo que contiene la geometría de las entidades). Por ejemplo, para agregar un campo área en la capa de parcelas, puede utilizarse la siguiente sentencia:

select *, concat(round((st_area(geom)::numeric),2), ‘ m²’) as area FROM public.»parcelas»

Se observa que se agregan otras funciones, tales como:

  • concat: para concatenar expresiones agregando, en este caso, la unidad m².
  • round: para limitar el número de decimales.

Al ejecutar la sentencia se agrega a la capa de parcelas un campo virtual denominado “área”, el cual muestra el valor del área geométrica de la parcela (Imagen 2).

Imagen 2. Vista de la ejecución de la consulta st_area  en el gestor de base de datos.

Ahora, al consultar cualquier parcela puede conocerse el valor del área geométrica, calculada a partir de la sentencia SQL ejecutada (Imagen 3). Es importante mencionar que este mismo cálculo, como otros que se describen más adelante, también puede realizarse usando las funciones estándares de QGIS; no obstante, con una base parcelaria de más de 2 millones de objetos, como la Provincia de Córdoba, demandaría varias horas, mientras que con PostGIS se resolvería en algunos minutos.

Imagen 3. Consulta de atributos en QGIS donde se observa el nuevo campo añadido.

Cálculo de centroides

La función st_centroid suministra el punto central de un vector o polígono. Para calcular el centroide debe anteponerse la función “st_centroid” al campo “geom” (Imagen 4), como se indica a continuación:

select *, st_centroid(geom) as geom_centroid FROM public.»parcelas»

Imagen 4. Vista de la ejecución de la consulta st_centroid  en el gestor de base de datos PostGIS.

La ejecución de la sentencia agrega a la tabla de parcelas un campo virtual denominado geom_centroid, con la geometría del centroide de cada entidad (lo que intrínsecamente, refiere a las coordenadas). Al añadir dicha tabla en QGIS se observará una capa de puntos, correspondientes a los centroides de las parcelas (Imagen 5).

Imagen 5. Vista de la capa de puntos en QGIS, obtenidas al calcular el centroide de las parcelas.

Cálculo de distancias

La función st_distance devuelve la distancia existente entre dos vectores. En el siguiente ejemplo se obtiene la distancia entre los centroides de los elementos a y b, como se indica a continuación:

select st_distance(st_centroid(a.geom), st_centroid(b.geom)) from esquema.tabla a, esquema.tabla b

Por ejemplo, si se desea calcular la distancia entre el centroide de la parcela de la Catedral de la ciudad de Córdoba (cuya identificación catastral es nomenclatu=1101010404007002) y el centroide de la parcela correspondiente al centro comercial Patio Olmos (nomenclatu=1101010404058039), la consulta a realizar es la siguiente (Imagen 6):

select concat(round(st_distance(st_centroid(a.geom),st_centroid(b.geom))::numeric,2), ‘ metros’) as distancia

from public.parcelas a, public.parcelas b

where a.nomenclatu = ‘ 1101010404007002’ and b.nomenclatu = ‘ 1101010404058039’

En la consulta se han agregado algunas funciones complementarias, tales como:

  • concat: para concatenar expresiones agregando, en este caso, la unidad metros.
  • round: que permite limitar el número de decimales.
  • where: a fin de filtrar las parcelas con las identificaciones catastrales mencionadas.

Imagen 6. Vista de la ejecución de la consulta se_distance en el gestor de base de datos.

Disolver

La función st_union devuelve la geometría única de una colección de geometrías. Para hacer una unión (disolve) hay que anteponer la función “st_union” al campo “geom”; así, con la sentencia “select st_union(geom) from esquema.tabla” se disuelve la geometría de los elementos presentes en la tabla.

Cálculo de longitud

La función st_length devuelve la longitud bidimensonal de una figura geométrica lineal. Para ejecutar la función es necesario anteponer a “st_length” el campo “geom” a medir, de la siguiente manera: “select st_length(geom) from esquema.tabla”. Por ejemplo, para calcular la longitud de todos los tramos de la red vial nacional, la consulta será:

select *, concat(round((st_length(geom)::numeric),2), ‘ m’) as distancia from public.»red_nacional»

¿Querés seguir profundizando?

En una próxima entrega trabajaremos con sentencias espaciales complejas para construir capas en QGIS a partir de geoprocesos, directamente desde PostGIS.

Por sugerencias, dudas o inquietudes podés contactar al equipo de IDECOR en [email protected]. Para mantenerte informado seguinos en Instagram (idecor.ok) y en el canal de YouTube IDECOR.


(1) Para la realización del ejercicio debe contarse con PostgreSQL y PostGIS previamente instalados en el equipo y trabajarse con la versión de QGIS 3.0 o superior.