Files
Buffteks-Website/streamlit-venv/lib/python3.10/site-packages/folium/plugins/timestamped_wmstilelayer.py
2025-01-10 21:40:35 +00:00

157 lines
5.1 KiB
Python

from jinja2 import Template
from folium.elements import JSCSSMixin
from folium.map import Layer
from folium.raster_layers import WmsTileLayer
from folium.utilities import parse_options
class TimestampedWmsTileLayers(JSCSSMixin, Layer):
"""
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.
name : string, default None
The name of the Layer, as it will appear in LayerControls.
overlay : bool, default True
Adds the layer as an optional overlay (True) or the base layer (False).
control : bool, default True
Whether the Layer will be included in LayerControls.
show: bool, default True
Whether the layer will be shown on opening (only for overlays).
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|tojson }}
);
{{ this._parent.get_name() }}.timeDimensionControl =
L.control.timeDimension(
{{ this.options_control|tojson }}
);
{{ 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 = [
(
"jquery2.0.0",
"https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/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,
name=None,
):
super().__init__(name=name, overlay=True, control=False, show=True)
self._name = "TimestampedWmsTileLayers"
self.options = parse_options(
period=period,
time_interval=time_interval,
)
self.options_control = parse_options(
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