Можно ли получить координаты кликом по карте в folium?
Разбираюсь с библиотекой folium на python, получилось отобразить карту с метками по заданным координатам:
import folium
from flask import Flask
from folium.plugins import MarkerCluster
app = Flask(__name__)
@app.route('/')
def index():
map = folium.Map(location=[37.296933,-121.9574983], zoom_start = 8)
marker_cluster = MarkerCluster().add_to(map)
folium.Marker(location=[37.4074687,-122.086669], popup = "Text info", icon=folium.Icon(color = 'gray')).add_to(marker_cluster)
folium.Marker(location=[37.4074687,-121.086669], popup = "Text info", icon=folium.Icon(color = 'gray')).add_to(marker_cluster)
return map._repr_html_()
if __name__ == '__main__':
app.run()
Вопрос в следующем, можно ли получить координаты кликнув по карте? (как на скрине) Или мышкой перетащить уже существующий маркер.
Ответы (1 шт):
Автор решения: RayOtto
→ Ссылка
Мне помог вот этот ответ и особенно комментарий под ним https://gis.stackexchange.com/a/353035
У меня получилось вот так:
class LatLngPopup(MacroElement):
"""
When one clicks on a Map that contains a LatLngPopup,
a popup is shown that displays the latitude and longitude of the pointer.
"""
_template = Template(u"""
{% macro script(this, kwargs) %}
var {{this.get_name()}} = L.popup();
function latLngPop(e) {
{{this.get_name()}}
.setLatLng(e.latlng)
.setContent("Latitude: " + e.latlng.lat.toFixed(4) +
"<br>Longitude: " + e.latlng.lng.toFixed(4))
.openOn({{this._parent.get_name()}});
parent.document.getElementById("id_lng").value = e.latlng.lng.toFixed(4); # add this
parent.document.getElementById("id_lat").value = e.latlng.lat.toFixed(4); # add this
}
{{this._parent.get_name()}}.on('click', latLngPop);
{% endmacro %}
""") # noqa
def __init__(self):
super(LatLngPopup, self).__init__()
self._name = 'LatLngPopup'
LatLngPopup() - это маркер, который отображает координаты при нажатии на карту. Вот тут пример.
Этот класс я вынес в отдельный файл и добавил ему две строчки, которые начинаются с parent. У моих элементов id id_lng и id_lat.
Затем добавляю эту метку на карту:
folium_map.add_child(LatLngPopup())
