Folium es un módulo de Python que crea mapas para la Web mediante la generación de código fuente en el lenguaje JavaScript para la biblioteca Leaflet, la cual es una de las más utilizadas para la programación de mapas interactivos. Los mapas y sus componentes (ej. capas, marcadores, controles) se construyen y configuran mediante las clases de Folium y sus métodos asociados.
Para instalar el Folium mediante Conda, deben ejecutarse las siguientes instrucciones desde la línea de comandos del sistema operativo (puede utilizarse la línea de comandos de Anaconda):
conda install folium -c conda-forge
El módulo Folium debe importarse mediante la sentencia import. Esta sentencia debe ejecutarse antes de invocar a cualquier clase o método de Folium.
import folium
# Impresión de la versión de Folium
print(folium.__version__)
0.11.0
A continuación se proporcionan algunos ejemplos de uso de las clases y métodos de Folium.
El centro de un mapa se especifica mediante el parámetro location.
# Creación de un mapa con un centro (x, y)
m = folium.Map(location=[10, -84])
# Despliegue del mapa en el notebook
m
Los parámetros width y height se utilizan para especificar respectivamente el ancho y el largo del mapa, en pixeles.
# Especificación del ancho y del largo (en pixeles) del mapa
m = folium.Map(
location=[10, -84],
width=650, height=400)
m
También es posible establecer un nivel inicial de acercamiento (zoom) del mapa mediante un número entre 1 (menor acercamiento) y 20 (mayor acercamiento). Para esto, se utiliza el parámetro zoom_start.
# Especificación del nivel inicial de acercamiento (zoom)
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7)
m
Por defecto, Folium utiliza OpenStreetMap como mapa base. Pueden elegirse otros mapas base mediante el parámetro tiles, el cual tiene un conjunto de valores predeterminados:
# Mapa de Stamen Terrain
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=5,
tiles='Stamen Terrain')
m
# Mapa de Stamen Toner
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
tiles='Stamen Toner')
m
# Mapa de Stamen Watercolor
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
tiles='Stamen Watercolor')
m
# Mapa de CartoDB positron
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
tiles='CartoDB positron')
m
# Mapa de CartoDB dark_matter
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
tiles='CartoDB dark_matter')
m
Además de los valores predeterminados, el parámetro tiles permite acceder a un conjunto personalizado de teselas mediante un URL de la forma http://%7Bs%7D.yourtiles.com/%7Bz%7D/%7Bx%7D/%7By%7D.png
El siguiente es un ejemplo que utiliza como mapa base el mapa "World Imagery" de ESRI. Pueden verse más ejemplos de mapas de ESRI en https://ocefpaf.github.io/python4oceanographers/blog/2015/03/23/wms_layers/.
# Mapa "World Imagery "de ESRI
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
tiles='http://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/MapServer/tile/{z}/{y}/{x}',
attr='ESRI World Imagery')
m
Registros de presencia de especies en la Infraestructura Mundial de Información en Biodiversidad (GBIF). Pueden verse más ejemplos de uso de este tipo de información en la documentación del API de mapas de GBIF.
# Registros de presencia de especies en GBIF
m = folium.Map(
location=[0, 0],
width=650, height=400,
zoom_start=1,
tiles='https://api.gbif.org/v2/map/occurrence/density/{z}/{x}/{y}@1x.png?style=purpleYellow.point',
attr='GBIF')
m
Folium incorpora también algunos controles para la manipulación del mapa.
El parámetro control_scale es un booleano (cuyo valor por defecto es False) que controla la aparición del control de escala en el mapa.
# Control de escala
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
control_scale=True)
m
Este método añade una capa de teselas (tiles) a un mapa.
El siguiente ejemplo añade al mapa una capa adicional. Para poder apreciar ambas capas, se adiciona también un control de capas, el cual se explicará en detalle más adelante.
# Se crea un mapa
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
control_scale=True)
# Se añade una capa base adicional
folium.TileLayer(
tiles='Stamen Terrain',
name='Stamen Terrain').add_to(m)
# Se crea un control de capas y se añade al mapa mediante el método add_to()
folium.LayerControl().add_to(m)
m
m.save('index.html')
Crea un control que permite activar y desactivar las capas de un mapa.
En el siguiente ejemplo, se crea un mapa, se añaden cuatro capas adicionales y también un control de capas para seleccionar cuales capas desean visualizarse.
# Creación de un mapa
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
control_scale=True)
# Se añaden capas base adicionales
folium.TileLayer(
tiles='CartoDB positron',
name='CartoDB positron').add_to(m)
folium.TileLayer(
tiles='Stamen Terrain',
name='Stamen Terrain').add_to(m)
# ESRI NatGeo World Map
folium.TileLayer(
tiles='http://services.arcgisonline.com/arcgis/rest/services/NatGeo_World_Map/MapServer/MapServer/tile/{z}/{y}/{x}',
name='NatGeo World Map',
attr='ESRI NatGeo World Map').add_to(m)
# Densidad de registros de presencia de especies
folium.TileLayer(
tiles='https://api.gbif.org/v2/map/occurrence/density/{z}/{x}/{y}@1x.png?&bin=hex&hexPerTile=28&style=classic.poly',
name='Densidad de registros de presencia de especies',
attr='GBIF').add_to(m)
# Se añade un control de capas
folium.LayerControl().add_to(m)
m
En el siguiente ejemplo, se crean dos objetos GeoJson a partir de dos archivos en ese formato, los cuales son añadidos como capas a un mapa. Como puede apreciarse, se utilizan los parámetros data y name del constructor de la clase GeoJson para espeficar los archivos de datos y los nombres de las capas que se desplegarán en el control de capas. El parámetro show especifica si la capa se muestra o no desde el inicio. Se emplea también la biblioteca os de Python para acceder a funciones del sistema operativo como, en este caso, el acceso a los archivos de datos.
# Biblioteca para funciones del sistema operativo
import os
# Rutas a los archivos GeoJson
cantones_geo = os.path.join('datos/', 'cr_limite_cantonal_ign_wgs84.geojson')
distritos_geo = os.path.join('datos/', 'cr_limite_distrital_ign_wgs84.geojson')
# Creación del mapa
m = folium.Map(location=[10, -84], tiles='CartoDB positron', zoom_start=7)
# Se añaden al mapa las capas GeoJson
folium.GeoJson(data=cantones_geo, name='Cantones').add_to(m)
# Control de capas
folium.LayerControl().add_to(m)
# Despliegue del mapa
m
El parámetro location del constructor de Marker se utiliza para especificar la posición del marcador.
# Creación del mapa
m = folium.Map(location=[10, -84], tiles='Stamen Toner', zoom_start=7)
# Se define la posición del marcador y se agrega al mapa con el método add_to()
folium.Marker(location=[10.463333, -84.703333]).add_to(m)
m
El parámetro popup se utiliza para especificar una hilera HTML que se desplegará en una ventana emergente al hacer clic sobre el marcador. Por su parte, el parámetro tooltip se usa para especificar una hilera de texto que se despliega al colocarse el ratón sobre el marcador.
# Creación del mapa
m = folium.Map(location=[10, -84], tiles='Stamen Watercolor', zoom_start=7)
# Se proporcionan valores para los parámetros "popup" y "tooltip"
folium.Marker(
location=[10.463333, -84.703333],
popup='<strong>Volcan Arenal</strong>',
tooltip='Clic para mas informacion').add_to(m)
m
Pueden utilizarse los parámetros color e icon y la clase Icon para personalizar los íconos de los marcadores. Los íconos pueden obtenerse de galerías como:
Para más información, puede consultarse la página https://github.com/lvoogdt/Leaflet.awesome-markers.
# Creación del mapa
m = folium.Map(location=[10.4699398, -84.657898], width=650, height=400, zoom_start=12)
folium.Marker(
location=[10.463333, -84.703333],
popup='<strong>Volcan Arenal</strong>',
tooltip='Volcan (clic para más informacion)',
icon=folium.Icon(color='cadetblue', icon='binoculars', prefix='fa')).add_to(m)
folium.Marker(
location=[10.4697321,-84.6509017],
popup='<strong>Hotel Secreto La Fortuna</strong>',
tooltip='Hotel (clic para más informacion)',
icon=folium.Icon(color='pink', icon='bed', prefix='fa')).add_to(m)
folium.Marker(
location=[10.4699015,-84.5823005],
popup='<strong>Aeropuerto de La Fortuna</strong>',
tooltip='Aeropuerto (clic para mas informacion)',
icon=folium.Icon(color='red', icon='plane', prefix='fa')).add_to(m)
m
Crea un marcador con forma de círculo y la medida de su radio como parámetro.
En el ejemplo que se presenta a continuación, se crean tres marcadores de círculo cuyos radios reflejan el tamaño de la población de las ciudades en los que se ubican.
# Creación de un mapa
m = folium.Map(
location=[10, -84],
width=650,
height=400,
zoom_start=7,
control_scale=True)
# Definición marcadores de círculo
folium.CircleMarker(
location=[9.866667, -83.916667],
popup='<strong>Cartago</strong><br>Poblacion: 156,600 h.',
tooltip='Cartago',
radius=156600/10000).add_to(m)
folium.CircleMarker(
location=[10.633333, -85.433333],
popup='<strong>Liberia</strong><br>Poblacion: 56,899 h.',
tooltip='Liberia',
radius=56899/10000).add_to(m)
folium.CircleMarker(
location=[9.983333, -83.033333],
popup='<strong>Limón</strong><br>Población: 58,522 h.',
tooltip='Limón',
radius=58522/10000).add_to(m)
m