精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖
一、项目介绍
全球中强震目录跨年跨区,字段里既有震级深度,也有台站几何与定位误差一类观测信息,体量到八万多条后,靠表格翻找很难同时看清时空活跃、地理热点和异常突出事件。业务上又希望把结果落到分维页面和大屏,手工做统计和聚类门槛偏高。本文通过开发一个基于大数据的全球地震数据分析与可视化系统,用以帮助解决全球地震目录难汇总、难分群和难可视化阅读的问题。
本系统采用 Hadoop 与 Spark 做数据上传、预处理和分维统计,并用 Python 与 scikit-learn 落地 DBSCAN、K-Means 与 Isolation Forest。后端 Django 把分析结果接口化,前端 Vue 配合 ECharts 呈现分析页与可视化大屏,功能覆盖时空分布、震级深度、地理热点、事件属性、观测指标和风险洞察,并带地震数据维护与登录后的大屏浏览。
经过系统测试,本系统能满足地震业务观察人员、数据分析人员和计算机专业学生在全球地震目录对照、热点分群与可视化展示方面的需求。八万余条 USGS 风格记录整理成可筛选的分析页和大屏后,阅读门槛会低一些,对教学演示和业务阅读都有实际帮助。
二、视频展示
三、开发环境
- 大数据技术:Hadoop、Spark、Hive
- 开发技术:Python、Django框架、Vue、Echarts
- 软件工具:Pycharm、DataGrip、Anaconda
- 可视化 工具 Echarts
四、系统展示
登录模块:








五、代码展示
# Hadoop_Spark/risk_insight_analysis.py — source_feature_cluster_analysis
def source_feature_cluster_analysis(input_df):
"""震源特征分群:mag/depth/gap/rms → 轮廓系数选 K → Spark KMeans → 中文标签。"""
work = input_df.filter(
col('mag').isNotNull() & col('depth').isNotNull()
& col('gap').isNotNull() & col('rms').isNotNull()
).select('mag', 'depth', 'gap', 'rms')
sampled, sn = _sample_spark(work, SAMPLE_LIMIT)
# 特征组装 + 标准化
assembler = VectorAssembler(
inputCols=['mag', 'depth', 'gap', 'rms'], outputCol='features_raw')
assembled = assembler.transform(sampled)
scaler = StandardScaler(
inputCol='features_raw', outputCol='features', withMean=True, withStd=True)
scaled = scaler.fit(assembled).transform(assembled)
# 轮廓系数在 K=3~6 中选优
pdf_feat = scaled.select('mag', 'depth', 'gap', 'rms').toPandas()
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans as SkKMeans
from sklearn.preprocessing import StandardScaler as SkScaler
X = pdf_feat[['mag', 'depth', 'gap', 'rms']].astype(float).values
Xs = SkScaler().fit_transform(X)
best_k, best_score = 4, -1.0
for k in range(3, 7):
labs = SkKMeans(n_clusters=k, random_state=RANDOM_SEED, n_init=10).fit_predict(Xs)
score = float(silhouette_score(Xs, labs))
logger.info(f"轮廓系数选K: k={k}, silhouette={score:.4f}")
if score > best_score:
best_k, best_score = k, score
logger.info(f"选定 K={best_k}(轮廓系数最高 {best_score:.4f})")
# Spark MLlib 正式聚类
kmeans = SparkKMeans(
k=best_k, seed=RANDOM_SEED,
featuresCol='features', predictionCol='cluster_id')
pred = kmeans.fit(scaled).transform(scaled)
# 按簇心相对排序贴中文业务标签
centers = pred.groupBy('cluster_id').agg(
spark_count(lit(1)).alias('event_count'),
spark_round(spark_avg('mag'), 2).alias('avg_mag'),
spark_round(spark_avg('depth'), 2).alias('avg_depth'),
spark_round(spark_avg('gap'), 2).alias('avg_gap'),
spark_round(spark_avg('rms'), 2).alias('avg_rms'),
)
center_pdf = centers.toPandas().sort_values('avg_mag').reset_index(drop=True)
n = len(center_pdf)
depth_sorted = center_pdf.sort_values('avg_depth')['cluster_id'].tolist()
depth_rank_map = {}
for i, cid in enumerate(depth_sorted):
if i == 0:
depth_rank_map[cid] = '偏浅源'
elif i == n - 1:
depth_rank_map[cid] = '偏深源'
else:
depth_rank_map[cid] = '中等深度'
gap_sorted = center_pdf.sort_values('avg_gap')['cluster_id'].tolist()
gap_rank_map = {}
for i, cid in enumerate(gap_sorted):
if i == n - 1:
gap_rank_map[cid] = '高方位间隙'
elif i == 0:
gap_rank_map[cid] = '低方位间隙'
else:
gap_rank_map[cid] = '中等方位间隙'
rows = []
for i, row in center_pdf.iterrows():
cid = int(row['cluster_id'])
tert = int(i * 3 / n) if n >= 3 else 1
mag_zh = ['低震级', '中震级', '高震级'][min(tert, 2)]
label = f"{depth_rank_map[cid]}{mag_zh}{gap_rank_map[cid]}群"
rows.append({
'cluster_id': cid,
'cluster_label_zh': label,
'cluster_desc_zh': (
f"均震级{float(row['avg_mag']):.2f}/均深度{float(row['avg_depth']):.2f}km/"
f"均间隙{float(row['avg_gap']):.2f}/均残差{float(row['avg_rms']):.2f}"
),
'event_count': int(row['event_count']),
'avg_mag': round(float(row['avg_mag']), 2),
'avg_depth': round(float(row['avg_depth']), 2),
'avg_gap': round(float(row['avg_gap']), 2),
'avg_rms': round(float(row['avg_rms']), 2),
'sample_size': int(sn),
'k_selected': int(best_k),
'silhouette': round(float(best_score), 2),
})
out_pdf = pd.DataFrame(rows).sort_values('event_count', ascending=False)
path = _write_csv_pandas(out_pdf, 'source_feature_cluster_analysis.csv')
logger.info(f"保存到: {path} 成功")
return out_pdf
六、项目文档展示

七、项目总结
本课题围绕 USGS 十年全球 M≥4.5 地震目录,开发了基于大数据的全球地震数据分析与可视化系统。系统以 Hadoop 与 Spark 完成数据上传、预处理和分维统计,用 Python 与 scikit-learn 落地 DBSCAN 震中热点聚类、K-Means 震源特征分群和 Isolation Forest 异常识别;后端 Django 提供分析接口,前端 Vue 与 ECharts 呈现时空分布、震级深度、地理热点、事件属性、观测指标、风险洞察六维分析页及可视化大屏,并支持地震数据维护。约八万条记录经清洗聚合后,可按维度对照活跃趋势、空间热点与异常事件,降低了目录阅读与分群解读的门槛。系统测试表明,本系统能够满足业务观察、数据分析与教学演示等场景对全球地震数据汇总、分群与可视化展示的需求,对同类大数据毕设具有一定参考价值。
大家可以帮忙点赞、收藏、关注、评论啦 👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖

1841

被折叠的 条评论
为什么被折叠?



