Mapas de leaflet en Python con folium

Mapas de leaflet con folium

La librería folium es la implementación en Python de la librería leaflet JS. Para crear un mapa interactivo tendrás que especificar las coordenadas que quieras con location y elegir el nivel de zoom con zoom_start.

Mapa base

import folium

# Mapa interactivo
m = folium.Map(location = [34.06, -118.25], zoom_start = 8)
m
Make this Notebook Trusted to load map: File -> Trust Notebook

Mapa base

El argumento tiles permite especificar diferentes tipos de mapa base, tales como "Stamen Terrain", "CartoDB Positron", "stamentoner", etc. El valor por defecto es "OpenStreetMap" y puedes encontrar más estilos online.

Stamen Terrain

import folium

# Mapa interactivo
m = folium.Map(location = [34.06, -118.25], zoom_start = 8,
               tiles = "Stamen Terrain")
m
Make this Notebook Trusted to load map: File -> Trust Notebook

CartoDB Positron

import folium

# Mapa interactivo
m = folium.Map(location = [34.06, -118.25], zoom_start = 8,
               tiles = "CartoDB Positron")
m
Make this Notebook Trusted to load map: File -> Trust Notebook

Si quieres usar los estilos de Cloudmade o Mapbox tendrás que pasar tu API key al argumento API_key.

Marcadores

Puedes agregar marcadores a folium con las funciones folium.Marker y add_to. Tras crear el mapa podrás agregar un marcador, especificando su localización, como en el ejemplo siguiente.

import folium

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Agregar un marcador al mapa
folium.Marker(location = [34.06, -118.25]).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Marcadores con icono

Los marcadores también pueden tener un icono bootstrap y un color personalizado. Tendrás que pasar un folium.Icon al argumento icon con el icono y color deseado.

import folium

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Agregar un marcador con icono al mapa
folium.Marker(location = [34.06, -118.25],
              icon = folium.Icon(icon = "cloud", color = "red")).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Marcadores circulares

Los marcadores también pueden ser círculos que se pueden agregar con la función CircleMarker. Estos marcadores se pueden personalizar de varias formas, dado que es posible personalizar el radio (en píxeles), el color de fondo y de borde y la opacidad.

import folium

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Agregar un marcador circular
folium.CircleMarker(
    location = [34.06, -118.25],
    radius = 10,
    fill = True,
    color = "blue",
    fill_color = "red",
    fill_opacity = 0.25).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Agregar varios marcadores a la vez

Ten en cuenta que puedes agregar tantos marcadores como quieras. Si tienes un data frame que contiene las coordenadas para varios puntos puedes agregarlos a la vez utilizando un bucle for como el del siguiente bloque de código.

import folium
import pandas as pd

# Coordenadas
coords = pd.DataFrame({'lon': [34.06, 34.17, 34.42],
                       'lat': [-118.25, -118.40, -118.89]})

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Agregar varios marcadores al mapa
for index, row in coords.iterrows():
  folium.Marker(location = [row["lon"], row["lat"]]).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Círculos

Los círculos son parecidos a los marcadores circulares, pero la diferencia es que el radio de los círculos se mide en metros mientras que el de los marcadores circulares se mide en píxeles. Estos círculos se pueden utilizar, por ejemplo, para mostrar el área de influencia de una tienda.

import folium

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Círculo con un radio de 50km
folium.Circle(
    location = [34.06, -118.25],
    radius = 50000,
    color = "red",
    fill = True,
    fill_color = "blue").add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Rectángulos

De manera similar a los círculos, también es posible agregar rectángulos al mapa, pero en este caso tendrás que especificar las coordenadas (límites) del rectángulo como en el ejemplo siguiente.

import folium

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Coordenadas del rectángulo
upper_left = [34.15, -118.44]
upper_right = [34.15, -118.06]
lower_right = [33.89, -118.06]
lower_left = [33.89, -118.44]

# Rectángulo
folium.Rectangle(
  bounds = [upper_left, upper_right, lower_right, lower_left],
  stroke = True,
  fill = True,
  color = "blue",
  fill_color = "#3388ff",
  fill_opacity = 0.5).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Polígonos (GeoJSON)

Es posible agregar polígonos a los mapas de folium con la función GeoJson. Tan solo tendrás que pasar un archivo geojson a data, establecer el nombre de la capa con name y agregar estilos con style_function, en caso de ser necesario.

import folium

m = folium.Map(location = [38.34, -0.49], zoom_start = 13)

# URL del geojson
geojson_url = "https://raw.githubusercontent.com/R-CoderDotCom/data/main/sample_geojson.geojson"

# Estilos deseados
style = {'fillColor': 'red', 'color': 'blueviolet'}

# Geojson
folium.GeoJson(data = geojson_url, name = "geojson",
    style_function = lambda x:style).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Pop-ups

La mayoría de las funciones proporcionan un argumento llamado popup que se puede utilizar para mostrar un mensaje cuando se hace click sobre la capa. Intenta hacer click sobre el siguiente marcador circular para leer el mensaje.

import folium

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Agregar un marcador circular with a popup
folium.CircleMarker(
    location = [34.06, -118.25],
    fill = True,
    popup = "¡Mensaje!").add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Seleccionar capas

También es posible seleccionar o deseleccionar diferentes capas. Considera que tienes un mapa con marcadores circulares y otros marcadores normales. Tendrás que utilizar la función FeatureGroup y luego LayerControl, de modo que podrás seleccionar o deseleccionar las distintas capas.

import folium

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

# Agregar un marcador circular
folium.CircleMarker(
    location = [34.06, -118.25]).add_to(folium.FeatureGroup(name = 'Marcador circular').add_to(m))

# Agregar un marcador
folium.Marker(
    location = [34.14, -118.35]).add_to(folium.FeatureGroup(name = 'Marcador').add_to(m))

# Agregar la capa de control
folium.LayerControl().add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Plugins de folium

Folium proporciona una serie de plugins con funcionalidades adicionales. En las subsecciones siguientes destacaremos algunos de los mejores plugins disponibles, pero encontrarás más en la documentación original.

Mini mapa

Puedes mostrar un mini mapa en folium agregando plugins.MiniMap() al mapa. Por defecto, mostrará un pequeño mapa en la parte inferior derecha.

Make this Notebook Trusted to load map: File -> Trust Notebook
import folium
from folium import plugins

m = folium.Map(location = [34.06, -118.25], zoom_start = 8)

plugins.MiniMap().add_to(m)

m

Terminador

El terminador (terminator) muestra la separación entre el día y la noche en el momento en el que se crea el mapa.

Make this Notebook Trusted to load map: File -> Trust Notebook
import folium
from folium import plugins

m = folium.Map(location = [34.06, -118.25], zoom_start = 1)

plugins.Terminator().add_to(m)

m

Geocoder

Un plugin interesante es Gocoder, que agrega una barra de búsqueda que se puede utilizar para buscar localizaciones.

Make this Notebook Trusted to load map: File -> Trust Notebook
import folium
from folium import plugins

m = folium.Map(location = [34.06, -118.25], zoom_start = 1)

plugins.Geocoder().add_to(m)

m

Clusters

Si tienes muchos marcadores puedes agruparlos con MarkerCluster en base al nivel de zoom. También puedes hacer click sobre los clusters para acercarte a ellos.

Make this Notebook Trusted to load map: File -> Trust Notebook
import folium
from folium import plugins
import numpy as np

# Longitudes y latitudes de muestra
data = np.array([np.random.uniform(low = 25, high = 50, size = 100),
                 np.random.uniform(low = -125, high = -70, size = 100)]).T

m = folium.Map([40, -100], zoom_start = 3)

plugins.MarkerCluster(data).add_to(m)

m

Mapa de calor

Por último, si quieres crear un mapa de calor puedes importar HeatMap desde folium.plugins con from folium.plugins import HeatMap y luego utilizar la función HeatMap para representar tus datos.

Make this Notebook Trusted to load map: File -> Trust Notebook
import folium
from folium import plugins
from folium.plugins import HeatMap
import numpy as np

# Longitudes y latitudes de muestra
data = np.array([np.random.normal(35, 2, size = 100),
                 np.random.normal(-80, 2, size = 100)]).T

m = folium.Map([35, -80], zoom_start = 5)

HeatMap(data).add_to(m)

m
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar