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
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
CartoDB Positron
import folium
# Mapa interactivo
m = folium.Map(location = [34.06, -118.25], zoom_start = 8,
tiles = "CartoDB Positron")
m
Si quieres usar los estilos de Cloudmade o Mapbox tendrás que pasar tu API key al argumento API_key
.
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
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
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
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
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
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
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
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
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
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.
Puedes mostrar un mini mapa en folium agregando plugins.MiniMap()
al mapa. Por defecto, mostrará un pequeño mapa en la parte inferior derecha.
import folium
from folium import plugins
m = folium.Map(location = [34.06, -118.25], zoom_start = 8)
plugins.MiniMap().add_to(m)
m
El terminador (terminator) muestra la separación entre el día y la noche en el momento en el que se crea el mapa.
import folium
from folium import plugins
m = folium.Map(location = [34.06, -118.25], zoom_start = 1)
plugins.Terminator().add_to(m)
m
Un plugin interesante es Gocoder
, que agrega una barra de búsqueda que se puede utilizar para buscar localizaciones.
import folium
from folium import plugins
m = folium.Map(location = [34.06, -118.25], zoom_start = 1)
plugins.Geocoder().add_to(m)
m
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.
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
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.
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
También te puede interesar