Python: 如何通过在 python 代码中使用 JS Leaflet 来扩展 Folium 功能(例如测量距离)?

Python: How to extend Folium functionality (such as measuring distance) by using JS Leaflet inside python code?

我已经开始使用 Folium 在 GUI 中发布一些地图。用户可以输入开始和结束坐标,它们显示为 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 方法解决这些问题会非常好。

任何想法都会非常有义务...

您可以将任何 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,body 的选项为 html

您也可以访问您之前制作的folium objects Javascript中的名称:

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

既然你似乎已经对 folium 和 Leaflet 有所了解,我希望这足以帮助你!