95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
from jinja2 import Template
|
|
|
|
from folium.elements import JSCSSMixin
|
|
from folium.map import Marker
|
|
from folium.utilities import parse_options
|
|
from folium.vector_layers import path_options
|
|
|
|
|
|
class SemiCircle(JSCSSMixin, Marker):
|
|
"""Add a marker in the shape of a semicircle, similar to the Circle class.
|
|
|
|
Use (direction and arc) or (start_angle and stop_angle), not both.
|
|
|
|
Parameters
|
|
----------
|
|
location: tuple[float, float]
|
|
Latitude and Longitude pair (Northing, Easting)
|
|
radius: float
|
|
Radius of the circle, in meters.
|
|
direction: int, default None
|
|
Direction angle in degrees
|
|
arc: int, default None
|
|
Arc angle in degrees.
|
|
start_angle: int, default None
|
|
Start angle in degrees
|
|
stop_angle: int, default None
|
|
Stop angle in degrees.
|
|
popup: str or folium.Popup, optional
|
|
Input text or visualization for object displayed when clicking.
|
|
tooltip: str or folium.Tooltip, optional
|
|
Display a text when hovering over the object.
|
|
**kwargs
|
|
For additional arguments see :func:`folium.vector_layers.path_options`
|
|
|
|
Uses Leaflet plugin https://github.com/jieter/Leaflet-semicircle
|
|
|
|
"""
|
|
|
|
_template = Template(
|
|
"""
|
|
{% macro script(this, kwargs) %}
|
|
var {{ this.get_name() }} = L.semiCircle(
|
|
{{ this.location|tojson }},
|
|
{{ this.options|tojson }}
|
|
)
|
|
{%- if this.direction %}
|
|
.setDirection({{ this.direction[0] }}, {{ this.direction[1] }})
|
|
{%- endif %}
|
|
.addTo({{ this._parent.get_name() }});
|
|
{% endmacro %}
|
|
"""
|
|
)
|
|
|
|
default_js = [
|
|
(
|
|
"semicirclejs",
|
|
"https://cdn.jsdelivr.net/npm/leaflet-semicircle@2.0.4/Semicircle.min.js",
|
|
)
|
|
]
|
|
|
|
def __init__(
|
|
self,
|
|
location,
|
|
radius,
|
|
direction=None,
|
|
arc=None,
|
|
start_angle=None,
|
|
stop_angle=None,
|
|
popup=None,
|
|
tooltip=None,
|
|
**kwargs
|
|
):
|
|
super().__init__(location, popup=popup, tooltip=tooltip)
|
|
self._name = "SemiCircle"
|
|
self.direction = (
|
|
(direction, arc) if direction is not None and arc is not None else None
|
|
)
|
|
self.options = path_options(line=False, radius=radius, **kwargs)
|
|
self.options.update(
|
|
parse_options(
|
|
start_angle=start_angle,
|
|
stop_angle=stop_angle,
|
|
)
|
|
)
|
|
|
|
if not (
|
|
(direction is None and arc is None)
|
|
and (start_angle is not None and stop_angle is not None)
|
|
or (direction is not None and arc is not None)
|
|
and (start_angle is None and stop_angle is None)
|
|
):
|
|
raise ValueError(
|
|
"Invalid arguments. Either provide direction and arc OR start_angle and stop_angle"
|
|
)
|