2 Consultas Espaciales sobre BD
En este apartado vamos a ver cómo realizar Consultas Espaciales desde QGIS y desde R sobre PostGIS.
2.1 Consultas desde QGIS
QGIS ofrece varias posibilidades para analizar información geográfica. En este caso, el análisis se realiza en la BD (PostGIS), mediante la consulta que ejecuta: QGIS actúa como medio de acceso a la BD y de representación gráfica del resultado. Las operaciones a realizar sobre BD están basadas en Marquez (2015).
Para formular una consulta en SQL desde QGIS sobre una BD Espacial, en primer lugar, debemos acceder al administrador de BD de QGIS (pulsando sobre Base de datos > Administrador de bases de datos…) y seleccionar una BD para conectarnos a ella. Previamente hemos de haber definido la conexión, como se ha hecho en el tema de almacenamiento de información geográfica.
Una vez con acceso a la BD, debemos abrir la pestaña para formular consultas: pulsando sobre la opción Base de datos > Ventana SQL. El resultado es que se abre una pestaña de formulación de consultas asociada a la BD seleccionada en el momento de abrir la ventana. Se pueden tener varias pestañas de consulta abiertas al mismo tiempo, una por cada BD distinta.
2.1.1 Consulta sobre una capa
La consulta que vamos a definir se muestra a continuación.
Obtenemos un buffer (ST_Buffer
) a partir de las líneas de una capa. Además, en la misma consulta, los componentes del resultado se fusionan (ST_Union
). La consulta se ha definido en PostGIS para la capa correspondiente a la red hidrográfica del municipio.

Figura 2.1: Consulta y resultado sobre PostGIS desde QGIS.
En la figura 2.1, se puede ver la formulación de la consulta en la ventana de consultas de PostGIS. Al pulsar sobre el botón Ejecutar, PostGIS ejecuta la consulta y devuelve el resultado en forma de tabla. Si seleccionamos la opción Cargar como capa nueva, podemos indicar la columna que identifica los registros (si hay alguna) y la columna del resultado que contiene los datos geométricos (en la figura, la columna zona_rio
); si pulsamos sobre el botón Cargar, carga los resultados como una capa más de QGIS, sobre la que podemos operar normalmente.

Figura 2.2: Resultado de la consulta de PostGIS como capa en QGIS.
La capa resultado de la consulta cargada en QGIS se muestra en la figura 2.2. Partiendo de una capa vectorial compuesta por líneas, hemos obtenido una capa compuesta por polígonos mediante las operaciones de transformación que hemos utilizado.
2.1.2 Consulta sobre dos capas
Vamos a realizar un consulta sobre datos geográficos en la que intervienen dos capas. A continuación, se muestra la definición de la consulta considerada para PostGIS.
SELECT p.*
FROM cc_portal_lanjaron_jsamos p
WHERE EXISTS (
SELECT *
FROM red_hidro_lanjaron_jsamos
WHERE ST_DWithin(p.geom, geom, 100)
);
Se trata de obtener los portales (de la capa de CartoCiudad) que se encuentren a menos de una distancia determinada de un elemento de la red hidrográfica. Definiremos la distancia de manera que se obtenga un resultado no vacío.

Figura 2.3: Consulta sobre dos capas y resultado obtenido.
En la figura 2.3, se puede ver la formulación de la consulta. En este caso, podemos indicar la columna que identifica los registros y la columna del resultado que contiene los datos geométricos.

Figura 2.4: Resultados de las consultas como capas en QGIS.
La capa resultado de la consulta (junto con la capa resultado de la consulta anterior) cargada en QGIS se muestra en la figura 2.4.
2.2 Consultas desde R
En este apartado vamos a realizar desde R, sobre una BD de nuestro municipio, las mismas consultas desarrolladas en el apartado 2.1 desde QGIS.
2.2.1 Consulta sobre una capa
Para realizar una consulta sobre una BD podemos utilizar la función st_read
del paquete sf
. En el parámetro con
indicamos la cadena de conexión, en este caso, la indicada para acceder a la BD PostGIS.
library(sf)
con <- RPostgres::dbConnect(
RPostgres::Postgres(),
dbname = 'lanjaron_jsamos',
host = 'localhost',
port = '5432',
user = 'postgres',
password = 'postgres'
)
query = paste(
'SELECT ST_Union(ST_Buffer(geom, 100)) as zona_rio',
'FROM red_hidro_lanjaron_jsamos',
sep = " "
)
resultado <- st_read(con, query = query)
plot(st_geometry(resultado))
La consulta también se define como una cadena que se pasa como parámetro a la función st_read
. El resultado es una capa que podemos tratar normalmente

Figura 2.5: Consulta sobre una capa y resultado obtenido en RStudio.
En la figura 2.5, se muestra la consulta y el resultado obtenido en RStudio.
Podemos obtener el mismo resultado utilizando la BD exclusivamente para obtener la capa original y transformándola adecuadamente mediante funciones del paquete sf
, como se muestra a continuación.
redHidro <- st_read(con, layer="red_hidro_lanjaron_jsamos")
resultado <- st_union(st_buffer(redHidro, dist = 100))
plot(st_geometry(resultado))
Con QGIS podríamos haber realizado una transformación similar a partir de la capa original, mediante las operaciones disponibles en los menús para datos vectoriales.
2.2.2 Consulta sobre dos capas
query = paste(
'SELECT p.*',
' FROM cc_portal_lanjaron_jsamos p',
'WHERE EXISTS (',
' SELECT *',
' FROM red_hidro_lanjaron_jsamos',
' WHERE ST_DWithin(p.geom, geom, 100)',
')',
sep = " "
)
resultado2 <- st_read(con, query = query)
plot(st_geometry(resultado2), col = 'red',
add = TRUE)
En el fragmento de código anterior, se muestran las operaciones para realizar la consulta en la que intervienen dos capas y la presentación del resultado junto a al resultado obtenido en el último apartado. Se usa la variable con la cadena de conexión definida anteriormente.

Figura 2.6: Consulta sobre dos capas y resultado obtenido en RStudio.
En la figura 2.6, se muestra la consulta sobre dos capas y el resultado obtenido en RStudio.