En esta entrada vamos a conocer algunas expresiones de QGIS que nos facilitarán la depuración de datos asociados a nuestras capas. Sin duda no son las únicas existentes. Las funciones de QGIS son numerosísimas pero estas os serán de gran utilidad.
Depuración y normalización de direcciones postales con QGIS
Dentro de los tipos de trabajos que hacemos desde Geoinnova, se encuentran por ejemplo la consultoría SIG de proyectos relacionados con diagnóstico y análisis de indicadores urbanos como la movilidad (aparcamientos, terrazas, señalética…) o la cobertura de servicios dotacionales municipales (equipamientos deportivos, sanitarios, escolares…).
Este tipo de trabajo está siendo muy demandado en proyectos vinculados con redacción de Agendas Urbanas vinculados con el Plan de Recuperación, Transformación y Resiliencia – Next Generation EU.
En numerosas ocasiones los datos de partida necesitan un trabajo de normalización previo importante. Un caso muy común es el que se realiza con las direcciones postales. Es habitual encontrar en una única columna información de tipo ‘Calle de Antonio Machado nº1’, ‘C/ Machado 1’, ‘calle Antonio Machado 1 izq’.
Este proceso consiste primero en depurar y normalizar los datos en bruto y posteriormente separarlos en columnas para su manejo más eficaz. Tras este último trabajo, la capa podría pasar a contar 3 campos: tipo vial, nombre vial y número portal.
Indudablemente, si tenemos pocos datos esta trabajo podemos hacerlas a mano. Pero ¿qué ocurre si tenemos 10.000 direcciones? Gracias a QGIS y sus funciones podemos automatizar este trabajo al máximo y reducir al mínimo los casos en los que tengamos que hacer edición manual.
Al final, todo el proceso irá enfocado a conseguir información de más calidad que se trasladará sin duda a los resultados del proyecto.
Función String_to_array
En programación, se le denomina vector, matriz o array a una zona de almacenamiento contiguo que contiene una serie de elementos del mismo tipo. Una array con los datos de una dirección postal sería por ejemplo la siguiente:
direccion = [‘Calle’, ‘Machado’, ‘1’]
Si queremos obtener un elemento de esta matriz, accederemos a é por su índice que siempre empieza por 0. Es decir, para el valor del tipo de calle, su puntero sería direccion[0]. Para el número de portalero es direccion[2].
QGIS tiene varias expresiones que trabajan con array.

Nos interesa conocer la función string_to_array que convierte un texto a una matriz según un delimitador.
Pongamos un ejemplo. Tenemos un campo (direccion) que indica una intersección de calles separadas por un guion.
- Calle Plata nº1 – Avenida Cervantes 12
- Calle Marín 23 – Paseo Ángel Montilla.
Para separar las direcciones la expresión sería la siguiente:
string_to_array (direccion, ‘-‘)

Podemos ver en Previsualizar el resultado al aplicar la función.
Y para obtener la primera calle y usarla para actualizar el campo que almacena la primera calle de la intersección es:
string_to_array (direccion, ‘-‘)[0]

Con lo que obtendremos solo la primera dirección postal de la intersección.
Función Trim
Esta función elimina todos los espacios en blanco y tabulaciones de comienzo y final de una cadena.
Sobre el ejemplo anterior, ya que antes y después del guion hay espacios, el texto de la primer calle tendría un espacio al final.

Si añadimos la función trim, este espacio será eliminado.

Funciones con expresiones regulares
Las expresiones regulares son patrones utilizados para encontrar una determinada combinación de caracteres dentro de una cadena de texto y son ampliamente usadas en informática.
Dentro de QGIS servirán por ejemplo para validar que el dato introducido cumple un determinado patrón. En esta entrada del blog puede consultarse un ejemplo para validar la entrada de una referencia catastral.
Su uso dentro en funciones es también muy útil. Con regexp_match encontramos la cadena coincidente con el patrón definido. Aplicado al caso de las direcciones, podemos recuperar solo el texto numérico que identifica el número de portal usando la siguiente expresión:
regexp_substr('Calle Plata nº1 izq.','\\d+')

También usando expresiones regulares mediante la función regexp_replace, podríamos reemplazar ‘Avda.’ por ‘Avenida’
regexp_replace( 'Avda. Plata nº1', 'Avda.', 'Avenida')

Otra posibilidad es conmutar orden de cadenas como en el siguiente ejemplo donde cambiamos el texto ‘Mozárabes, Avenida’ por ‘Avenida de los Mozárabes’
regexp_replace('Mozárabes, Avenida','(.*),(.*)','\\2 de \\1')
Funciones sobre cadenas
Son varias las funciones para trabajar con cadenas de texto.
Concat
Concatena varias cadenas en una. La podemos usar para obtener el texto de una dirección postal completa.
concat('Paseo' ,' de ', 'Los Patios', ' nº ', '1')

Format
Da un paso más sobre la función anterior. Nos permite dar formato a la salida usando argumentos.
format('%1 de %2 nº %3', 'Paseo', 'Los Patios', '1')

Upper/Lower
Conversión de cadenas a mayúsculas o minúsculas
upper('Carretera')

Left/Right
Caracteres a la derecha o izquierda desde una posición dada.
right('Carretera comarcar CO-234', 6)

Condicionales CASE
Si queremos que el resultado final dependa de un conjunto de condiciones definidas usaremos la función CASE.
En el siguiente ejemplo, se ha recopilado las posibles formas en las que se ha indicado que el vial es una Avenida y se ha normalizado mediante una función.
CASE
WHEN "calle" like 'Av %' THEN regexp_replace( "calle", 'Av', 'Avenida')
WHEN "calle" like 'Avd %' THEN regexp_replace( "calle", 'Avd', 'Avenida')
WHEN "calle" like 'Avd. %' THEN regexp_replace( "calle", 'Avd.', 'Avenida')
ELSE "calle"
END
Y vemos el resultado de su aplicación.

En resumen
Como hemos podido comprobar, QGIS es un Sistema de Información Geográfica realmente potente y cuenta con opciones avanzadas como la expresiones para la depuración y revisión de los datos asociados.
Si estás interesado en conocer el manejo profesional de SIG de código abierto por excelencia puedes consultar el temario de nuestro curso QGIS Avanzado.
¿Quieres comentarnos algo? Adelante!