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

Dash Plotly几何数据子集化的回调功能开发求助

Dash Plotly 动态区域筛选点数据可视化解决方案

完整实现代码

假设你已准备好两个GeoDataFrame:

  • gdf_all:存储所有待展示的点几何数据
  • gdf_poly:存储各区域(非洲、欧洲等)的多边形数据,其中包含一列(示例用continent)记录区域名称
import dash
from dash import dcc, html, Input, Output
import plotly.express as px
import geopandas as gpd

# 初始化Dash应用
app = dash.Dash(__name__)

# 动态生成下拉框选项:默认添加"全部区域",再从多边形数据中提取唯一区域名称
dropdown_options = [{'label': '全部区域', 'value': 'all'}] + \
                   [{'label': cont, 'value': cont} for cont in gdf_poly['continent'].unique()]

# 应用布局
app.layout = html.Div([
    html.H3('区域点数据筛选可视化'),
    dcc.Dropdown(
        id='region-dropdown',
        options=dropdown_options,
        value='all',  # 默认展示全部数据
        clearable=False
    ),
    dcc.Graph(id='point-map')
])

# 回调函数:根据下拉选择动态更新图表
@app.callback(
    Output('point-map', 'figure'),
    Input('region-dropdown', 'value')
)
def update_map(selected_region):
    # 选中全部区域时直接使用完整数据集
    if selected_region == 'all':
        filtered_gdf = gdf_all.copy()
    else:
        # 提取选中区域的多边形
        target_poly = gdf_poly[gdf_poly['continent'] == selected_region].geometry.iloc[0]
        # 筛选落在多边形内的点(确保两个GeoDataFrame坐标系一致,不一致需用to_crs转换)
        filtered_gdf = gdf_all[gdf_all.geometry.within(target_poly)]
        # 若为多多边形场景,推荐用空间连接替代:
        # filtered_gdf = gpd.sjoin(gdf_all, gdf_poly[gdf_poly['continent'] == selected_region], how='inner', predicate='within')
    
    # 生成地理可视化图表(可替换为scatter_mapbox加载自定义瓦片)
    fig = px.scatter_geo(
        filtered_gdf,
        lat=filtered_gdf.geometry.y,
        lon=filtered_gdf.geometry.x,
        title=f'{selected_region}区域点数据' if selected_region != 'all' else '全部区域点数据',
        hover_data=filtered_gdf.columns.drop('geometry').tolist()  # 展示点的非几何属性
    )
    fig.update_geos(fitbounds="locations", visible=True)
    fig.update_layout(margin={"r":0,"t":40,"l":0,"b":0})
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

核心逻辑说明

  • 动态下拉框:从gdf_poly中自动提取区域名称生成选项,新增区域无需修改代码,彻底替代硬编码
  • 区域筛选:通过GeoPandas的within方法判断点是否落在目标多边形内,多多边形场景用gpd.sjoin更稳定
  • 默认展示:下拉框默认选中"全部区域",直接加载完整的gdf_all数据
  • 可视化适配:用scatter_geo快速实现全球地理可视化,可根据需求切换为scatter_mapbox加载自定义地图瓦片

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:48:24