Folium: creación de mapas web interactivos con Python y Leaflet

Python se introdujo en el mundo de los SIG como un lenguaje de programación relativamente fácil de aprender y de utilizar. Según ha ido pasado el tiempo este lenguaje se ha vuelto omnipresente, ofreciendo soluciones para muchos usuarios diferentes: desde el análisis espacial (en este blog hemos hablado mucho sobre el uso de Python en SIG de escritorio para automatizar tareas), hasta la gestión grandes volúmenes de datos por lo que es empleado en las empresas de Big Data.

Por su parte, Leaflet es una librería JavaScript que nos permite publicar mapas en la web de forma rápida y eficaz.

La unión de ambos mundos llega de la mano de Folium. Mediante Folium podemos manipular los datos en Python y visualizar los resultados en Leaflet.

Requisitos del sistema

Folium es una librería que requiere la instalación de un par des herramientas, por lo tanto el primer paso será hacer la instalación de todos los elementos que forman su arquitectura:

  • En primer lugar necesitamos Python y su manejador de paquetes pip. Pip es un sistema de gestión de paquetes utilizado para instalar y administrar paquetes de software escritos en Python.
  • También necesitamos instalar Jupyter, que es un entorno o una shell que nos permite escribir las instrucciones en Python y ver los resultados en Leaflet. A Jupyter podemos acceder desde el navegador y aunque nosotros lo utilizaremos con Python admite otros lenguajes como R. Esta novedosa herramienta nacida en 2014, está siendo utilizada por científicos de datos e investigadores, para procesar grandes cantidades de datos.

Instalación de Folium

Lo primero será instalar Python. Esto podemos hacerlo desde la página de descargas de Python, aunque desde la página de Jupyter nos recomiendan que lo hagamos utilizando Anaconda. Con Anaconda se instalan conjuntamente Python y Jupyter.

Si somos usuarios de Ubuntu, y ya tenemos instalado Python, tenemos que seguir los siguientes pasos:

1.- Actualizamos Ubuntu:

sudo apt-get update && sudo apt-get -y upgrade

2.- Instalamos Pip en Ubuntu 16.04:

sudo apt-get install python-pip

3.- Verificamos que Pip está instalado escribiendo:

pip -V

Obtendremos un resultado como el siguiente:

pip 8.1.1 from /usr/lib/python3.9/dist-packages (python 3.9)

En este caso necesitamos actualizar la versión de pip. Para lo cual escribimos:

python3 -m pip install --upgrade pip python3 -m pip install jupyter

5.- Accedemos a Jupyter:

jupyter notebook

Esta operación nos abrirá una ventana en nuestro navegador con la url: http://localhost:8888/tree. Veremos un árbol con las carpetas de nuestro equipo, ya que en este caso hemos realizado la instalación en local.

Para cerrar Jupyter notebook tecleamos Ctrl+C y confirmamos (y)

6. Instalar Folium:

pip install folium

Con este último paso habremos instalado Folium y completado la instalación. Es ahora cuando estamos en condiciones empezar a trabajar con Python y visualizar los datos en Leaflet.

Trabajando con Folium

En la vista de navegador de Jupyter veremos que en la parte derecha hay una pestaña con el nombre «New«. Si hacemos clic sobre ella se nos despliega un menú:

Seleccionaremos la opción Python 3. Se nos abre una herramienta con unas ventanas donde podemos empezar a escribir las órdenes en Python.

Escribimos lo siguiente:

import folium 
m = folium.Map(location=[40.965, -5.664])

Para crear un mapa como vemos el único requisito necesario es proporcionar las coordenadas del centro de mapa. Folium utiliza por defecto como mapa base OpenStreetMap.

Una vez escrito lo anterior hacemos clic sobre el botón «Run»

En la línea 2 simplemente escribimos

m

El resultado es el mapa que se muestra a continuación:

Otros ejemplos

En la página de Folium podemos consultar una galería de mapas y sus ejemplos. Por defecto Folium utiliza OpenStreetMap, pero están disponibles otras teselas raster como Stamen Terrain, Stamen Toner, Mapbox Bright y Mapbox Control Room.

Para utilizar Stamen Toner escribimos en la ventana lo siguiente y hacemos clic en el botón Run:

folium.Map( 
   location=[40.965, -5.664], 
   tiles='Stamen Toner', 
   zoom_start=16 
)
Si lo que queremos es añadir un marcador el código a utilizar será el siguiente:
m = folium.Map( 
    location=[40.965, -5.664], 
    zoom_start=12, 
    tiles='Stamen Terrain' 
) 
tooltip = 'plaza Mayor'
folium.Marker([40.965, -5.664], popup='Plaza Mayor', tooltip=tooltip).add_to(m) 

m

En el apartado anterior vemos que además de las coordenadas del centro del mapa, estamos definiendo el nivel de zoom y seleccionando la capa «Stamen Terrain«.

También se puede añadir un tooltip que muestra el texto indicado, en este caso «Plaza Mayor». Para crear el marcador utilizamos folium.Marker, pasamos las coordenadas del marcador y el texto que deseamos que se muestre en el PopUp.

Si quieres aprender a trabajar con Folium, ahora puedes inscribirte a nuestro curso online de Análisis Geoespacial con Python.

Let’s connect!

Date de alta en nuestra newsletter y te enviaremos GRATIS el ebook que te ayudará a impulsar tu perfil GIS:
Vitaminas MappingGIS

Tan solo una vez al mes recibirás las últimas novedades del sector GIS y de nuestros cursos

2 comentarios en «Folium: creación de mapas web interactivos con Python y Leaflet»

  1. Hola
    .. Quisiera marcar en el mapa, los Grados ejemplo desde el punto de long y lat una direccion a los 125°… como puedo hacer? GRACIAS

    • Hola Sergio:
      Debes actuar en folium igual que lo harías en Leaflet. Para dibujar una línea con origen en un punto y dirección en grados, debes importar los módulos folium y math para realizar conversión de grados a radianes. Un ejemplo es el siguiente:
      impor folium
      import math

      puntoOrigen = [40.965, -5.664];
      map = folium.Map(location=puntoOrigen, tiles=»Stamen Terrain», zoom_start=13)
      angulo = 125;
      distancia = 1000;

      anguloRadianes = (angulo * math.pi) / 180;

      latitudFinal = 40.965 + (distancia / 111320) * math.cos(anguloRadianes);
      longitudFinal = -5.664 + (distancia / (111320 * math.cos(40.965))) * math.sin(anguloRadianes);
      puntoFinal = [latitudFinal, longitudFinal];

      linea = folium.PolyLine(locations=[puntoOrigen, puntoFinal], color=’red’)
      linea.add_to(map)

      map
      Saludos

Los comentarios están cerrados.