158 lines
4.8 KiB
Python
158 lines
4.8 KiB
Python
from branca.element import MacroElement
|
|
from jinja2 import Template
|
|
|
|
from folium.elements import JSCSSMixin
|
|
from folium.folium import Map
|
|
from folium.utilities import get_obj_in_upper_tree, parse_options
|
|
|
|
|
|
class StripePattern(JSCSSMixin, MacroElement):
|
|
"""Fill Pattern for polygon composed of alternating lines.
|
|
|
|
Add these to the 'fillPattern' field in GeoJson style functions.
|
|
|
|
Parameters
|
|
----------
|
|
angle: float, default 0.5
|
|
Angle of the line pattern (degrees). Should be between -360 and 360.
|
|
weight: float, default 4
|
|
Width of the main lines (pixels).
|
|
space_weight: float
|
|
Width of the alternate lines (pixels).
|
|
color: string with hexadecimal, RGB, or named color, default "#000000"
|
|
Color of the main lines.
|
|
space_color: string with hexadecimal, RGB, or named color, default "#ffffff"
|
|
Color of the alternate lines.
|
|
opacity: float, default 0.75
|
|
Opacity of the main lines. Should be between 0 and 1.
|
|
space_opacity: float, default 0.0
|
|
Opacity of the alternate lines. Should be between 0 and 1.
|
|
|
|
See https://github.com/teastman/Leaflet.pattern for more information.
|
|
"""
|
|
|
|
_template = Template(
|
|
"""
|
|
{% macro script(this, kwargs) %}
|
|
var {{ this.get_name() }} = new L.StripePattern(
|
|
{{ this.options|tojson }}
|
|
);
|
|
{{ this.get_name() }}.addTo({{ this.parent_map.get_name() }});
|
|
{% endmacro %}
|
|
"""
|
|
)
|
|
|
|
default_js = [
|
|
("pattern", "https://teastman.github.io/Leaflet.pattern/leaflet.pattern.js")
|
|
]
|
|
|
|
def __init__(
|
|
self,
|
|
angle=0.5,
|
|
weight=4,
|
|
space_weight=4,
|
|
color="#000000",
|
|
space_color="#ffffff",
|
|
opacity=0.75,
|
|
space_opacity=0.0,
|
|
**kwargs
|
|
):
|
|
super().__init__()
|
|
self._name = "StripePattern"
|
|
self.options = parse_options(
|
|
angle=angle,
|
|
weight=weight,
|
|
space_weight=space_weight,
|
|
color=color,
|
|
space_color=space_color,
|
|
opacity=opacity,
|
|
space_opacity=space_opacity,
|
|
**kwargs
|
|
)
|
|
self.parent_map = None
|
|
|
|
def render(self, **kwargs):
|
|
self.parent_map = get_obj_in_upper_tree(self, Map)
|
|
super().render(**kwargs)
|
|
|
|
|
|
class CirclePattern(JSCSSMixin, MacroElement):
|
|
"""Fill Pattern for polygon composed of repeating circles.
|
|
|
|
Add these to the 'fillPattern' field in GeoJson style functions.
|
|
|
|
Parameters
|
|
----------
|
|
width: int, default 20
|
|
Horizontal distance between circles (pixels).
|
|
height: int, default 20
|
|
Vertical distance between circles (pixels).
|
|
radius: int, default 12
|
|
Radius of each circle (pixels).
|
|
weight: float, default 2.0
|
|
Width of outline around each circle (pixels).
|
|
color: string with hexadecimal, RGB, or named color, default "#3388ff"
|
|
Color of the circle outline.
|
|
fill_color: string with hexadecimal, RGB, or named color, default "#3388ff"
|
|
Color of the circle interior.
|
|
opacity: float, default 0.75
|
|
Opacity of the circle outline. Should be between 0 and 1.
|
|
fill_opacity: float, default 0.5
|
|
Opacity of the circle interior. Should be between 0 and 1.
|
|
|
|
See https://github.com/teastman/Leaflet.pattern for more information.
|
|
"""
|
|
|
|
_template = Template(
|
|
"""
|
|
{% macro script(this, kwargs) %}
|
|
var {{ this.get_name() }}_shape = new L.PatternCircle(
|
|
{{ this.options_pattern_circle|tojson }}
|
|
);
|
|
var {{ this.get_name() }} = new L.Pattern(
|
|
{{ this.options_pattern|tojson }}
|
|
);
|
|
{{ this.get_name() }}.addShape({{ this.get_name() }}_shape);
|
|
{{ this.get_name() }}.addTo({{ this.parent_map }});
|
|
{% endmacro %}
|
|
"""
|
|
)
|
|
|
|
default_js = [
|
|
("pattern", "https://teastman.github.io/Leaflet.pattern/leaflet.pattern.js")
|
|
]
|
|
|
|
def __init__(
|
|
self,
|
|
width=20,
|
|
height=20,
|
|
radius=12,
|
|
weight=2.0,
|
|
color="#3388ff",
|
|
fill_color="#3388ff",
|
|
opacity=0.75,
|
|
fill_opacity=0.5,
|
|
):
|
|
super().__init__()
|
|
self._name = "CirclePattern"
|
|
self.options_pattern_circle = parse_options(
|
|
x=radius + 2 * weight,
|
|
y=radius + 2 * weight,
|
|
weight=weight,
|
|
radius=radius,
|
|
color=color,
|
|
fill_color=fill_color,
|
|
opacity=opacity,
|
|
fill_opacity=fill_opacity,
|
|
fill=True,
|
|
)
|
|
self.options_pattern = parse_options(
|
|
width=width,
|
|
height=height,
|
|
)
|
|
self.parent_map = None
|
|
|
|
def render(self, **kwargs):
|
|
self.parent_map = get_obj_in_upper_tree(self, Map).get_name()
|
|
super().render(**kwargs)
|