Python: Как расширить функциональность Folium (например, измерение расстояния) с помощью JS Leaflet внутри кода Python? - PullRequest
0 голосов
/ 09 ноября 2019

Я начал использовать Folium для публикации некоторых карт в графическом интерфейсе. Пользователь может ввести начальную и конечную координаты, и они отображаются как Folium Markers. Я знаю, что библиотека Folium - это просто оболочка для Leaflet, поэтому можем ли мы использовать родительскую библиотеку для методов, которых нет в Folium?

Например, я хочу использовать метод Leaflet.LatLng.distanceTo для вычисления расстояния междуначальные и конечные координаты, используя реализованный сферический закон косинусов. Как я мог использовать их в моих .py файлах?

Я Прикрепил этот пример кода, чтобы показать, где я застрял:

       .
       ..
       ...
       self.map = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
       ..
       ..
        self.m = folium.Map(
            location=[32.5236, 54], tiles="Stamen terrain", zoom_start=5, control_scale= True,
            box_zoom= True)

        # adds the markers
        self.marker1 =  folium.Marker((lat_1, lng_1)).add_to(self.m)
        self.marker2 =  folium.Marker((lat_2, lng_2)).add_to(self.m)

        #add above to the map
        self.data = io.BytesIO()
        self.m.save(self.data, close_file=False)
        self.map.setHtml(self.data.getvalue().decode())
        self.m.add_child(folium.LatLngPopup())

        """ 
        Enter the JavaScript Leaflet
        {
         Here I want "Leaflet.distanceTo((lat_1, lng_1), (lat_2, lng_2))" method
         }
        """

Одним из других недостатков Foilum является невозможностьудалить элементы карты, такие как стартовый маркер, который пользователь хочет отредактировать (эта часть не имеет значения, я говорю это только для того, чтобы вы лучше ознакомились с ситуацией). Было бы действительно хорошо решить их, используя соответствующие методы Leaflet.

Любая идея была бы очень обязательна ...

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете добавить любой html, css или Javascript на карту. Вот пример того, как создать пользовательский элемент folium и затем перезаписать его шаблон.

el = folium.MacroElement().add_to(m)
el._template = jinja2.Template("""
    {% macro script(this, kwargs) %}
    // write JS here
    {% endmacro %}
""")

Макрос script - это пользовательский макрос Jinja2, который обеспечивает размещение кода внутри в тегах сценария нанижняя часть страницы. Другие варианты: header для головы и html для тела.

Вы также можете получить доступ к имени в Javascript объектов фолиума, которые вы сделали ранее:

popup = folium.LatLngPopup()
popup_js_name = popup.get_name()

Так как кажетсяВы уже немного знакомы с фолием и листовкой. Надеюсь, этого достаточно, чтобы помочь!

...