Entrada

Cómo crear visualizaciones de mapas en Python con Folium

Genera mapas interactivos personalizados con la librería Folium.

1. Introducción

Folium es una librería de Python que te permite crear mapas interactivos de manera sencilla. En este post veremos:

  1. Cómo crear un mapa básico
  2. Leer un archivo GeoJson y mostrarlo en el mapa
  3. Añadir marcadores simples, clústers y mapas de calor

2. Requisitos previos

Antes de empezar, deberás instalar Folium si no lo tienes aún:

1
pip install folium

O si cuentas con un entorno de conda, que es lo que recomiendo, puedes instalarlo con:

1
conda install folium

Sobre cómo instalar un entorno de desarrollo con conda y cómo configurarlo, podéis utilizar el siguiente tutorial donde se explica paso por paso: How to Install Conda in VSCode

3. Crear un mapa básico

Primero, para crear un mapa deberemos de importar la librería e indicarle una posición inicial en coordenadas ([latitud, longitud]) y un zoom inicial.
Luego podremos movernos sobre el mapa, pero por ahora, pongamos que queremos centrar el mapa en la ciudad de Madrid:

1
2
3
4
5
6
7
import folium

# Creamos el mapa centrado en Madrid
m = folium.Map(location=[40.428, -3.76], zoom_start=12)

# Mostramos el mapa
m

4. Leer y añadir información desde un archivo GeoJson

Vamos a añadir información relativa a los distritos de Madrid. Este método es útil cuando queremos representar fronteras en nuestro mapa, o dividirlo por secciones.

Para el ejemplo, utilizaremos el siguiente archivo GeoJson que podréis encontrar en la web The Metabolism of Cities

En vez de añadirlos directamente sobre el mapa, lo que haremos será crear una capa GeoJson, que aparecerá en el lado derecho superior del mapa, y que nos permitirá ocultar o mostrar la información de los distritos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import json

# Leemos el archivo GeoJson
with open('neighbourhoods.geojson', 'r') as file:
    distritos = json.load(file)

# Crear el mapa centrado en Madrid
m = folium.Map([40.428, -3.76], zoom_start=12)


# Añadir los distritos como una capa GeoJson
distritos_layer = folium.FeatureGroup(name='Distritos', show=True)

folium.GeoJson(distritos,
               tooltip=folium.GeoJsonTooltip(
                   fields=['neighbourhood'],
                   aliases=['Barrio:'],
                   localize=True
               )
            ).add_to(distritos_layer)

# Agregar la capa al mapa
distritos_layer.add_to(m)

# Añadir el control de capas para activar/desactivar los distritos
folium.LayerControl().add_to(m)

# Mostrar el mapa
m

Mapa de Madrid con distritos

5. Añadir marcadores simples

Ahora vamos a añadir marcadores individuales en el mapa.

1
2
3
4
5
# Añadir un marcador en una ubicación
folium.Marker(
  location=[40.4169019, -3.7034834],
  popup='Plaza del Sol'
).add_to(m)

Marker simple

6. Agrupar marcadores en un clúster

Si necesitas mostrar la información de varios marcadores, la mejor manera de hacerlo es utilizando folium.plugins.MarkerCluster.
Esta función agrupará automáticamente los marcadores según la distancia, y conforme nos acerquemos en el mapa irán apareciendo los marcadores individuales.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from folium.plugins import MarkerCluster
import pandas as pd


df = pd.DataFrame({
    'latitude': [40.417, 40.428, 40.430],
    'longitude': [-3.703, -3.76, -3.74],
    'neighbourhood': ['Centro', 'Salamanca', 'Retiro']
})

locations = list(zip(df.latitude, df.longitude))
cluster = MarkerCluster(locations=locations, popups=df["neighbourhood"].tolist())

m.add_child(cluster)

Mapa de clústers

7. Crear un mapa de calor

Cuando necesitamos mostrar información de densidades, o queremos mostrar información adicional en el mapa, podemos utilizar un mapa de calor con folium.plugins.HeatMap.

1
2
3
4
5
from folium.plugins import HeatMap

heat_data = list(zip(df.latitude, df.longitude))

HeatMap(heat_data).add_to(m)

Mapa de calor

Ejemplo interactivo

En este mapa de ejemplo hemos creado un mapa de la ciudad de Madrid, indicando mediante clústers de marcadores los alojamientos y restaurantes, y añadiendo mediante un pequeño popup información de horarios, teléfono, etc.

Los datos se han obtenido directamente de la web de ‘datos.gob.es’, en:

Dado que los datos se encuentran en XML, deberemos de parsearlos y transformarlos en datatables.
El código podéis encontrarlo en GitHub.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.