我正在尝试在 Folium 中制作一个具有多个图层的地图,每个图层都由阴影区域(使用 GeoJSON)组成,其颜色由颜色图给出。我想向我的图层添加图例。我找到了第一个解决方案here,但这个解决方案的问题是图例固定在右上角,更重要的是,它总是在那里。相反,我想要一个仅在显示相应图层时才显示的图例。
这是我尝试过的一些示例代码(其中 m 是我的 Folium 贴图,cm1 和 cm2 是彩色贴图):
folium.GeoJson(data['Temp'],
name='Temp',
style_function=lambda x: {
'fillColor': cm1(x['properties']['Temp']),
'fillOpacity': 0.2,
'color' : None
},
highlight_function=lambda x: {'weight':3, 'color':'black'},
tooltip=folium.features.GeoJsonTooltip(fields=['Temp', 'Rain'],
labels=True,
sticky=True
), show=False).add_to(m)
folium.GeoJson(data['Rain'],
name='Rain',
style_function=lambda x: {
'fillColor': cm2(x['properties']['Rain']),
'fillOpacity': 0.2,
'color' : None
},
highlight_function=lambda x: {'weight':3, 'color':'black'},
tooltip=folium.features.GeoJsonTooltip(fields=['Temp', 'Rain'],
labels=True,
sticky=True
), show=False).add_to(m)
cm1.caption = 'Temp scale'
cm2.caption = 'Rain scale'
m.add_child(cm1)
m.add_child(cm2)
folium.LayerControl().add_to(m)
如何更改我的代码,以便仅在显示相应图层时才显示图例? (如果可能的话,我怎样才能将图例移到左下角?)
如果您只想更改 LayerControl 的位置:
folium.map.LayerControl('topleft', collapsed=False).add_to(m)
如果您了解一点 JavaScript,您可以更改/操作,例如: 传奇
评论链接获得了解决方案的大部分内容!只需将
overlayadd
和 overlayremove
事件修改为 layeradd
和 layerremove
,这样当您使用互斥(overlay = False)层时,该解决方案也可以工作。
# Adapted from: https://nbviewer.org/gist/BibMartin/f153aa957ddc5fadc64929abdee9ff2e
from branca.element import MacroElement
from jinja2 import Template
class BindColormap(MacroElement):
"""Binds a colormap to a given layer.
Parameters
----------
colormap : branca.colormap.ColorMap
The colormap to bind.
"""
def __init__(self, layer, colormap):
super(BindColormap, self).__init__()
self.layer = layer
self.colormap = colormap
self._template = Template(u"""
{% macro script(this, kwargs) %}
{{this.colormap.get_name()}}.svg[0][0].style.display = 'block';
{{this._parent.get_name()}}.on('layeradd', function (eventLayer) {
if (eventLayer.layer == {{this.layer.get_name()}}) {
{{this.colormap.get_name()}}.svg[0][0].style.display = 'block';
}});
{{this._parent.get_name()}}.on('layerremove', function (eventLayer) {
if (eventLayer.layer == {{this.layer.get_name()}}) {
{{this.colormap.get_name()}}.svg[0][0].style.display = 'none';
}});
{% endmacro %}
""") # noqa
# set up base map
map = folium.Map(tiles=None)
layer0 = folium.FeatureGroup(name='Base Map',overlay=True,control=False)
folium.TileLayer(tiles='OpenStreetMap').add_to(layer0)
layer0.add_to(map)
# imagine you've already defined two layers and associated colorbars
# call them layer1, colorbar1; layer2, colorbar2
map.add_child(colorbar1)
map.add_child(BindColormap(layer1,colorbar1))
map.add_child(colorbar2)
map.add_child(BindColormap(layer2,colorbar2))
folium.LayerControl(collapsed=False).add_to(test_map)