Files
2024-09-29 01:46:07 -04:00

122 lines
3.6 KiB
Python

from abc import ABC, abstractmethod
from jinja2 import Template
from folium.elements import JSCSSMixin
from folium.features import MacroElement
from folium.vector_layers import path_options
class _BaseFromEncoded(JSCSSMixin, MacroElement, ABC):
"""Base Interface to create folium objects from encoded strings.
Derived classes must define `_encoding_type` property which returns the string
representation of the folium object to create from the encoded string.
Parameters
----------
encoded: str
The raw encoded string from the Polyline Encoding Algorithm. See:
https://developers.google.com/maps/documentation/utilities/polylinealgorithm
**kwargs:
Object options as accepted by leaflet.
"""
_template = Template(
"""
{% macro script(this, kwargs) %}
var {{ this.get_name() }} = L.{{ this._encoding_type }}.fromEncoded(
{{ this.encoded|tojson }},
{{ this.options|tojson }}
).addTo({{ this._parent.get_name() }});
{% endmacro %}
"""
)
default_js = [
(
"polyline-encoded",
"https://cdn.jsdelivr.net/npm/polyline-encoded@0.0.9/Polyline.encoded.js",
)
]
def __init__(self, encoded: str):
super().__init__()
self.encoded = encoded
@property
@abstractmethod
def _encoding_type(self) -> str:
"""An abstract getter to return the type of folium object to create."""
raise NotImplementedError
class PolyLineFromEncoded(_BaseFromEncoded):
"""Create PolyLines directly from the encoded string.
Parameters
----------
encoded: str
The raw encoded string from the Polyline Encoding Algorithm. See:
https://developers.google.com/maps/documentation/utilities/polylinealgorithm
**kwargs:
Polyline options as accepted by leaflet. See:
https://leafletjs.com/reference.html#polyline
Adapted from https://github.com/jieter/Leaflet.encoded
Examples
--------
>>> from folium import Map
>>> from folium.plugins import PolyLineFromEncoded
>>> m = Map()
>>> encoded = r"_p~iF~cn~U_ulLn{vA_mqNvxq`@"
>>> PolyLineFromEncoded(encoded=encoded, color="green").add_to(m)
"""
def __init__(self, encoded: str, **kwargs):
self._name = "PolyLineFromEncoded"
super().__init__(encoded=encoded)
self.options = path_options(line=True, **kwargs)
@property
def _encoding_type(self) -> str:
"""Return the name of folium object created from the encoded."""
return "Polyline"
class PolygonFromEncoded(_BaseFromEncoded):
"""Create Polygons directly from the encoded string.
Parameters
----------
encoded: str
The raw encoded string from the Polyline Encoding Algorithm. See:
https://developers.google.com/maps/documentation/utilities/polylinealgorithm
**kwargs:
Polygon options as accepted by leaflet. See:
https://leafletjs.com/reference.html#polygon
Adapted from https://github.com/jieter/Leaflet.encoded
Examples
--------
>>> from folium import Map
>>> from folium.plugins import PolygonFromEncoded
>>> m = Map()
>>> encoded = r"w`j~FpxivO}jz@qnnCd}~Bsa{@~f`C`lkH"
>>> PolygonFromEncoded(encoded=encoded).add_to(m)
"""
def __init__(self, encoded: str, **kwargs):
self._name = "PolygonFromEncoded"
super().__init__(encoded)
self.options = path_options(line=True, radius=None, **kwargs)
@property
def _encoding_type(self) -> str:
"""Return the name of folium object created from the encoded."""
return "Polygon"