Можно ли получить координаты кликом по карте в 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()) 
→ Ссылка