|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | +""" |
| 3 | +Heat map |
| 4 | +-------- |
| 5 | +
|
| 6 | +Create a HeatMap layer |
| 7 | +""" |
| 8 | +import json |
| 9 | +from jinja2 import Template |
| 10 | + |
| 11 | +from folium.element import JavascriptLink, Figure |
| 12 | +from folium.map import TileLayer |
| 13 | + |
| 14 | +class HeatMap(TileLayer): |
| 15 | + def __init__(self, data, name=None, |
| 16 | + min_opacity = .5, max_zoom=18, max_val=1., |
| 17 | + radius=25, blur=15, gradient=None, |
| 18 | + overlay = True): |
| 19 | + """Create a Heatmap layer |
| 20 | +
|
| 21 | + Parameters |
| 22 | + ---------- |
| 23 | + data : list of points of the form [lat, lng] or [lat, lng, weight] |
| 24 | + The points you want to plot. |
| 25 | + You can also provide a numpy.array of shape (n,2) or (n,3). |
| 26 | + name : str |
| 27 | + The name of the layer that will be created. |
| 28 | + min_opacity : default 1. |
| 29 | + The minimum opacity the heat will start at. |
| 30 | + max_zoom : default 18 |
| 31 | + Zoom level where the points reach maximum intensity (as intensity scales with zoom), |
| 32 | + equals maxZoom of the map by default |
| 33 | + max_val : float, default 1. |
| 34 | + Maximum point intensity |
| 35 | + radius : int, default 25 |
| 36 | + Radius of each "point" of the heatmap |
| 37 | + blur : int, default 15 |
| 38 | + Amount of blur |
| 39 | + gradient : dict, default None |
| 40 | + Color gradient config. e.g. {0.4: 'blue', 0.65: 'lime', 1: 'red'} |
| 41 | + """ |
| 42 | + super(TileLayer, self).__init__() |
| 43 | + self._name = 'HeatMap' |
| 44 | + self.tile_name = name if name is not None else self.get_name() |
| 45 | + |
| 46 | + self.data = [[x for x in line] for line in data] |
| 47 | + self.min_opacity = min_opacity |
| 48 | + self.max_zoom = max_zoom |
| 49 | + self.max_val = max_val |
| 50 | + self.radius = radius |
| 51 | + self.blur = blur |
| 52 | + self.gradient = json.dumps(gradient, sort_keys=True) if gradient is not None else "null" |
| 53 | + self.overlay = overlay |
| 54 | + |
| 55 | + self._template = Template(u""" |
| 56 | + {% macro script(this, kwargs) %} |
| 57 | + var {{this.get_name()}} = L.heatLayer( |
| 58 | + {{this.data}}, |
| 59 | + { |
| 60 | + minOpacity: {{this.min_opacity}}, |
| 61 | + maxZoom: {{this.max_zoom}}, |
| 62 | + max: {{this.max_val}}, |
| 63 | + radius: {{this.radius}}, |
| 64 | + blur: {{this.blur}}, |
| 65 | + gradient: {{this.gradient}} |
| 66 | + }) |
| 67 | + .addTo({{this._parent.get_name()}}); |
| 68 | + {% endmacro %} |
| 69 | + """) |
| 70 | + |
| 71 | + def render(self, **kwargs): |
| 72 | + super(TileLayer, self).render() |
| 73 | + |
| 74 | + figure = self.get_root() |
| 75 | + assert isinstance(figure,Figure), ("You cannot render this Element " |
| 76 | + "if it's not in a Figure.") |
| 77 | + |
| 78 | + figure.header.add_children(\ |
| 79 | + JavascriptLink("https://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"), |
| 80 | + name='leaflet-heat.js') |
0 commit comments