|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | + |
| 3 | +from branca.element import CssLink, Figure, JavascriptLink |
| 4 | + |
| 5 | +from folium.map import Layer |
| 6 | + |
| 7 | +from jinja2 import Template |
| 8 | + |
| 9 | + |
| 10 | +class SideBySideLayers(Layer): |
| 11 | + """ |
| 12 | + Creates a SideBySideLayers that takes two Layers and adds a sliding |
| 13 | + control with the leaflet-side-by-side plugin. |
| 14 | + Parameters |
| 15 | + ---------- |
| 16 | + layer_left: Layer. |
| 17 | + The left Layer within the side by side control. |
| 18 | + Must be created and added to the map before being passed to this class. |
| 19 | + layer_right: Layer. |
| 20 | + The left Layer within the side by side control. |
| 21 | + Must be created and added to the map before being passed to this class. |
| 22 | + name : string, default None |
| 23 | + The name of the Layer, as it will appear in LayerControls. |
| 24 | + overlay : bool, default True |
| 25 | + Adds the layer as an optional overlay (True) or the base layer (False). |
| 26 | + control : bool, default True |
| 27 | + Whether the Layer will be included in LayerControls. |
| 28 | + show: bool, default True |
| 29 | + Whether the layer will be shown on opening (only for overlays). |
| 30 | + Examples |
| 31 | + -------- |
| 32 | + >>> layer_left = WmsTileLayer( |
| 33 | + ... 'http://this.wms.server/ncWMS/wms', |
| 34 | + ... name='Test WMS Data', |
| 35 | + ... styles='', |
| 36 | + ... fmt='image/png', |
| 37 | + ... transparent=True, |
| 38 | + ... layers='test_data', |
| 39 | + ... COLORSCALERANGE='0,10', |
| 40 | + ...) |
| 41 | + >>> layer_left.add_to(m) |
| 42 | + >>> layer_right = WmsTileLayer( |
| 43 | + ... 'http://this.wms.server/ncWMS/wms', |
| 44 | + ... name='Test WMS Data', |
| 45 | + ... styles='', |
| 46 | + ... fmt='image/png', |
| 47 | + ... transparent=True, |
| 48 | + ... layers='test_data_2', |
| 49 | + ... COLORSCALERANGE='0,5', |
| 50 | + ...) |
| 51 | + >>> layer_right.add_to(m) |
| 52 | + >>> # Add layers to sidebyside control. |
| 53 | + >>> sidebyside = SideBySideLayers(layer_left, layer_right) |
| 54 | + >>> sidebyside.add_to(m) |
| 55 | + See https://github.com/digidem/leaflet-side-by-side for more information. |
| 56 | + """ |
| 57 | + |
| 58 | + _template = Template(u""" |
| 59 | + {% macro script(this, kwargs) %} |
| 60 | + var {{ this.get_name() }} = L.control.sideBySide( |
| 61 | + {{ this.layer_left.get_name() }}, {{ this.layer_right.get_name() }} |
| 62 | + ).addTo({{ this._parent.get_name() }}); |
| 63 | + {% endmacro %} |
| 64 | + """) |
| 65 | + |
| 66 | + def __init__(self, layer_left, layer_right, name=None, overlay=True, control=True, show=True): |
| 67 | + super(SideBySideLayers, self).__init__(name=name, |
| 68 | + overlay=overlay, |
| 69 | + control=control, |
| 70 | + show=show) |
| 71 | + self._name = 'SideBySideLayers' |
| 72 | + self.layer_left = layer_left |
| 73 | + self.layer_right = layer_right |
| 74 | + |
| 75 | + def render(self, **kwargs): |
| 76 | + super(SideBySideLayers, self).render() |
| 77 | + |
| 78 | + figure = self.get_root() |
| 79 | + assert isinstance(figure, Figure), ('You cannot render this Element ' |
| 80 | + 'if it is not in a Figure.') |
| 81 | + |
| 82 | + figure.header.add_child( |
| 83 | + JavascriptLink('http://lab.digital-democracy.org/leaflet-side-by-side/leaflet-side-by-side.js'), # noqa |
| 84 | + name='leaflet.sidebyside') |
0 commit comments