Folium 0.11.0:保持标记层在前面

Folium 0.11.0 : Keep markers layer in front

我想让标记层始终保持在前面,但我不知道该怎么做。

只要我开始在“图层控制”窗格中单击和取消单击图层,标记图层就会消失在 choropleth 图层后面。

这是我的代码:

m = folium.Map([40.4165001, -3.7025599], zoom_start=10, tiles='CartoDB Positron', overlay=True)
# folium.TileLayer('cartodbpositron', overlay=True).add_to(m)


income=folium.Choropleth(
    geo_data=censo,
    data=df1,
    name='Household Income 2016',
    columns=['CDSSCC', 'HouseholdIncome2016'],
    key_on='feature.properties.CDSSCC',
    fill_color='BuGn',
    fill_opacity=1,
    line_opacity=0.2,
    highlight=True,
    legend=False,
).add_to(m)

pop=folium.Choropleth(
    geo_data=censo,
    data=df1,
    name='Population 2016',
    columns=['CDSSCC', 'POB_TOTAL'],
    key_on='feature.properties.CDSSCC',
    fill_color='YlOrBr',
    fill_opacity=1,
    line_opacity=0.2,
    highlight=True,
    legend=False,
).add_to(m)

# add clusters to the map
markers_colors = []
for lat, lon, poi, cluster in zip(buildingsmadrid_merged['Latitude'], buildingsmadrid_merged['Longitude'], buildingsmadrid_merged['Name'], buildingsmadrid_merged['Cluster Labels']):
    label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)
    puntos=folium.CircleMarker(
        [lat, lon],
        radius=5,
        popup=label,
        tooltip = label,
        color='YlOrBr'[cluster-1],
        fill=True,
        fill_color='YlOrBr'[cluster-1],
        fill_opacity=0.7,
        overlay=False).add_to(m)

folium.LayerControl(position='topright', collapsed=False, autoZIndex=True).add_to(m)

# m.save(os.path.join('choropleth.html'))

m

感谢您的帮助

Folium 有解决方法m.keep_in_front

如果您保存 CircleMarker 个对象的列表 markers,您可以使用 m.keep_in_front(*markers)
请注意,项目的顺序将设置它们的优先级,最后是最重要的,但我怀疑这对你的情况很重要。


此解决方案目前仅在叠加层之间切换时有效。
如果在基础层之间切换,这将不起作用。

我 运行 在尝试在 choropleths 之间切换时显示工具提示时遇到了类似的问题。

我的设置与具有 overlay=False 的等值线层有点不同,因为我更喜欢使用单选按钮切换,而且我只有一个层保留在前面。

我已经使用这两个资源解决了这个问题:
A similar question about Leaflet
This issue from the Folium github

自从我切换基础图层以来,我使用了 event baselayerchange.

from branca.element import Element

js_keep_in_front = f"""
    {m.get_name()}.on("baselayerchange", function (event) {{
      {popup.get_name()}.bringToFront();
    }});
"""
e = Element(js_keep_in_front)
html = m.get_root()
html.script.get_root().render()
# Insert new element or custom JS
html.script._children[e.get_name()] = e

如果像您的示例中那样有很多对象,可以像 this example 一样将它们分组到 folium.FeatureGroup 中,然后使用描述的方法将单层保留在前面。

请注意在格式化字符串中使用了 get_name 方法。这很重要,因为您不知道 folium 将用于 map/layers.

的名称