Gracias a la versatilidad de Python y a la multitud de librerías existentes, podemos usar este popular lenguaje de programación para multitud de procesos y trabajos relacionados con el tratamiento y análisis de información espacial. En el siguiente artículos vamos a ver cómo podemos acceder a nuestra base de datos geográfica PostgreSQL-PostGIS con la librería psycopg2 y realizar consultas y operaciones sobre con nuestros datos SIG.
Instalación dela librería psycopg2.
Psycopg2 es una librería de Python que proporciona una interfaz para conectarse y trabajar con bases de datos PostgreSQL. Con ella, se pueden ejecutar consultas SQL, realizar transacciones, manejar errores entre otras funciones.
Para comenzar a usarla en nuestros scripts de Python debemos tenerla instalada antes. Un hábito recomendable es hacer la instalación de librerias de terceros dentro de entorno virtual. Gracias a esta práctica controlaremos las versiones de librerías y paquetes usadas en el proyecto, con independencia de las existentes en nuestro equipo.
En el siguiente código vemos como hacerlo usando nuestra terminal de comandos o dentro .
# Crear entorno virtual
python3 -m venv geoenv
# Activar entorno virtual (en Windows)
geoenv\Scripts\activate.bat
# Activar entorno virtual (en Linux/macOS)
source geoenv/bin/activate
# Instalar las librerías
pip install psycopg2
Conexión a la nuestra base de datos PostGIS
Partimos del hecho de que tenemos acceso a una bases de datos PostgreSQL/PostGIS .
Ya dentro de nuestro editor de código o IDE, lo primero que necesitamos es importar las librerías necesarias.
import psycopg2
Vamos a continuar creando una variable de tipo diccionario que tenga los parámetros de nuestra conexión.
# Parámetros de conexión
parametros = {
"host": "direccion_servidor",
"port": "puerto",
"user": "nombre_del_usuario",
"password": "contraseña",
"database": "nombre_de_la_base_de_datos"
}
Y terminamos creando la conexión.
conn = psycopg2.connect(**parametros)

Ejecución de consultas SQL
Establecida nuestra conexión, estamos en condiciones de ejecutar las sentencias en lenguaje SQL que necesitemos. Para ello vamos a necesitar crear primero un objeto de tipo cursor que nos permitirá interactuar con la base de datos, manejar transacciones y obtener resultados.
En el siguiente ejemplo realizamos una consulta a la tabla ‘poblaciones’, almacenando los resultados en una variable y mostrándolos, usando la estructura de control iterativa for.
# Crear cursor
cur = conn.cursor()
# Ejecutar consulta para obtener todas las filas de barrios
cur.execute("SELECT id, nombre, distrito FROM barrios")
Para poder acceder a los resultados los pasaremos una nueva variable que crea un objeto de tipo lista. Este objeto contiene una lista ordenada de elementos o tupla con las filas de la tabla. Para ello usamos el método del cursor fetchall().
# Obtener resultados
resultados = cur.fetchall()
# Recorrer y mostrar resultados
for fila in resultados:
print(fila)

Siempre que vayamos a añadir nuevos datos (INSERT), actualizar (UPDATE) o borrar registros (DELETE), además de ejecutar el código SQL correspondiente deberemos guardar los cambios con la función commit().
# Ejecutar consulta DELETE que borra el barrio con el id 1
cur.execute("DELETE FROM barrios WHERE id = %s", (1,))
# Guardar cambios
conn.commit()
Uso de funciones espaciales de PostGIS
Gracias a que hemos dotado a nuestra base de datos de capacidad de almacenamiento y análisis de objetos geográficos con la extensión PostGIS, será posible también realizar consultas espaciales.
Vamos algunas de ellas.
# Ejecutar consulta para calcular el área de un polígono
cur.execute("SELECT id, nombre, distrito, ST_Area(geom) FROM barrios WHERE ST_Area(geom) > %s", (50000,))
resultados_area = cur.fetchall()

Y aquí otro ejemplo haciendo una intersección.
# Ejecutar consulta para obtener la intersección entre dos capas
cur.execute("SELECT ST_Intersection(geom1, geom2) FROM barrios, poblaciones WHERE barrios.id_poblacion = poblaciones.id")
resultados_intersec = cur.fetchall()
Cerrando el curso y la conexión
Una vez realizadas nuestras consultas y operaciones es importante cerrar tanto el cursor abierto como la conexión usando close(). Al abrir una conexión estamos reservando recursos del sistema (memoria y conexiones de red) y esta función los liberará. Además, al cerrar la conexión se asegura de que se guarden todos los cambios realizados en la base de datos, es decir se hace un commit de las operaciones realizadas.
cur.close()
conn.close()
Documentación
- Librería Psycopg https://www.psycopg.org/docs/
- Función ST_AREA de PostGIS https://postgis.net/docs/ST_Area.html
- Función ST_Intersection de PostGIS https://postgis.net/docs/ST_Intersection.html
Me es muy grato enterarme de éste Programa Master en Sistemas de Información Geográficas.
Para iniciarlo en febrero 2023