#!/usr/bin/env python # coding: utf-8 # # Examples of plugins usage in folium # In this notebook we show a few illustrations of folium's plugin extensions. These are available after importing `folium.plugins`. # ## ScrollZoomToggler # Adds a button to enable/disable zoom scrolling. # In[1]: import folium from folium import plugins m = folium.Map([45, 3], zoom_start=4) plugins.ScrollZoomToggler().add_to(m) m # ## MarkerCluster # Adds a MarkerCluster layer on the map. # In[2]: import numpy as np N = 100 data = np.array( [ np.random.uniform(low=35, high=60, size=N), # Random latitudes in Europe. np.random.uniform(low=-12, high=30, size=N), # Random longitudes in Europe. ] ).T popups = [str(i) for i in range(N)] # Popups texts are simple numbers. m = folium.Map([45, 3], zoom_start=4) plugins.MarkerCluster(data, popups=popups).add_to(m) m # ## Terminator # In[3]: m = folium.Map([45, 3], zoom_start=1) plugins.Terminator().add_to(m) m # ## BoatMarker # In[4]: m = folium.Map([30, 0], zoom_start=3) plugins.BoatMarker( location=(34, -43), heading=45, wind_heading=150, wind_speed=45, color="#8f8" ).add_to(m) plugins.BoatMarker( location=(46, -30), heading=-20, wind_heading=46, wind_speed=25, color="#88f" ).add_to(m) m # ## BeautifyIcon # In[5]: m = folium.Map([45.5, -122], zoom_start=3) icon_plane = plugins.BeautifyIcon( icon="plane", border_color="#b3334f", text_color="#b3334f", icon_shape="triangle" ) icon_number = plugins.BeautifyIcon( border_color="#00ABDC", text_color="#00ABDC", number=10, inner_icon_style="margin-top:0;", ) folium.Marker(location=[46, -122], popup="Portland, OR", icon=icon_plane).add_to(m) folium.Marker(location=[50, -122], popup="Portland, OR", icon=icon_number).add_to(m) m # ## Fullscreen # In[6]: m = folium.Map(location=[41.9, -97.3], zoom_start=4) plugins.Fullscreen( position="topright", title="Expand me", title_cancel="Exit me", force_separate_button=True, ).add_to(m) m # ## Timestamped GeoJSON # In[7]: m = folium.Map(location=[35.68159659061569, 139.76451516151428], zoom_start=16) # Lon, Lat order. lines = [ { "coordinates": [ [139.76451516151428, 35.68159659061569], [139.75964426994324, 35.682590062684206], ], "dates": ["2017-06-02T00:00:00", "2017-06-02T00:10:00"], "color": "red", }, { "coordinates": [ [139.75964426994324, 35.682590062684206], [139.7575843334198, 35.679505030038506], ], "dates": ["2017-06-02T00:10:00", "2017-06-02T00:20:00"], "color": "blue", }, { "coordinates": [ [139.7575843334198, 35.679505030038506], [139.76337790489197, 35.678040905014065], ], "dates": ["2017-06-02T00:20:00", "2017-06-02T00:30:00"], "color": "green", "weight": 15, }, { "coordinates": [ [139.76337790489197, 35.678040905014065], [139.76451516151428, 35.68159659061569], ], "dates": ["2017-06-02T00:30:00", "2017-06-02T00:40:00"], "color": "#FFFFFF", }, ] features = [ { "type": "Feature", "geometry": { "type": "LineString", "coordinates": line["coordinates"], }, "properties": { "times": line["dates"], "style": { "color": line["color"], "weight": line["weight"] if "weight" in line else 5, }, }, } for line in lines ] plugins.TimestampedGeoJson( { "type": "FeatureCollection", "features": features, }, period="PT1M", add_last_point=True, ).add_to(m) m # In[8]: table = """\
Firstname Lastname Age
Jill Smith 50
Eve Jackson 94
""" points = [ { "time": "2017-06-02", "popup": "

address1

", "coordinates": [-2.548828, 51.467697], }, { "time": "2017-07-02", "popup": "

address2

", "coordinates": [-0.087891, 51.536086], }, { "time": "2017-08-02", "popup": "

address3

", "coordinates": [-6.240234, 53.383328], }, { "time": "2017-09-02", "popup": "

address4

", "coordinates": [-1.40625, 60.261617], }, {"time": "2017-10-02", "popup": table, "coordinates": [-1.516113, 53.800651]}, ] features = [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": point["coordinates"], }, "properties": { "time": point["time"], "popup": point["popup"], "id": "house", "icon": "marker", "iconstyle": { "iconUrl": "https://leafletjs.com/examples/geojson/baseball-marker.png", "iconSize": [20, 20], }, }, } for point in points ] features.append( { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [-2.548828, 51.467697], [-0.087891, 51.536086], [-6.240234, 53.383328], [-1.40625, 60.261617], [-1.516113, 53.800651], ], }, "properties": { "popup": "Current address", "times": [ "2017-06-02", "2017-07-02", "2017-08-02", "2017-09-02", "2017-10-02", ], "icon": "circle", "iconstyle": { "fillColor": "green", "fillOpacity": 0.6, "stroke": "false", "radius": 13, }, "style": {"weight": 0}, "id": "man", }, } ) m = folium.Map( location=[56.096555, -3.64746], tiles="cartodbpositron", zoom_start=5, ) plugins.TimestampedGeoJson( {"type": "FeatureCollection", "features": features}, period="P1M", add_last_point=True, auto_play=False, loop=False, max_speed=1, loop_button=True, date_options="YYYY/MM/DD", time_slider_drag_update=True, duration="P2M", ).add_to(m) m # ## FeatureGroupSubGroup # # ### Sub categories # # Disable all markers in the category, or just one of the subgroup. # In[9]: m = folium.Map(location=[0, 0], zoom_start=6) fg = folium.FeatureGroup(name="groups") m.add_child(fg) g1 = plugins.FeatureGroupSubGroup(fg, "group1") m.add_child(g1) g2 = plugins.FeatureGroupSubGroup(fg, "group2") m.add_child(g2) folium.Marker([-1, -1]).add_to(g1) folium.Marker([1, 1]).add_to(g1) folium.Marker([-1, 1]).add_to(g2) folium.Marker([1, -1]).add_to(g2) folium.LayerControl(collapsed=False).add_to(m) m # ### Marker clusters across groups # # Create two subgroups, but cluster markers together. # In[10]: m = folium.Map(location=[0, 0], zoom_start=6) mcg = folium.plugins.MarkerCluster(control=False) m.add_child(mcg) g1 = folium.plugins.FeatureGroupSubGroup(mcg, "group1") m.add_child(g1) g2 = folium.plugins.FeatureGroupSubGroup(mcg, "group2") m.add_child(g2) folium.Marker([-1, -1]).add_to(g1) folium.Marker([1, 1]).add_to(g1) folium.Marker([-1, 1]).add_to(g2) folium.Marker([1, -1]).add_to(g2) folium.LayerControl(collapsed=False).add_to(m) m # ## Minimap # # Adds a locator minimap to a folium document. # In[11]: m = folium.Map(location=(30, 20), zoom_start=4) minimap = plugins.MiniMap() m.add_child(minimap) m # ## DualMap # The DualMap plugin can be used to display two maps side by side, where panning and zooming is synchronized. # # The `DualMap` class can be used just like the normal `Map` class. The two sub-maps can be accessed with its `m1` and `m2` attributes. # In[12]: m = plugins.DualMap(location=(52.1, 5.1), tiles=None, zoom_start=8) folium.TileLayer("cartodbpositron").add_to(m.m2) folium.TileLayer("openstreetmap").add_to(m) fg_both = folium.FeatureGroup(name="markers_both").add_to(m) fg_1 = folium.FeatureGroup(name="markers_1").add_to(m.m1) fg_2 = folium.FeatureGroup(name="markers_2").add_to(m.m2) icon_red = folium.Icon(color="red") folium.Marker((52, 5), tooltip="both", icon=icon_red).add_to(fg_both) folium.Marker((52.4, 5), tooltip="left").add_to(fg_1) folium.Marker((52, 5.4), tooltip="right").add_to(fg_2) folium.LayerControl(collapsed=False).add_to(m) m # ## Locate control # # Adds a control button that when clicked, the user device geolocation is displayed. # For list of all possible keyword options see: # https://github.com/domoritz/leaflet-locatecontrol#possible-options # # To work properly in production, the connection needs to be encrypted (HTTPS), otherwise browser will not # allow users to share their location. # In[13]: m = folium.Map([41.97, 2.81]) plugins.LocateControl().add_to(m) # If you want get the user device position after load the map, set auto_start=True plugins.LocateControl(auto_start=True).add_to(m) m # ## SemiCircle # This can be used to display a semicircle or sector on a map. Whilst called SemiCircle it is not limited to 180 degree angles and can be used to display a sector of any angle. # The semicircle is defined with a location (the central point, if it was a full circle), a radius and will either have a direction and an arc **or** a start angle and a stop angle. # In[14]: m = folium.Map([45, 3], zoom_start=5) plugins.SemiCircle( (45, 3), radius=400000, start_angle=50, stop_angle=200, color="green", fill_color="green", opacity=0, popup="start angle - 50 degrees, stop angle - 200 degrees", ).add_to(m) plugins.SemiCircle( (46.5, 9.5), radius=200000, direction=360, arc=90, color="red", fill_color="red", opacity=0, popup="Direction - 0 degrees, arc 90 degrees", ).add_to(m) m # ## Geocoder # # Adds a search box to the map to search for geographic features like cities, countries, etc. You can search with names or addresses. # # Uses the Nomatim service from OpenStreetMap. Please respect their usage policy: https://operations.osmfoundation.org/policies/nominatim/ # In[15]: m = folium.Map() plugins.Geocoder().add_to(m) m