{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.6.0+4.gcecbc85.dirty\n" ] } ], "source": [ "import os\n", "import folium\n", "\n", "print(folium.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# How to draw a GeoPandas.GeoDataFrame into folium\n", "\n", "GeoPandas is a project to add support for geographic data to [pandas](http://pandas.pydata.org) objects.\n", "(See https://github.com/geopandas/geopandas)\n", "\n", "It provides (among other cool things) a `GeoDataFrame` object that represents a Feature collection.\n", "When you have one, you may be willing to use it on a folium map. Here's the simplest way to do so." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we'll use the same file as GeoPandas demo ; it's containing\n", "[the boroughs of New York City](http://www.nyc.gov/html/dcp/download/bytes/nybb_14aav.zip)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BoroCodeBoroNameShape_LengShape_Areageometry
05Staten Island330454.1759331.623847e+09(POLYGON ((970217.0223999023 145643.3322143555...
13Brooklyn741227.3370731.937810e+09(POLYGON ((1021176.479003906 151374.7969970703...
24Queens896875.3964493.045079e+09(POLYGON ((1029606.076599121 156073.8142089844...
31Manhattan358400.9128366.364308e+08(POLYGON ((981219.0557861328 188655.3157958984...
42Bronx464475.1456511.186822e+09(POLYGON ((1012821.805786133 229228.2645874023...
\n", "
" ], "text/plain": [ " BoroCode BoroName Shape_Leng Shape_Area \\\n", "0 5 Staten Island 330454.175933 1.623847e+09 \n", "1 3 Brooklyn 741227.337073 1.937810e+09 \n", "2 4 Queens 896875.396449 3.045079e+09 \n", "3 1 Manhattan 358400.912836 6.364308e+08 \n", "4 2 Bronx 464475.145651 1.186822e+09 \n", "\n", " geometry \n", "0 (POLYGON ((970217.0223999023 145643.3322143555... \n", "1 (POLYGON ((1021176.479003906 151374.7969970703... \n", "2 (POLYGON ((1029606.076599121 156073.8142089844... \n", "3 (POLYGON ((981219.0557861328 188655.3157958984... \n", "4 (POLYGON ((1012821.805786133 229228.2645874023... " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import geopandas\n", "\n", "nybb = os.path.join('data', 'nybb.shp')\n", "\n", "boros = geopandas.read_file(nybb)\n", "\n", "boros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To create a map with these features, simply put them in a `GeoJson`:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = folium.Map([40.7, -74], zoom_start=10, tiles='cartodbpositron')\n", "\n", "folium.GeoJson(boros).add_to(m)\n", "\n", "m.save(os.path.join('results', 'geopandas_0.html'))\n", "\n", "m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quite easy.\n", "\n", "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." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BoroCodeBoroNameShape_LengShape_Areageometrystyle
05Staten Island330454.1759331.623847e+09(POLYGON ((970217.0223999023 145643.3322143555...{'fillColor': '#ff0000', 'weight': 2, 'color':...
13Brooklyn741227.3370731.937810e+09(POLYGON ((1021176.479003906 151374.7969970703...{'fillColor': '#00ff00', 'weight': 2, 'color':...
24Queens896875.3964493.045079e+09(POLYGON ((1029606.076599121 156073.8142089844...{'fillColor': '#0000ff', 'weight': 2, 'color':...
31Manhattan358400.9128366.364308e+08(POLYGON ((981219.0557861328 188655.3157958984...{'fillColor': '#ffff00', 'weight': 2, 'color':...
42Bronx464475.1456511.186822e+09(POLYGON ((1012821.805786133 229228.2645874023...{'fillColor': '#00ffff', 'weight': 2, 'color':...
\n", "
" ], "text/plain": [ " BoroCode BoroName Shape_Leng Shape_Area \\\n", "0 5 Staten Island 330454.175933 1.623847e+09 \n", "1 3 Brooklyn 741227.337073 1.937810e+09 \n", "2 4 Queens 896875.396449 3.045079e+09 \n", "3 1 Manhattan 358400.912836 6.364308e+08 \n", "4 2 Bronx 464475.145651 1.186822e+09 \n", "\n", " geometry \\\n", "0 (POLYGON ((970217.0223999023 145643.3322143555... \n", "1 (POLYGON ((1021176.479003906 151374.7969970703... \n", "2 (POLYGON ((1029606.076599121 156073.8142089844... \n", "3 (POLYGON ((981219.0557861328 188655.3157958984... \n", "4 (POLYGON ((1012821.805786133 229228.2645874023... \n", "\n", " style \n", "0 {'fillColor': '#ff0000', 'weight': 2, 'color':... \n", "1 {'fillColor': '#00ff00', 'weight': 2, 'color':... \n", "2 {'fillColor': '#0000ff', 'weight': 2, 'color':... \n", "3 {'fillColor': '#ffff00', 'weight': 2, 'color':... \n", "4 {'fillColor': '#00ffff', 'weight': 2, 'color':... " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "boros['style'] = [\n", " {'fillColor': '#ff0000', 'weight': 2, 'color': 'black'},\n", " {'fillColor': '#00ff00', 'weight': 2, 'color': 'black'},\n", " {'fillColor': '#0000ff', 'weight': 2, 'color': 'black'},\n", " {'fillColor': '#ffff00', 'weight': 2, 'color': 'black'},\n", " {'fillColor': '#00ffff', 'weight': 2, 'color': 'black'},\n", "]\n", "\n", "boros" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = folium.Map([40.7, -74], zoom_start=10, tiles='cartodbpositron')\n", "\n", "folium.GeoJson(boros).add_to(m)\n", "\n", "m.save(os.path.join('results', 'geopandas_1.html'))\n", "\n", "m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import fiona\n", "import shapely\n", "\n", "\n", "fname = os.path.join('data', '2014_08_05_farol.gpx')\n", "\n", "with fiona.open(fname, 'r', layer='tracks') as records:\n", " tracks = [\n", " shapely.geometry.shape(record['geometry']) for record in records\n", " ]\n", "\n", "track = tracks[0]\n", "\n", "m = folium.Map(tiles='cartodbpositron')\n", "folium.GeoJson(track).add_to(m)\n", "\n", "m.fit_bounds(m.get_bounds())\n", "\n", "m.save(os.path.join('results', 'geopandas_2.html'))\n", "\n", "m" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 1 }