folium: paquete para desarrollo de mapas web
Contents
folium: paquete para desarrollo de mapas web#
Descripción general#
folium es una biblioteca de Python para el desarrollo de mapas web, basada en la biblioteca Leaflet de JavaScript. Así, es posible manipular los datos con bibliotecas de Python (ej. pandas, GeoPandas) y presentarlos en mapas Leaflet a través de folium
.
folium
sigue el paradigma de Programación Orientada a Objetos, por lo que se implementa a través de un conjunto de clases. Algunas de las principales son:
Map: para crear y configurar un mapa
folium
.TileLayer: para crear una capa de teselas y agregarla a un mapa.
LayerControl: para crear un control de capas para un mapa.
Instalación#
folium
puede instalarse con pip
, conda
o mamba
, desde la línea de comandos del sistema operativo. Solo es necesario hacerlo de una forma.
# Con pip:
pip install folium
# Con conda:
conda install folium -c conda-forge
# Con mamba:
mamba install folium -c conda-forge
Carga#
# Carga de folium
import folium
# Versión de folium
folium.__version__
'0.12.1.post1'
Opciones básicas de configuración#
Las siguientes son algunas de las opciones de configuración que provee la clase Map.
# Creación de un mapa con un centro x, y (argumento location)
m = folium.Map(location=[10, -84])
# Despliegue del mapa en el notebook
m
# Especificación del ancho y del largo (en pixeles) del mapa (argumentos width y height)
m = folium.Map(
location=[10, -84],
width=650, height=400)
m
# Especificación del nivel inicial de acercamiento (argumento zoom_start)
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7)
m
Manejo de capas base#
Las capas base que se usan en los mapas web, suelen estar implementadas mediante tiles (mosaicos, teselas). Unen múltiples fragmentos rectangulares del mapa y los despliegan de manera conjunta, siguiendo acciones como acercamientos (zoom in) y alejamientos (zoom out). Ejemplos populares de servicios web geoespaciales que utilizan esta arquitectura son OpenStreetMap y Google Maps, entre muchos otros.
Los mapas de teselas utilizan un estándar “de facto” conocido como slippy map o XYZ. Según este, los archivos de las teselas (ej. PNG) se referencian a través de coordenadas X, Y e Z (de zoom).
folium
ofrece un conjunto de capas de teselas predeterminadas y también la posibilidad de utilizar otras.
Capas predeterminadas#
Por defecto, folium
utiliza OpenStreetMap como mapa base. Pueden elegirse otros mapas base mediante el argumento tiles
, el cual tiene un conjunto de valores predeterminados:
“OpenStreetMap”
“Mapbox Bright”
“Mapbox Control Room”
“Stamen” (“Terrain”, “Toner” y “Watercolor”)
“Cloudmade” (Requiere una llave del API)
“Mapbox” (Requiere una llave del API)
“CartoDB” (“positron” y “dark_matter”)
# 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
Otras capas XYZ#
El siguiente es un ejemplo que utiliza como capa 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
Pueden encontrarse más fuentes de mapas XYZ en, por ejemplo:
El complemento QuickMapServices de QGIS.
Controles#
folium
proporciona un conjunto de controles que le permiten al usuario interactuar con el mapa.
# Control de escala (argumento control_scale)
m = folium.Map(
location=[10, -84],
width=650, height=400,
zoom_start=7,
control_scale=True)
m
# Control de capas (clase LayerControl)
# 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
# Grabación del mapa en el disco
m.save("/home/mfvargas/mapa-folium.html")
Mapas con múltiples capas#
# Mapa con capa base y capa vectorial
# 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="https://raw.githubusercontent.com/gf0657-programacionsig/2022-ii/main/contenido/4/datos/ign/red_vial.geojson", name='Red vial').add_to(m)
# Control de capas
folium.LayerControl().add_to(m)
# Despliegue del mapa
m