#!/usr/bin/env python # coding: utf-8 # # How to draw a GeoPandas.GeoDataFrame into folium # # GeoPandas is a project to add support for geographic data to [pandas](http://pandas.pydata.org) objects. # (See https://github.com/geopandas/geopandas) # # It provides (among other cool things) a `GeoDataFrame` object that represents a Feature collection. # When you have one, you may be willing to use it on a folium map. Here's the simplest way to do so. # In this example, we'll use the same file as GeoPandas demo ; it's containing # [the boroughs of New York City](http://www.nyc.gov/html/dcp/download/bytes/nybb_14aav.zip). # In[1]: import geopandas url = ( "https://raw.githubusercontent.com/python-visualization/folium/master/examples/data" ) nybb = f"{url}/nybb.zip" boros = geopandas.read_file(nybb) boros # To create a map with these features, simply put them in a `GeoJson`: # In[2]: import folium m = folium.Map([40.7, -74], zoom_start=10, tiles="cartodbpositron") folium.GeoJson(boros).add_to(m) m # Quite easy. # # Well, you can also take advantage of your `GeoDataFrame` structure to set the style of the data. For this, just create a column `style` containing each feature's style in a dictionnary. # In[3]: boros["style"] = [ {"fillColor": "#ff0000", "weight": 2, "color": "black"}, {"fillColor": "#00ff00", "weight": 2, "color": "black"}, {"fillColor": "#0000ff", "weight": 2, "color": "black"}, {"fillColor": "#ffff00", "weight": 2, "color": "black"}, {"fillColor": "#00ffff", "weight": 2, "color": "black"}, ] boros # In[4]: m = folium.Map([40.7, -74], zoom_start=10, tiles="cartodbpositron") folium.GeoJson(boros).add_to(m) m # Folium should work with any object that implements the `__geo_interface__` but be aware that sometimes you may need to convert your data to `epsg='4326'` before sending it to `folium`. # In[5]: import fiona import shapely fname = f"{url}/2014_08_05_farol.gpx" with fiona.open(fname, "r", layer="tracks") as records: tracks = [shapely.geometry.shape(record["geometry"]) for record in records] track = tracks[0] m = folium.Map(tiles="cartodbpositron") folium.GeoJson(track).add_to(m) m.fit_bounds(m.get_bounds()) m