148 lines
4.7 KiB
Python
148 lines
4.7 KiB
Python
from branca.element import MacroElement
|
|
|
|
from folium.elements import JSCSSMixin
|
|
from folium.raster_layers import WmsTileLayer
|
|
from folium.template import Template
|
|
from folium.utilities import remove_empty
|
|
|
|
|
|
class TimestampedWmsTileLayers(JSCSSMixin, MacroElement):
|
|
"""
|
|
Creates a TimestampedWmsTileLayer that takes a WmsTileLayer and adds time
|
|
control with the Leaflet.TimeDimension plugin.
|
|
|
|
Parameters
|
|
----------
|
|
data: WmsTileLayer.
|
|
The WmsTileLayer that you want to add time support to.
|
|
Must be created like a typical WmsTileLayer and added to the map
|
|
before being passed to this class.
|
|
|
|
transition_time: int, default 200.
|
|
The duration in ms of a transition from between timestamps.
|
|
loop: bool, default False
|
|
Whether the animation shall loop, default is to reduce load on WMS
|
|
services.
|
|
auto_play: bool, default False
|
|
Whether the animation shall start automatically at startup, default
|
|
is to reduce load on WMS services.
|
|
period: str, default 'P1D'
|
|
Used to construct the array of available times starting
|
|
from the first available time. Format: ISO8601 Duration
|
|
ex: 'P1M' -> 1/month, 'P1D' -> 1/day, 'PT1H' -> 1/hour, and 'PT1M' -> 1/minute
|
|
Note: this seems to be overridden by the WMS Tile Layer GetCapabilities.
|
|
|
|
Examples
|
|
--------
|
|
>>> w0 = WmsTileLayer(
|
|
... "http://this.wms.server/ncWMS/wms",
|
|
... name="Test WMS Data",
|
|
... styles="",
|
|
... fmt="image/png",
|
|
... transparent=True,
|
|
... layers="test_data",
|
|
... COLORSCALERANGE="0,10",
|
|
... )
|
|
>>> w0.add_to(m)
|
|
>>> w1 = WmsTileLayer(
|
|
... "http://this.wms.server/ncWMS/wms",
|
|
... name="Test WMS Data",
|
|
... styles="",
|
|
... fmt="image/png",
|
|
... transparent=True,
|
|
... layers="test_data_2",
|
|
... COLORSCALERANGE="0,5",
|
|
... )
|
|
>>> w1.add_to(m)
|
|
>>> # Add WmsTileLayers to time control.
|
|
>>> time = TimestampedWmsTileLayers([w0, w1])
|
|
>>> time.add_to(m)
|
|
|
|
See https://github.com/socib/Leaflet.TimeDimension for more information.
|
|
|
|
"""
|
|
|
|
_template = Template(
|
|
"""
|
|
{% macro script(this, kwargs) %}
|
|
{{ this._parent.get_name() }}.timeDimension = L.timeDimension(
|
|
{{ this.options|tojavascript }}
|
|
);
|
|
{{ this._parent.get_name() }}.timeDimensionControl =
|
|
L.control.timeDimension(
|
|
{{ this.options_control|tojavascript }}
|
|
);
|
|
{{ this._parent.get_name() }}.addControl(
|
|
{{ this._parent.get_name() }}.timeDimensionControl
|
|
);
|
|
|
|
{% for layer in this.layers %}
|
|
var {{ layer.get_name() }} = L.timeDimension.layer.wms(
|
|
{{ layer.get_name() }},
|
|
{
|
|
updateTimeDimension: false,
|
|
wmsVersion: {{ layer.options['version']|tojson }},
|
|
}
|
|
).addTo({{ this._parent.get_name() }});
|
|
{% endfor %}
|
|
{% endmacro %}
|
|
"""
|
|
)
|
|
|
|
default_js = [
|
|
(
|
|
"jquery3.7.1",
|
|
"https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",
|
|
),
|
|
(
|
|
"jqueryui1.10.2",
|
|
"https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js",
|
|
),
|
|
(
|
|
"iso8601",
|
|
"https://cdn.jsdelivr.net/npm/iso8601-js-period@0.2.1/iso8601.min.js",
|
|
),
|
|
(
|
|
"leaflet.timedimension",
|
|
"https://cdn.jsdelivr.net/npm/leaflet-timedimension@1.1.1/dist/leaflet.timedimension.min.js",
|
|
),
|
|
]
|
|
default_css = [
|
|
(
|
|
"highlight.js_css",
|
|
"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/styles/default.min.css",
|
|
),
|
|
(
|
|
"leaflet.timedimension_css",
|
|
"https://cdn.jsdelivr.net/npm/leaflet-timedimension@1.1.1/dist/leaflet.timedimension.control.css",
|
|
),
|
|
]
|
|
|
|
def __init__(
|
|
self,
|
|
data,
|
|
transition_time=200,
|
|
loop=False,
|
|
auto_play=False,
|
|
period="P1D",
|
|
time_interval=False,
|
|
):
|
|
super().__init__()
|
|
self._name = "TimestampedWmsTileLayers"
|
|
self.options = remove_empty(
|
|
period=period,
|
|
time_interval=time_interval,
|
|
)
|
|
self.options_control = dict(
|
|
position="bottomleft",
|
|
auto_play=auto_play,
|
|
player_options={
|
|
"transitionTime": int(transition_time),
|
|
"loop": loop,
|
|
},
|
|
)
|
|
if isinstance(data, WmsTileLayer):
|
|
self.layers = [data]
|
|
else:
|
|
self.layers = data # Assume iterable
|