当Hadoop遇上水污染监测:基于大数据的中国水污染监测数据可视化分析系统让毕设不再平凡

95 阅读8分钟

🍊作者:计算机毕设匠心工作室

🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。

擅长:按照需求定制化开发项目、 源码、对代码进行完整讲解、文档撰写、ppt制作。

🍊心愿:点赞 👍 收藏 ⭐评论 📝

👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~

Java实战项目

Python实战项目

微信小程序|安卓实战项目

大数据实战项目

PHP|C#.NET|Golang实战项目

🍅 ↓↓文末获取源码联系↓↓🍅

基于大数据的中国水污染监测数据可视化分析系统-选题背景

选题背景 水污染问题是我国环境治理的重大挑战之一。据生态环境部2023年发布的《中国生态环境状况公报》,全国地表水监测断面中,Ⅳ类及以下水质占比仍超20%,部分地区水体富营养化和重金属污染问题突出,严重威胁饮用水安全和生态系统稳定。近年来,随着工业化、城镇化和农业现代化的加速推进,化学需氧量(COD)、氨氮、总磷等污染物排放量居高不下,区域性污染特征差异显著。与此同时,大数据技术的飞速发展为环境监测提供了新机遇,Hadoop和Spark等框架能够高效处理海量水质数据,结合地理信息系统和可视化技术,可直观揭示污染的时空分布规律。然而,当前水质监测系统多以单一指标分析为主,缺乏对多维度污染成因的深度挖掘和综合评价,导致治理决策依据不足。《基于大数据的中国水污染监测数据可视化分析系统》应运而生,依托Hadoop、Spark等技术,通过多维度分析和可视化呈现,为水污染治理提供科学支撑,紧扣国家生态文明建设和环境保护的战略需求。 选题意义 这个系统在实际应用中价值巨大,能为水污染治理提供精准的数据支持和决策参考。通过对全国水质数据的多维度分析,如各省份水质综合评价、重点城市红黑榜、污染物浓度对比及相关性分析,系统能清晰揭示污染的区域差异和关键驱动因素,为政府制定针对性治理政策提供依据。像水体富营养化风险评估和重金属超标分析这样的功能,还能帮助提前预警生态灾害,保护饮用水安全和公众健康。技术上,系统整合Hadoop和Spark的高效处理能力,结合Python/Java双语言实现,兼顾灵活性与稳定性,为大四学生提供了一个兼具技术深度和实际应用的毕设选题,有助于提升编程能力和大数据分析经验。更重要的是,系统通过Echarts等可视化工具将复杂数据转化为直观图表,不仅能让环保部门和科研机构更高效地理解污染现状,还能增强公众对水污染问题的关注,推动全社会参与环境保护,助力实现“绿水青山就是金山银山”的目标。

基于大数据的中国水污染监测数据可视化分析系统-技术选型

大数据框架:Hadoop+Spark(本次没用Hive,支持定制)

开发语言:Python+Java(两个版本都支持)

后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持)

前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery

详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy

数据库:MySQL

基于大数据的中国水污染监测数据可视化分析系统-视频展示

基于大数据的中国水污染监测数据可视化分析系统-视频

基于大数据的中国水污染监测数据可视化分析系统-图片展示

在这里插入图片描述 在这里插入图片描述在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

基于大数据的中国水污染监测数据可视化分析系统-代码展示

# 功能1: 全国水质监测点地理热力图分析
def generate_water_quality_heatmap(request):
    # 从HDFS读取水质监测数据
    spark = SparkSession.builder.appName("WaterQualityHeatmap").getOrCreate()
    water_data = spark.read.parquet("hdfs://localhost:9000/water_pollution_data/")
    
    # 注册为临时视图以便使用Spark SQL
    water_data.createOrReplaceTempView("water_monitoring")
    
    # 使用Spark SQL查询经纬度和水质指数数据
    heatmap_data = spark.sql("""
        SELECT 
            Longitude, 
            Latitude, 
            Water_Quality_Index,
            Province,
            City,
            Date
        FROM water_monitoring
        WHERE Longitude IS NOT NULL 
        AND Latitude IS NOT NULL
        AND Water_Quality_Index IS NOT NULL
    """)
    
    # 转换为Pandas DataFrame以便进一步处理
    pandas_df = heatmap_data.toPandas()
    
    # 计算热力图权重 - 水质指数越高表示污染越严重,权重越大
    pandas_df['weight'] = pandas_df['Water_Quality_Index'] / pandas_df['Water_Quality_Index'].max() * 100
    
    # 按省份和城市分组计算平均水质指数
    province_stats = pandas_df.groupby('Province')['Water_Quality_Index'].agg(['mean', 'max', 'min']).reset_index()
    city_stats = pandas_df.groupby('City')['Water_Quality_Index'].agg(['mean', 'max', 'min']).reset_index()
    
    # 识别水质污染热点区域 (水质指数排名前10%)
    pollution_hotspots = pandas_df.nlargest(int(len(pandas_df) * 0.1), 'Water_Quality_Index')
    
    # 构建GeoJSON格式的热力图数据
    heatmap_geojson = {
        "type": "FeatureCollection",
        "features": [
            {
                "type": "Feature",
                "geometry": {
                    "type": "Point",
                    "coordinates": [row['Longitude'], row['Latitude']]
                },
                "properties": {
                    "weight": float(row['weight']),
                    "water_quality_index": float(row['Water_Quality_Index']),
                    "province": row['Province'],
                    "city": row['City'],
                    "date": row['Date']
                }
            } for _, row in pandas_df.iterrows()
        ]
    }
    
    # 返回JSON响应
    return JsonResponse({
        'heatmap_data': heatmap_geojson,
        'province_stats': province_stats.to_dict('records'),
        'city_stats': city_stats.to_dict('records'),
        'pollution_hotspots': pollution_hotspots.to_dict('records')
    })


# 功能2: 主要污染物与水质指数的相关性分析
def analyze_pollutant_correlations(request):
    # 初始化Spark会话
    spark = SparkSession.builder.appName("PollutantCorrelationAnalysis").getOrCreate()
    
    # 从HDFS读取数据
    pollution_data = spark.read.parquet("hdfs://localhost:9000/water_pollution_data/")
    pollution_data.createOrReplaceTempView("pollution_records")
    
    # 提取所有污染物指标和水质指数
    pollutants_df = spark.sql("""
        SELECT 
            Water_Quality_Index,
            COD_mg_L,
            Ammonia_N_mg_L,
            Total_Phosphorus_mg_L,
            Total_Nitrogen_mg_L,
            pH,
            Turbidity_NTU,
            Heavy_Metals_Pb_ug_L,
            Heavy_Metals_Cd_ug_L,
            Heavy_Metals_Hg_ug_L,
            Province
        FROM pollution_records
        WHERE Water_Quality_Index IS NOT NULL
    """)
    
    # 转换为Pandas DataFrame进行相关性分析
    pandas_df = pollutants_df.toPandas()
    
    # 计算各污染物与水质指数的皮尔逊相关系数
    correlation_matrix = pandas_df.corr(method='pearson')
    
    # 提取各污染物与水质指数的相关系数
    wqi_correlations = correlation_matrix['Water_Quality_Index'].drop('Water_Quality_Index').sort_values(ascending=False)
    
    # 按省份分组计算相关系数,分析区域差异
    province_correlations = {}
    for province in pandas_df['Province'].unique():
        province_data = pandas_df[pandas_df['Province'] == province]
        if len(province_data) > 30:  # 确保样本量足够进行相关性分析
            prov_corr = province_data.corr(method='pearson')['Water_Quality_Index'].drop('Water_Quality_Index')
            province_correlations[province] = prov_corr.to_dict()
    
    # 使用NumPy进行多元线性回归分析,找出对水质指数影响最大的因子
    from sklearn.linear_model import LinearRegression
    import numpy as np
    
    # 准备特征和目标变量
    feature_columns = ['COD_mg_L', 'Ammonia_N_mg_L', 'Total_Phosphorus_mg_L', 
                       'Total_Nitrogen_mg_L', 'pH', 'Turbidity_NTU',
                       'Heavy_Metals_Pb_ug_L', 'Heavy_Metals_Cd_ug_L', 'Heavy_Metals_Hg_ug_L']
    
    # 处理缺失值
    X = pandas_df[feature_columns].fillna(pandas_df[feature_columns].mean())
    y = pandas_df['Water_Quality_Index']
    
    # 拟合线性回归模型
    model = LinearRegression()
    model.fit(X, y)
    
    # 获取各特征的系数,表示其对水质指数的影响程度
    coefficients = dict(zip(feature_columns, model.coef_))
    
    # 返回分析结果
    return JsonResponse({
        'overall_correlations': wqi_correlations.to_dict(),
        'province_correlations': province_correlations,
        'regression_coefficients': coefficients,
        'top_pollutants': sorted(coefficients.items(), key=lambda x: abs(x[1]), reverse=True)[:3]
    })


# 功能3: 城市污染模式聚类分析
def cluster_city_pollution_patterns(request):
    # 初始化Spark会话
    spark = SparkSession.builder.appName("CityPollutionClustering").getOrCreate()
    
    # 从HDFS读取数据
    city_data = spark.read.parquet("hdfs://localhost:9000/water_pollution_data/")
    city_data.createOrReplaceTempView("city_pollution")
    
    # 按城市聚合污染物数据
    city_pollution_agg = spark.sql("""
        SELECT 
            City,
            Province,
            AVG(Water_Quality_Index) as avg_wqi,
            AVG(COD_mg_L) as avg_cod,
            AVG(Ammonia_N_mg_L) as avg_ammonia,
            AVG(Total_Phosphorus_mg_L) as avg_phosphorus,
            AVG(Total_Nitrogen_mg_L) as avg_nitrogen,
            AVG(pH) as avg_ph,
            AVG(Turbidity_NTU) as avg_turbidity,
            AVG(Heavy_Metals_Pb_ug_L) as avg_lead,
            AVG(Heavy_Metals_Cd_ug_L) as avg_cadmium,
            AVG(Heavy_Metals_Hg_ug_L) as avg_mercury,
            COUNT(*) as sample_count
        FROM city_pollution
        GROUP BY City, Province
        HAVING COUNT(*) >= 10  # 确保每个城市有足够的样本
    """)
    
    # 转换为Pandas DataFrame进行聚类分析
    pandas_df = city_pollution_agg.toPandas()
    
    # 提取用于聚类的特征
    features = ['avg_wqi', 'avg_cod', 'avg_ammonia', 'avg_phosphorus', 'avg_nitrogen', 
                'avg_ph', 'avg_turbidity', 'avg_lead', 'avg_cadmium', 'avg_mercury']
    
    # 标准化特征
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    scaled_features = scaler.fit_transform(pandas_df[features])
    
    # 使用K-Means进行聚类
    from sklearn.cluster import KMeans
    from sklearn.metrics import silhouette_score
    
    # 确定最佳聚类数量
    silhouette_scores = []
    k_range = range(2, 11)
    for k in k_range:
        kmeans = KMeans(n_clusters=k, random_state=42)
        cluster_labels = kmeans.fit_predict(scaled_features)
        silhouette_avg = silhouette_score(scaled_features, cluster_labels)
        silhouette_scores.append(silhouette_avg)
    
    # 选择轮廓系数最高的聚类数量
    optimal_k = k_range[silhouette_scores.index(max(silhouette_scores))]
    
    # 使用最佳聚类数量进行最终聚类
    kmeans = KMeans(n_clusters=optimal_k, random_state=42)
    pandas_df['cluster'] = kmeans.fit_predict(scaled_features)
    
    # 分析各聚类的特征
    cluster_profiles = pandas_df.groupby('cluster')[features].mean()
    
    # 为每个聚类分配污染类型标签
    pollution_types = []
    for _, row in cluster_profiles.iterrows():
        # 根据各污染物指标确定污染类型
        if row['avg_cod'] > row['avg_cod'].mean() and row['avg_ammonia'] > row['avg_ammonia'].mean():
            if row['avg_lead'] > row['avg_lead'].mean() or row['avg_cadmium'] > row['avg_cadmium'].mean():
                pollution_types.append("工业复合型污染")
            else:
                pollution_types.append("有机物污染为主")
        elif row['avg_phosphorus'] > row['avg_phosphorus'].mean() and row['avg_nitrogen'] > row['avg_nitrogen'].mean():
            pollution_types.append("农业面源型污染")
        elif row['avg_lead'] > row['avg_lead'].mean() or row['avg_mercury'] > row['avg_mercury'].mean():
            pollution_types.append("重金属污染为主")
        else:
            pollution_types.append("轻度混合污染")
    
    cluster_profiles['pollution_type'] = pollution_types
    
    # 将聚类结果添加到城市数据中
    city_clusters = pandas_df[['City', 'Province', 'cluster']].merge(
        cluster_profiles['pollution_type'].reset_index(),
        on='cluster'
    )
    
    # 返回聚类结果
    return JsonResponse({
        'optimal_clusters': int(optimal_k),
        'silhouette_scores': dict(zip(k_range, silhouette_scores)),
        'cluster_profiles': cluster_profiles.to_dict('index'),
        'city_clusters': city_clusters.to_dict('records')
    })

基于大数据的中国水污染监测数据可视化分析系统-结语

👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~

Java实战项目

Python实战项目

微信小程序|安卓实战项目

大数据实战项目

PHP|C#.NET|Golang实战项目

🍅 主页获取源码联系🍅