Folium中的FeatureGroup图层控制 - 仅允许一个活动图层。

5

我正在尝试在Stamen地形作为底图的Choropleth Map上显示带有信息的多个图层,并将这些图层显示为FeatureGroup。以下是我初始的代码,没有叠加控件:

map = folium.Map(location=[38.58, 0], zoom_start=3, tiles="Stamen Terrain")

fg_tc = folium.FeatureGroup(name="Totalc")

fg_tc.add_child(folium.GeoJson(data=open('world.json', 'r',
                                          encoding='utf-8-sig').read(),
                               style_function=lambda x: {
                                   'fillColor': get_at_once(x['properties']['NAME'], 'totalc'),
                                   'color': 'black',
                                   'weight': 1,
                                   'dashArray': '5, 5',
                                   'fillOpacity': 0.75}))

fg_nc = folium.FeatureGroup(name="New", show=False)

fg_nc.add_child(folium.GeoJson(data=open('world.json', 'r',
                                          encoding='utf-8-sig').read(),
                               style_function=lambda x: {
                                   'fillColor': get_at_once(x['properties']['NAME'], 'new'),
                                   'color': 'black',
                                   'weight': 1,
                                   'dashArray': '5, 5',
                                   'fillOpacity': 0.75}))

fg_td = folium.FeatureGroup(name="Totald", show=False)

fg_td.add_child(folium.GeoJson(data=open('world.json', 'r',
                                          encoding='utf-8-sig').read(),
                               style_function=lambda x: {
                                   'fillColor': get_at_once(x['properties']['NAME'], 'totald'),
                                   'color': 'black',
                                   'weight': 1,
                                   'dashArray': '5, 5',
                                   'fillOpacity': 0.75}))

fg_ac = folium.FeatureGroup(name="Active", show=False)

fg_ac.add_child(folium.GeoJson(data=open('world.json', 'r',
                                          encoding='utf-8-sig').read(),
                               style_function=lambda x: {
                                   'fillColor': get_at_once(x['properties']['NAME'], 'active_cases'),
                                   'color': 'black',
                                   'weight': 1,
                                   'dashArray': '5, 5',
                                   'fillOpacity': 0.75}))


map.add_child(fg_tc)

map.add_child(fg_nc)

map.add_child(fg_td)

map.add_child(fg_ac)

map.add_child(folium.LayerControl())

map.save("map1.html")

我的问题是FeatureGroup图层可以通过复选框进行选择,允许同时选择多个图层。在我的情况下,我需要同时显示Stamen Terrain作为背景和仅有一个活动图层,但我不知道如何做到这一点。
我还尝试控制覆盖层,但只能显示一个单独的图层,我失去了Stamen Terrain作为背景,即图层由单选按钮控制,但只有一个组包括Stamen Terrain和数据FeatureGroup图层...
有什么想法如何按预期显示:Stamen Terrain作为背景,同时只有一个活动数据层? 我并不固定使用FeatureGroup,但目前我的知识受限于此,到目前为止我的谷歌搜索也没有成功...
谢谢!
附带一些尝试结果的截图:1&2没有覆盖控制,可以看到在“2”中选择了更多图层时会发生什么。3&4为overlay=False,然后只能激活一个图层。 尝试结果的截图

请提供完整的数据。谢谢。 - sentence
你是什么意思?我还能提供什么?很高兴能... - Vlad
你找到解决方案了吗?我有完全相同的需求,但还没有找到解决方案。 - shora
@shora,很遗憾不是的 :-( - Vlad
1个回答

3

我有过类似的问题。如果你还没有解决,以下是我做的:

map = folium.Map(location=[ , ], zoom_start= , tiles=None)
base_map = folium.FeatureGroup(name='Basemap', overlay=True, control=False)
folium.TileLayer(tiles='OpenStreetMap').add_to(base_map)
base_map.add_to(map)

layer1 = folium.FeatureGroup(name='layer1', overlay=False)
layer1.add_to(map)

这对我解决了问题。

请查看我的附言和其中的示例3和4。您提出的是隐藏底图。我期望的结果是底图保留,其余图层使用单选按钮而不是复选框... - Vlad
嗨,这就是它的作用。基础层是您使用的瓷砖,您将其设置为overlay=True,以便可以与其他图层叠加,就像您示例中的编号1一样,但您将control=False设置为始终打开,然后其他图层您将overlay=False和control=True设置,因此您有像3&4中的单选按钮,但由于基础层设置为overlay=True,因此它始终存在。因此,您对geojson图层有单选按钮,并且对于基础层没有选择,因为它始终打开。这对我很有效。 - Pawcio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接