top of page

Cómo Crear un GeoGiff Animado Usando Qgis y Datos Oficiales

  • 20 may 2025
  • 6 Min. de lectura

Actualizado: 29 jul 2025



Durante mis años estudiando he notado una contradicción general en el país. Mientras que existen datos generados con la más alta calidad por el INEGI, sobre todo en el apartado geográfico, la mayor parte de los reclutadores no están al tanto de los sistemas de información geográfica y su poder. Es por ello que estoy escribiendo este blog a forma de tutorial para la generación de un giff animado que muestra los casos de feminicidio registrados en el estado de Nuevo León desde el 2015 al 2025. 




  1. Obteniendo los datos

Para este Giff utilizaremos la base de datos de incidencia delictiva publicada por la SESNSP. Este archivo desgloza los datos por año, municipio y subtipo de delito y se tiene que descargar el conjunto completo (o como minimo no encontré una versión ya filtrada). Sin embargo, les comparto lo dos scripts escritos en python que utilicé para generar el archivo que necesitaremos en el paso siguiente (scripts generados con inteligencia artificial):


Filtrando los datos

import pandas as pd

# 1. Leer el archivo con codificación ISO-8859-1
df = pd.read_csv("IDM_NM_feb25.csv", encoding='ISO-8859-1')

# 2. Filtrar las entradas de Nuevo León
# (Aseguramos que el nombre de la columna coincida exactamente)
df_nuevo_leon = df[df['Entidad'] == 'Nuevo León']

# 3. Exportar a nuevo archivo en UTF-8
df_nuevo_leon.to_csv("IDM_NL.csv", index=False, encoding='utf-8')

# Mensaje de confirmación
print("¡Proceso completado con éxito!")
print(f"Registros exportados para Nuevo León: {len(df_nuevo_leon)}")
print("Archivo generado: IDM_NL.csv") 

Este primer código filtra las columnas necesarias y genera un nuevo archivo ya filtrado. Sin embargo, este se podría incluir directamente en el script completo.


Generando Archivo

import pandas as pd

# 1. EDITAR ESTA VARIABLE SEGÚN EL CRIMEN DESEADO
CRIMEN = "Feminicidio"

# 2. Leer archivo ya filtrado para Nuevo León
try:
    df = pd.read_csv("IDM_NL.csv", encoding='utf-8')
except FileNotFoundError:
    raise FileNotFoundError("Primero genera IDM_NL.csv con el script anterior")

# 3. Filtrar por tipo de delito específico
df_filtrado = df[df['Tipo de delito'] == CRIMEN].copy()

# 4. Calcular total anual por municipio y subtipo
columnas_meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
                 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre']

df_filtrado['Total anual'] = df_filtrado[columnas_meses].sum(axis=1)

# 5. Formatear columnas requeridas
df_final = df_filtrado.groupby(
    ['Municipio', 'Cve. Municipio', 'Año', 'Subtipo de delito']
)['Total anual'].sum().reset_index()

# 6. Renombrar columnas según especificación
df_final = df_final.rename(columns={
    'Municipio': 'Mun',
    'Cve. Municipio': 'CVE_Mun',
    'Subtipo de delito': 'Subtipo',
    'Total anual': 'Número de delitos'
})

# 7. Exportar
nombre_archivo = f"Evolución_{CRIMEN.replace(' ', '_')}_NL.csv"
df_final.to_csv(nombre_archivo, index=False, encoding='utf-8')

print(f"Archivo generado: {nombre_archivo}")
print(f"Municipios con datos: {df_final['CVE_Mun'].nunique()}")
print(f"Rango de años: {df_final['Año'].min()} - {df_final['Año'].max()}")

Este script genera un archivo en formato large utilizando el delito que especifiques. El resultado da un archivo con las siguientes 5 columnas: Mun, CVE_Mun, Año, Subtipo, Número de delitos. 

Ahora que tenemos los datos limpios y preparados podemos pasar al sistema de información geográfico (SIG) para procesar los mapas.


Representación de Datos 

Para este ejercicio utilizaremos el software open source Qgis. Además, usaremos las cartografía digital presentada por el inegi, la puedes descargar aqui

En este tutorial se supondrá que se tiene una noción básica del uso de Qgis, de todas maneras, las cosas que no se expliquen pueden ser entendidas con una rápida búsqueda en google o con IA. 


Preparando Datos en Qgis

Sube tu capa vectorial de municipios y el csv que generaste anteriormente. En mi caso, tengo mi base de datos general que no modifico y exporto un archivo nuevo solo con lo que necesito, asi que la próxima parte es opcional. 

Cuando exporto mi archivo mantengo sólo la clave geográfica y los nombres del municipio y entidad. A veces también incluyo POB1 (población total) aunque no sea necesario. Para hacer esto solo tienes que seleccionar "deseleccionar todo" y luego tomar las que si vas a usar. 

De igual manera, en mi caso puse un filtro a los municipios centrales para mayor comodidad en puntos siguientes. 


Unión de los datos

Ahora, es importante notar que la columna CVGEO de la capa vectorial de municipios corresponde a CVE_Mun del archivo que generamos al principio. Teniendo esto en cuenta, ve a la caja de herramientas de procesos y busca "unir atributos por valor de campo". A continuación, en capa de entrada selecciona tu capa vectorial de los municipios mientras que en campo de la tabla selecciona CVEGEO. Por el otro lado, en Capa de entrada 2 selecciona tu archivo csv y edita que campo de entrada 2 sea CVE_Mun. Finalmente, en tipo de unión cambia el 1 a 1 por uno a muchos. 

Como output deberás tener una capa vectoriaal con ambos valores, unidos por la clave en común. Cómo seleccionamos uno a muchos se genera un polígono por cada entrada repetida (por ejemplo, el municipio de Monterrey está duplicado 10 veces por los 10 años). Te recomiendo guardar la capa en este punto para evitar pérdidas. 


Graduar los colores

El siguiente paso es habitual. Primero, lo más probable es que la entrada de "número de delitos" se haya unido como texto. Esto se resuelve metiendote en el ábaco y creando una nueva entrada con el código to_real("Número de delitos" ).

En segundo punto, debes ir a graduado y escoger la entrada que acabas de crear como el valor. Aqui púedes ajustar los colores y como quieras pero te recomiendo que en modo de clasificación escojas "pretty breaks". En teoría podrías dejarlo asi pero como es un tema sensible no hay valores buenos a parte del 0. Entonces vamos a hacer que toda la representación sea de amarillo a rojo y que solo el 0 tenga un azul claro. 

Para eso, vuelve a cambiar la forma de representación, pero escoge directamente basado en reglas. Aqui, edita la regla que dice 0-5 (o los valores que tengas) de "Delitos" >= 0.000000 AND "Delitos" <= 5.000000 a "Delitos" >= 1.000000 AND "Delitos" <= 5.000000. Podras ver cómo el mapa cambia en este punto. Luego, añade una regla más con el botón de más y ponlo en else. Edita los colores como lo veas necesario. 


Añadir Atlas

En lugar de usar el controlador temporal predeterminado (que no es muy eficiente), utilizaremos el controlador de Atlas de una manera poco convencional.

Para esto, lo primero que vas a hacer es ir a Vectorial > Herramientas de investigación > Crear cuadrícula. Aquí lo que queremos es generar una cantidad de vectores que sea mayor a la cantidad de años que tenemos, así que solo tienen que ser más de 10. Como el estado de Nuevo León es muy grande, puse la cuadrícula en 100x100 km. A continuación, borra todos los valores después del 10 y elimina todas las columnas excepto la de id. Luego, crea una nueva columna cuyo valor se calculará como 2014 + "id". Esto servirá para obtener los años que corresponderían a los de la base de datos.

Ahora si, vamos a crear una nueva composición y la puedes editar como más te guste, añadiendo leyenda, título, escala etc. En mi caso voy a crear un reel de divulgación asi que está en las proporciones correspondientes. 

Vas a hacer click en el controlador de Atlas (1) y se va a abrir un nuevo panel a la derecha. Aqui selecciona tu cuadrícula como capa de cobertura (2) y selecciona el año que calculamos como el nombre de la página (3). Finalmente, has click en el mundo para activar el atlas. 

En este punto, el Atlas no mostrará cambios visibles, por lo que es necesario regresar al editor normal. Dentro de la configuración de estilo de capas, añade una nueva regla y define la condición "Año" = @atlas_pagename. Luego, arrastra las otras cinco reglas dentro de esta nueva hasta que aparezca un cuadro negro.


Una vez configurado todo, regresa al editor de composiciones. Ahora podrás cambiar el año con las flechas del Atlas. Para incluir el año en el título y que se actualice automáticamente en cada página, utiliza la siguiente expresión: [% 'Feminicidios registrados en Nuevo León durante ' || @atlas_pagename %]. Con esto, el título se ajustará automáticamente al año correspondiente en cada visualización del Atlas.


Ahora puedes editar los colores y formas como más te guste y ver cómo cambian los años. Puedes añadir información como sumas totales por año o etiquetas. Finalmente, fijate en la parte superior en el controlador del atlar, ahí verás un botón que se llama "exportar atlas como imágenes" y selecciona la carpeta donde se cargarán las imágenes.


Creando Giff

Una vez tengas las imágenes crudas ya estás preparado para crear un Gif. Para esto puedes usar tu editor de imagenes favorito, pero en este caso usaremos GIMP, otro software open source (gratuito) que nos permite hacer todo tipo de ediciones al estilo photoshop.


En el software solo debes de ir a archivo > abrir como capas, y ahí seleccionar las imágenes que seleccionaste. Después, puedes aplicar un filtro de optimización yendo a Filtros > Animación > Optimización (para gif) . Esto generará un nuevo archivo (puedes borrar el otro si quieres) que tendrá las imágenes con la información imprescindible para creación de un gif. Ahora solo tienes que exportarlo como GIF y seleccionar la casilla "como animación" y adaptar los milisegundos entre fotogramas.













Comentarios


bottom of page