94 lines
3.3 KiB
Python
94 lines
3.3 KiB
Python
from typing import Optional
|
|
|
|
from branca.element import MacroElement
|
|
from jinja2 import Template
|
|
|
|
from folium.elements import JSCSSMixin
|
|
from folium.utilities import parse_options
|
|
|
|
|
|
class Geocoder(JSCSSMixin, MacroElement):
|
|
"""A simple geocoder for Leaflet that by default uses OSM/Nominatim.
|
|
|
|
Please respect the Nominatim usage policy:
|
|
https://operations.osmfoundation.org/policies/nominatim/
|
|
|
|
Parameters
|
|
----------
|
|
collapsed: bool, default False
|
|
If True, collapses the search box unless hovered/clicked.
|
|
position: str, default 'topright'
|
|
Choose from 'topleft', 'topright', 'bottomleft' or 'bottomright'.
|
|
add_marker: bool, default True
|
|
If True, adds a marker on the found location.
|
|
zoom: int, default 11, optional
|
|
Set zoom level used for displaying the geocode result, note that this only has an effect when add_marker is set to False. Set this to None to preserve the current map zoom level.
|
|
provider: str, default 'nominatim'
|
|
Defaults to "nominatim", see https://github.com/perliedman/leaflet-control-geocoder/tree/2.4.0/src/geocoders for other built-in providers.
|
|
provider_options: dict, default {}
|
|
For use with specific providers that may require api keys or other parameters.
|
|
|
|
For all options see https://github.com/perliedman/leaflet-control-geocoder
|
|
|
|
"""
|
|
|
|
_template = Template(
|
|
"""
|
|
{% macro script(this, kwargs) %}
|
|
|
|
var geocoderOpts_{{ this.get_name() }} = {{ this.options|tojson }};
|
|
|
|
// note: geocoder name should start with lowercase
|
|
var geocoderName_{{ this.get_name() }} = geocoderOpts_{{ this.get_name() }}["provider"];
|
|
|
|
var customGeocoder_{{ this.get_name() }} = L.Control.Geocoder[ geocoderName_{{ this.get_name() }} ](
|
|
geocoderOpts_{{ this.get_name() }}['providerOptions']
|
|
);
|
|
geocoderOpts_{{ this.get_name() }}["geocoder"] = customGeocoder_{{ this.get_name() }};
|
|
|
|
L.Control.geocoder(
|
|
geocoderOpts_{{ this.get_name() }}
|
|
).on('markgeocode', function(e) {
|
|
var zoom = geocoderOpts_{{ this.get_name() }}['zoom'] || {{ this._parent.get_name() }}.getZoom();
|
|
{{ this._parent.get_name() }}.setView(e.geocode.center, zoom);
|
|
}).addTo({{ this._parent.get_name() }});
|
|
|
|
{% endmacro %}
|
|
"""
|
|
)
|
|
|
|
default_js = [
|
|
(
|
|
"Control.Geocoder.js",
|
|
"https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js",
|
|
)
|
|
]
|
|
default_css = [
|
|
(
|
|
"Control.Geocoder.css",
|
|
"https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css",
|
|
)
|
|
]
|
|
|
|
def __init__(
|
|
self,
|
|
collapsed: bool = False,
|
|
position: str = "topright",
|
|
add_marker: bool = True,
|
|
zoom: Optional[int] = 11,
|
|
provider: str = "nominatim",
|
|
provider_options: dict = {},
|
|
**kwargs
|
|
):
|
|
super().__init__()
|
|
self._name = "Geocoder"
|
|
self.options = parse_options(
|
|
collapsed=collapsed,
|
|
position=position,
|
|
default_mark_geocode=add_marker,
|
|
zoom=zoom,
|
|
provider=provider,
|
|
provider_options=provider_options,
|
|
**kwargs
|
|
)
|