You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用滑块切换Folium栅格图层并实现淡入淡出效果?

在Folium中实现栅格图层的滑块淡入淡出切换

Folium本身没有内置这种带过渡效果的图层切换滑块,但可以通过自定义JavaScript逻辑结合Folium的图层系统实现这个需求。核心思路是通过滑块控制相邻图层的透明度,拖动时让前一图层逐渐淡出、后一图层逐渐淡入。

实现步骤与代码示例

  1. 加载并添加所有栅格图层:先将所有GeoTIFF对应的ImageOverlay添加到地图,初始仅显示第一个图层,其余图层透明度设为0。
  2. 注入滑块控件与JS逻辑:添加HTML滑块,并编写JavaScript监听滑块输入事件,动态调整对应图层的透明度。
import folium
import rasterio
from folium.raster_layers import ImageOverlay
import numpy as np

# 替换为你的GeoTIFF文件路径列表
tiff_paths = ["flood_event_1.tif", "flood_event_2.tif", "flood_event_3.tif"]
# 替换为你的数据范围中心坐标
map_center = [30.0, 120.0]

# 初始化地图
m = folium.Map(location=map_center, zoom_start=10)

# 加载并添加所有栅格图层
for idx, tiff_path in enumerate(tiff_paths):
    with rasterio.open(tiff_path) as src:
        # 获取地理范围
        bounds = src.bounds
        # 读取栅格数据并转换为ImageOverlay支持的RGBA格式
        data = src.read(1)
        # 简单颜色映射:将洪水深度映射为蓝-红渐变(可自定义配色)
        norm_data = (data - np.min(data)) / (np.max(data) - np.min(data))
        r = (norm_data * 255).astype(np.uint8)
        g = np.zeros_like(r)
        b = ((1 - norm_data) * 255).astype(np.uint8)
        a = np.full_like(r, 255)
        img_data = np.dstack((r, g, b, a))
        
        # 创建ImageOverlay,初始仅第一个图层可见
        overlay = ImageOverlay(
            image=img_data,
            bounds=[[bounds.bottom, bounds.left], [bounds.top, bounds.right]],
            opacity=1.0 if idx == 0 else 0.0,
            name=f"Flood {idx+1}"
        )
        overlay.add_to(m)

# 注入滑块控件与自定义JS
slider_script = """
<div style="position: fixed; bottom: 30px; left: 50%; transform: translateX(-50%); z-index: 1000; background: white; padding: 8px; border-radius: 4px;">
    <label for="floodSlider">洪水事件切换:</label>
    <input type="range" id="floodSlider" min="0" max="{layer_count}" step="0.01" value="0">
</div>
<script>
    const map = window.map;
    // 筛选所有ImageOverlay类型的栅格图层
    const floodLayers = Object.values(map._layers).filter(layer => layer instanceof L.ImageOverlay);
    const totalLayers = floodLayers.length;

    const slider = document.getElementById('floodSlider');
    slider.max = totalLayers - 1;

    slider.addEventListener('input', function(e) {{
        const sliderValue = parseFloat(e.target.value);
        // 计算当前和下一个图层的索引
        const currentIdx = Math.floor(sliderValue);
        const nextIdx = (currentIdx + 1) % totalLayers;
        // 计算过渡进度(0到1之间)
        const progress = sliderValue - currentIdx;

        // 调整透明度实现淡入淡出
        floodLayers[currentIdx].setOpacity(1 - progress);
        floodLayers[nextIdx].setOpacity(progress);

        // 隐藏其他无关图层
        floodLayers.forEach((layer, idx) => {{
            if (idx !== currentIdx && idx !== nextIdx) {{
                layer.setOpacity(0);
            }}
        }});
    }});
</script>
""".format(layer_count=len(tiff_paths)-1)

# 将滑块与脚本添加到地图
m.get_root().html.add_child(folium.Element(slider_script))

# 保存地图
m.save("flood_transition_map.html")

关键注意事项

  • 栅格格式处理:GeoTIFF数据需要转换为ImageOverlay支持的RGBA格式,单波段数据需添加颜色映射(示例中用了简单的蓝红渐变,可根据需求替换为专业配色方案)。
  • 图层引用:JS中通过map._layers筛选所有ImageOverlay,确保只操作目标栅格图层,避免影响其他地图元素。
  • 性能优化:如果栅格数量多或分辨率高,过渡可能出现卡顿,建议提前降低图像分辨率,或限制图层数量。
  • 滑块样式:可根据需求调整滑块的位置、样式,比如改为Leaflet原生控件样式,或添加当前图层的文本提示。

内容的提问来源于stack exchange,提问作者suryaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:30:58