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

容器调整大小时Dash Leaflet地图无法自适应的解决方法

Dash-Leaflet 地图无法自适应容器尺寸的解决办法

问题描述

使用dash-leaflet和dash-resizable-panels构建布局时,地图初始显示正常,但拖动面板调整容器宽度后,地图右侧会出现灰色未渲染区域,无法自适应容器的新尺寸。

最小复现示例(MRE)

先安装依赖:

pip install dash dash-leaflet dash-resizable-panels

示例代码:

import dash
import dash_leaflet as dl
from dash import html
from dash_resizable_panels import PanelGroup, Panel, PanelResizeHandle

handle = {"height": "100%", "width": "3px", "backgroundColor": "#51ada6"}
layout = html.Div([
    PanelGroup(id="panel-group", 
               children=[
                    Panel(id="panel-1",children=[html.Div([html.P("Dummy component")])]),
                    PanelResizeHandle(html.Div(style=handle)),
                    Panel(id="panel-2",
                          children=[
                            dl.Map(
                                center=[45.81, 15.98], 
                                zoom=12, 
                                id="map",  # 给地图添加id用于后续监听
                                children=[
                                    dl.TileLayer(),
                                    dl.FeatureGroup([dl.EditControl()]),
                                ], 
                                style={'height': '100%', 'width': '100%'}
                            )]
                    )], 
               direction="horizontal",),
], style={"height": "100vh"})

app = dash.Dash(__name__)
app.layout = layout
if __name__ == "__main__":
    app.run_server()

解决方案

通过客户端回调监听地图容器的尺寸变化,触发Leaflet能识别的resize事件,让地图自动重绘以适配新容器尺寸:

app.clientside_callback(
    """
    function set_event(map_id) {
        // 尺寸变化时触发window的resize事件
        var callback = function() {
            window.dispatchEvent(new Event('resize'));
        }
        // 用ResizeObserver监听地图容器的尺寸变化
        new ResizeObserver(callback).observe(document.getElementById(map_id))
        return dash_clientside.no_update;
    }
    """,
    Output("map", "id"),  # 无实际更新需求,用组件id占位
    Input("map", "id")    # 地图加载完成后触发监听
)

原理说明

Leaflet默认监听window.resize事件来自动调整地图尺寸,但dash-resizable-panels的面板调整不会触发这个全局事件。我们用ResizeObserver直接监听地图容器的尺寸变化,一旦容器大小改变,就手动触发window.resize事件,让Leaflet重新渲染地图,填满整个容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:04:58