基于STICS模型的黄土高原苹果园生态
基于Python和Streamlit的交互式应用,用于展示黄土高原苹果园生态系统服务评估的研究成果。这个应用将允许用户探索不同管理措施对生态系统服务的影响。
系统设计思路
- 交互式参数调整:用户可以调整关键模型参数和管理措施
- 动态可视化:实时展示不同管理策略下的生态系统服务变化
- 权衡关系分析:直观展示各项服务之间的协同与权衡关系
- 最优方案推荐:基于多目标优化算法推荐最佳管理组合
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots# 页面设置
st.set_page_config(page_title="黄土高原苹果园生态系统服务评估",page_icon="🍎",layout="wide",initial_sidebar_state="expanded"
)# 标题和介绍
st.title("🍎 基于STICS模型的黄土高原苹果园生态系统服务评估")
st.markdown("""
**系统说明**:本应用基于《基于STICS模型的黄土高原苹果园生态系统服务评估》研究,通过交互式界面展示不同管理措施对苹果园生态系统服务的影响。
用户可调整管理参数,实时查看各项生态系统服务指标的变化及相互关系。
""")# 创建侧边栏
with st.sidebar:st.header("模型参数设置")# 管理措施选择st.subheader("管理措施")cover_type = st.selectbox("覆盖类型", ["清耕", "秸秆覆盖", "地布覆盖"], index=2)irrigation_type = st.selectbox("灌溉策略", ["充分灌溉", "轻度亏缺(75%θf)", "中度亏缺(50%θf)"], index=1)fertilizer_rate = st.slider("施肥量 (kg N/hm²)", 100, 400, 250)# 环境参数st.subheader("环境参数")temperature = st.slider("年平均温度 (°C)", 8, 15, 11)precipitation = st.slider("年降水量 (mm)", 300, 700, 450)# 优化权重st.subheader("优化目标权重")weight_yield = st.slider("产量权重", 0.0, 1.0, 0.3)weight_carbon = st.slider("固碳量权重", 0.0, 1.0, 0.3)weight_water = st.slider("节水权重", 0.0, 1.0, 0.2)weight_emission = st.slider("减排权重", 0.0, 1.0, 0.2)st.markdown("---")st.info("调整参数后,系统将实时计算并展示不同管理措施下的生态系统服务表现")# 模拟数据生成函数(实际应用中应替换为真实模型)
def simulate_ecosystem_services(cover, irrigation, fertilizer, temp, precip):# 基础值base_yield = 30.0base_carbon = 8000base_n2o = 2.0base_water = 450base_nitrogen = 25.0# 覆盖类型影响if cover == "秸秆覆盖":yield_factor = 0.95carbon_factor = 1.15n2o_factor = 1.10water_factor = 0.90nitrogen_factor = 1.20elif cover == "地布覆盖":yield_factor = 1.05carbon_factor = 1.08n2o_factor = 0.85water_factor = 0.95nitrogen_factor = 1.10else: # 清耕yield_factor = 0.90carbon_factor = 0.95n2o_factor = 1.05water_factor = 1.05nitrogen_factor = 0.95# 灌溉策略影响if irrigation == "轻度亏缺(75%θf)":yield_factor *= 0.95water_factor *= 0.85n2o_factor *= 0.90elif irrigation == "中度亏缺(50%θf)":yield_factor *= 0.80water_factor *= 0.70n2o_factor *= 0.80# 施肥量影响fertilizer_factor = fertilizer / 250yield_factor *= min(1.0, fertilizer_factor * 0.8)n2o_factor *= fertilizer_factornitrogen_factor *= fertilizer_factor# 环境因素影响temp_factor = 1 + (temp - 11) * 0.02precip_factor = 1 + (precip - 450) * 0.001# 计算最终值yield_val = base_yield * yield_factor * temp_factor * precip_factorcarbon_val = base_carbon * carbon_factor * temp_factorn2o_val = base_n2o * n2o_factor * temp_factorwater_val = base_water * water_factor * precip_factornitrogen_val = base_nitrogen * nitrogen_factor# 计算综合服务指数service_index = (weight_yield * (yield_val/40) + weight_carbon * (carbon_val/10000) + weight_water * (1 - water_val/600) + weight_emission * (1 - n2o_val/3))return {"产量 (t/hm²)": yield_val,"固碳量 (kg C hm⁻²a⁻¹)": carbon_val,"N₂O排放 (kg N hm⁻²a⁻¹)": n2o_val,"蒸散发量 (mm)": water_val,"土壤硝态氮 (mg/kg)": nitrogen_val,"综合服务指数": service_index}# 运行模拟
results = simulate_ecosystem_services(cover_type, irrigation_type, fertilizer_rate, temperature, precipitation)# 显示关键指标
st.subheader("生态系统服务指标")
col1, col2, col3, col4, col5 = st.columns(5)
col1.metric("产量", f"{results['产量 (t/hm²)']:.2f} t/hm²")
col2.metric("固碳量", f"{results['固碳量 (kg C hm⁻²a⁻¹)']:.0f} kg C")
col3.metric("N₂O排放", f"{results['N₂O排放 (kg N hm⁻²a⁻¹)']:.2f} kg N", delta_color="inverse")
col4.metric("蒸散发量", f"{results['蒸散发量 (mm)']:.0f} mm", delta_color="inverse")
col5.metric("综合服务指数", f"{results['综合服务指数']:.3f}")# 创建对比场景
scenarios = [{"cover": "清耕", "irrigation": "充分灌溉", "fertilizer": 300},{"cover": "秸秆覆盖", "irrigation": "充分灌溉", "fertilizer": 300},{"cover": "地布覆盖", "irrigation": "充分灌溉", "fertilizer": 250},{"cover": "地布覆盖", "irrigation": "轻度亏缺(75%θf)", "fertilizer": 250},{"cover": cover_type, "irrigation": irrigation_type, "fertilizer": fertilizer_rate}
]scenario_names = ["传统管理(清耕+充分灌溉)","秸秆覆盖+充分灌溉","地布覆盖+充分灌溉","地布覆盖+轻度亏缺灌溉","当前设置"
]scenario_results = []
for i, scenario in enumerate(scenarios):res = simulate_ecosystem_services(scenario["cover"], scenario["irrigation"], scenario["fertilizer"],temperature,precipitation)res["Scenario"] = scenario_names[i]scenario_results.append(res)df_scenarios = pd.DataFrame(scenario_results)# 生态系统服务对比可视化
st.subheader("不同管理措施下的生态系统服务对比")fig1 = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.1)# 第一行:产量和固碳量
fig1.add_trace(go.Bar(x=df_scenarios["Scenario"],y=df_scenarios["产量 (t/hm²)"],name="产量 (t/hm²)",marker_color="#1f77b4"),row=1, col=1
)fig1.add_trace(go.Scatter(x=df_scenarios["Scenario"],y=df_scenarios["固碳量 (kg C hm⁻²a⁻¹)"]/250,name="固碳量 (kg C/250)",mode="lines+markers",yaxis="y2",line=dict(color="#ff7f0e", width=3)),row=1, col=1
)# 第二行:N₂O排放和蒸散发量
fig1.add_trace(go.Bar(x=df_scenarios["Scenario"],y=df_scenarios["N₂O排放 (kg N hm⁻²a⁻¹)"],name="N₂O排放 (kg N hm⁻²a⁻¹)",marker_color="#d62728"),row=2, col=1
)fig1.add_trace(go.Scatter(x=df_scenarios["Scenario"],y=df_scenarios["蒸散发量 (mm)"]/20,name="蒸散发量 (mm/20)",mode="lines+markers",yaxis="y2",line=dict(color="#2ca02c", width=3)),row=2, col=1
)# 更新布局
fig1.update_layout(title="不同管理措施下的生态系统服务对比",height=600,legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1),yaxis1=dict(title="产量 & 固碳量"),yaxis2=dict(title="固碳量 (kg C/250)", overlaying="y", side="right"),yaxis3=dict(title="N₂O排放"),yaxis4=dict(title="蒸散发量 (mm/20)", overlaying="y3", side="right"),hovermode="x unified"
)fig1.update_xaxes(tickangle=45)st.plotly_chart(fig1, use_container_width=True)# 权衡关系分析
st.subheader("生态系统服务权衡关系分析")# 生成权衡关系数据
tradeoff_data = []
for cov in ["清耕", "秸秆覆盖", "地布覆盖"]:for irr in ["充分灌溉", "轻度亏缺(75%θf)", "中度亏缺(50%θf)"]:for fert in [200, 250, 300, 350]:res = simulate_ecosystem_services(cov, irr, fert, temperature, precipitation)res["覆盖类型"] = covres["灌溉策略"] = irrres["施肥量"] = ferttradeoff_data.append(res)df_tradeoff = pd.DataFrame(tradeoff_data)# 创建散点图矩阵
fig2 = px.scatter_matrix(df_tradeoff,dimensions=["产量 (t/hm²)", "固碳量 (kg C hm⁻²a⁻¹)", "N₂O排放 (kg N hm⁻²a⁻¹)","蒸散发量 (mm)"],color="覆盖类型",symbol="灌溉策略",hover_data=["施肥量"],title="生态系统服务权衡关系矩阵"
)fig2.update_traces(diagonal_visible=False)
st.plotly_chart(fig2, use_container_width=True)# 综合服务指数热图
st.subheader("综合服务指数热图")# 生成热图数据
heatmap_data = []
for cov in ["清耕", "秸秆覆盖", "地布覆盖"]:for irr in ["充分灌溉", "轻度亏缺(75%θf)", "中度亏缺(50%θf)"]:row = {"覆盖类型": cov}for fert in [150, 200, 250, 300, 350]:res = simulate_ecosystem_services(cov, irr, fert, temperature, precipitation)row[f"{fert} kg"] = res["综合服务指数"]heatmap_data.append(row)df_heatmap = pd.DataFrame(heatmap_data).set_index("覆盖类型")fig3 = go.Figure(data=go.Heatmap(z=df_heatmap.values,x=df_heatmap.columns,y=df_heatmap.index,colorscale="Viridis",hoverongaps=False,colorbar=dict(title="综合服务指数")
))fig3.update_layout(title="不同管理组合的综合服务指数",xaxis_title="施肥量 (kg N/hm²)",yaxis_title="覆盖类型",height=400
)st.plotly_chart(fig3, use_container_width=True)# 最优方案推荐
st.subheader("最优管理方案推荐")# 寻找最优方案
best_score = -1
best_scenario = Nonefor cov in ["清耕", "秸秆覆盖", "地布覆盖"]:for irr in ["充分灌溉", "轻度亏缺(75%θf)", "中度亏缺(50%θf)"]:for fert in range(150, 351, 50):res = simulate_ecosystem_services(cov, irr, fert, temperature, precipitation)if res["综合服务指数"] > best_score:best_score = res["综合服务指数"]best_scenario = {"覆盖类型": cov,"灌溉策略": irr,"施肥量": fert,"综合服务指数": best_score,"产量": res["产量 (t/hm²)"],"固碳量": res["固碳量 (kg C hm⁻²a⁻¹)"],"N₂O排放": res["N₂O排放 (kg N hm⁻²a⁻¹)"],"蒸散发量": res["蒸散发量 (mm)"]}# 显示推荐方案
st.success(f"**推荐方案**: {best_scenario['覆盖类型']} + {best_scenario['灌溉策略']} + {best_scenario['施肥量']} kg N/hm²")
st.markdown(f"""
- **综合服务指数**: {best_scenario['综合服务指数']:.3f}
- **产量**: {best_scenario['产量']:.2f} t/hm²
- **固碳量**: {best_scenario['固碳量']:.0f} kg C hm⁻²a⁻¹
- **N₂O排放**: {best_scenario['N₂O排放']:.2f} kg N hm⁻²a⁻¹
- **蒸散发量**: {best_scenario['蒸散发量']:.0f} mm
""")# 研究结论
st.subheader("研究结论与建议")
st.markdown("""
1. **最优管理组合**:地布覆盖+轻度亏缺灌溉(75%θf)在保障产量的同时,显著降低N₂O排放和蒸散发量
2. **水氮耦合调控**:通过水分管理调控氮矿化过程是缓解服务权衡的关键
3. **综合效益**:推荐方案可实现:- 产量 >32 t/hm²- 节水10%以上- 减排20%以上
4. **推广建议**:- 在黄土高原苹果主产区推广地布覆盖技术- 实施精准灌溉策略,避免过度灌溉- 结合土壤监测调整施肥量,实现水肥协同优化
""")# 参考文献
st.caption("参考文献: 《基于STICS模型的黄土高原苹果园生态系统服务评估》")