How to draw a GeoPandas.GeoDataFrame into folium

GeoPandas is a project to add support for geographic data to pandas 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 [1]:
%matplotlib inline
import geopandas

import sys
sys.path.insert(0,'..')

import folium
folium.__file__


Out[1]:
'../folium/__init__.py'

In this example, we'll use the same file as GeoPandas demo ; it's containing the boroughs of New York City.


In [2]:
boros = geopandas.GeoDataFrame.from_file('nybb.shp')
boros


Out[2]:
BoroCode BoroName Shape_Area Shape_Leng geometry
0 5 Staten Island 1.623847e+09 330454.175933 (POLYGON ((970217.0223999023 145643.3322143555...
1 3 Brooklyn 1.937810e+09 741227.337073 (POLYGON ((1021176.479003906 151374.7969970703...
2 4 Queens 3.045079e+09 896875.396449 (POLYGON ((1029606.076599121 156073.8142089844...
3 1 Manhattan 6.364308e+08 358400.912836 (POLYGON ((981219.0557861328 188655.3157958984...
4 2 Bronx 1.186822e+09 464475.145651 (POLYGON ((1012821.805786133 229228.2645874023...

To create a map with these features, simply put them in a GeoJson:


In [3]:
m = folium.Map([40.7,-74], zoom_start=10, tiles='cartodbpositron')

folium.GeoJson(boros).add_to(m)

m


Out[3]:

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 [4]:
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'},
    ]

In [5]:
boros


Out[5]:
BoroCode BoroName Shape_Area Shape_Leng geometry style
0 5 Staten Island 1.623847e+09 330454.175933 (POLYGON ((970217.0223999023 145643.3322143555... {'weight': 2, 'color': 'black', 'fillColor': '...
1 3 Brooklyn 1.937810e+09 741227.337073 (POLYGON ((1021176.479003906 151374.7969970703... {'weight': 2, 'color': 'black', 'fillColor': '...
2 4 Queens 3.045079e+09 896875.396449 (POLYGON ((1029606.076599121 156073.8142089844... {'weight': 2, 'color': 'black', 'fillColor': '...
3 1 Manhattan 6.364308e+08 358400.912836 (POLYGON ((981219.0557861328 188655.3157958984... {'weight': 2, 'color': 'black', 'fillColor': '...
4 2 Bronx 1.186822e+09 464475.145651 (POLYGON ((1012821.805786133 229228.2645874023... {'weight': 2, 'color': 'black', 'fillColor': '...

In [6]:
m = folium.Map([40.7,-74], zoom_start=10, tiles='cartodbpositron')

folium.GeoJson(boros).add_to(m)

m


Out[6]:

Conclusion

That's all folks !

Hope it'll be useful to you. Don't hesitate to provide a feedback on what can be improved, which method do you prefer, etc.