En Python la visualización de los datos se convierte en un tarea primordial. Es importante para la presentación de los datos, pero también como herramienta de análisis.
Cuando se trata de datos geográficos una herramienta muy útil es ipyleaflet, una librería de Python que nos permite el empleo de Leaflet en los cuadernos de Jupyter. Leaflet es una librería JavaScript utilizada en webmapping, dispone de un conjunto de clases para el manejo de datos vectoriales, capas de teselas, así como de controles para la navegación por el mapa.
Ipyleaflet no es la única librería de Python para trabajar con Leaflet. Al final de este artículo compararemos brevemente Ipyleaflet con Folium, una librería con características similares y que ya tratamos en este artículo.
Índice
Cómo instalar ipyleaflet
Ipyleaflet es un herramienta de Python diseñada para trabajar con Jupyter Notebook.
Podemos instalar ipyleaflet mediante pip o también empleando Conda. En el caso de Conda escribiremos en una terminal lo siguiente:
conda install -c conda-forge ipyleaflet
En este tutorial vamos instalar Ipyleaflet a través de Anaconda, tal y como explicamos en este tutorial de Anaconda y jupyter Notebook.
Seleccionamos el entorno en el que vamos a trabajar, que como norma general será uno diferente del base, pues no es aconsejable trabajar en él. Una vez dentro del nuevo entorno buscamos ipyleaflet. Se nos instalará la librería con sus dependencias:
Una vez completada la instalación ya podemos abrir el cuaderno de Jupyter y empezar a trabajara con ipyleaflet.
Selección de un mapa base para nuestro mapa de Leaflet
La documentación de ipyleaflet tiene muchos ejemplos para su aplicación, nosotros vamos a iniciar un recorrido por algunas de sus características empezando por añadir un mapa base.
Ipyleaflet nos permite utilizar los mapas base de referencia más habituales como OpenStreetMap, cartoDB, ESRI, etc… Lo primero que tenemos que hacer es importar las clases Map y BaseMap.
from ipyleaflet import Map, basemaps
Ni que decir tiene que conocer la librería de Leaflet nos facilitará el trabajo. Para construir un mapa con Leaflet tenemos que proporcionar necesariamente dos datos: las coordenadas del centro del mapa y el nivel de zoom. En consecuencia escribiremos lo siguiente:
m= Map(basemap=basemaps.OpenStreetMap.Mapnik, center=[40.965, -5.664], zoom=14) m
Como puedes observar, en este caso el mapa base que utilizamos es el de OpenStreetMap y seguidamente indicamos el centro y el nivel de zoom.
En la última línea decimos que nos muestre el mapa con «m» o display(m).
En este GIFT te mostramos cómo incluir un mapa base de Esri:
Dibujar un marcador
Si en el mapa anterior quisiésemos dibujar un marcador, lo haríamos de la siguiente manera:
marcador=[40.965, -5.664] marker = Marker(location=marcador, draggable=True) m.add_layer(marker);
Añadir servicios WMS al mapa
Con ipyleaflet también podemos añadir servicios WMS a nuestro mapa.
Por ejemplo, para añadir el WMS con las ortofotos de PNOA, importamos Map y WMSLayer. Luego creamos el mapa con las coordenadas del centro y el nivel de zoom. Definimos los parámetros de la conexión al servicio WMS indicando su url, el nombre de la capa el formato y la autoría.
#WMS de PNOA from ipyleaflet import Map, WMSLayer m = Map(center=(40.965, -5.664), zoom=6) wms = WMSLayer( url='https://www.ign.es/wms-inspire/pnoa-ma?SERVICE=WMS&', layers='OI.OrthoimageCoverage', format='image/png', transparent=True, attribution='CC BY 4.0 scne.es' ) m.add_layer(wms) m
La capa con el servicio wms la añadimos al mapa con el método add_layer. El resultado, visto en el cuaderno de Jupyter es el siguiente:
Añadir datos GeoJSON
Una de las características de Leaflet es el empleo de forma nativa del formato GeoJSON. Se pueden generar facilmente datos vectoriales en este formato mediante la herramienta https://geojson.io/
Utilizando esta herramienta hemos creado un polígono que tendrá la forma siguiente:
geojson= { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "coordinates": [ [ [ -5.664433835831147, 40.96546803808141 ], [ -5.6646321801141255, 40.96472614634328 ], [ -5.6637465498267545, 40.9645694075854 ], [ -5.663446727073449, 40.965259055336816 ], [ -5.664433835831147, 40.96546803808141 ] ] ], "type": "Polygon" } } ] }
Para trabajara con el formato GeoJSON en ipyleaflet debemos importar la clase GeoJSON:
from ipyleaflet import Map, GeoJSON
En este momento ya podemos crear el mapa con los datos que hemos definido antes:
m = Map(center=( 40.965259055336816, -5.6634), zoom=16) geo_json = GeoJSON( data=geojson, style={ 'fillColor': 'red','opacity': 1, 'dashArray': '9', 'fillOpacity': 0.5, 'weight': 1 }, hover_style={ 'color': 'white', 'dashArray': '0', 'fillOpacity': 0.1 }, ) m.add_layer(geo_json) m
Como se puede observar, al hacer la instancia a GeoJSON indicamos por un lado el origen de los datos y a continuación definimos dos estilos. El primero es el estilo con el que se dibuja el polígono y el segundo ‘hover_style’, es el estilo que se muestra al pasar el cursor sobre el polígono. Al igual que hicimos antes añadimos la capa al mapa con el método add_layer():
Añadir controles al mapa
Los controles disponibles en Leaflet también los podemos utilizar en ipyleaflet.
Un ejemplo en el que añadimos el control de capas al mapa es el siguiente:
from ipyleaflet import Map, WMSLayer,basemaps, basemap_to_tiles, LayersControl m = Map(center=(40.965, -5.664), zoom=6) wms = WMSLayer( url='https://www.ign.es/wms-inspire/pnoa-ma?SERVICE=WMS&', layers='OI.OrthoimageCoverage', format='image/png', transparent=True, attribution='CC BY 4.0 scne.es' ) basemap=basemap_to_tiles(basemap=basemaps.CartoDB.DarkMatter) m.add_layer(basemap) m.add_layer(wms) control = LayersControl(position='topright') m.add_control(control) m
Como se puede observar, estamos creando dos capas: una con el servicio WMS que utilizamos antes y otra con una capa base de CartoDB. Creamos el control mediante LayerControl()
Los controles que podemos añadir son:
- Zoom
- Scale
- Layers
- Fullscreen
- Measure
- SplitMap
- Draw
- Widget
- Legend
- Search
Ipyleaflet vs folium
Una diferencia clave entre Folium e ipyleaflet es que ipyleaflet se basa en ipywidgets y permite la comunicación bidireccional entre el frontend y el backend, lo que permite el uso del mapa para capturar la entrada del usuario, mientras que Folium está diseñado para mostrar solo datos estáticos.
Otra diferencia es que Folium habilita muchas extensiones de Leaflet, algunas de las cuales pueden no estar disponibles en ipyleaflet en este momento.
Sin embargo la diferencia más significativa entre ambas es que Ipyleaflet es un widget, y está enfocado a su uso dentro de Jupyter, siendo complicado su uso fuera de los notebooks. Mientras que Folium es una librería, y se puede utilizar tanto dentro como fuera de Jupyter.
Tutor del curso online de Análisis GeoEspacial con Python y de los cursos online de webmapping. Echa un vistazo a todos nuestros cursos de SIG online.