计算机毕设指导师
⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。
⚡⚡****大家都可点赞、收藏、关注、有技术问题或者获取源代码!欢迎在评论区一起交流!
⚡⚡获取源码主页-->:计算机毕设****指导师(公众同号)
中国火车站站点地理数据可视化分析系统-简介
基于Hadoop+Spark的中国火车站站点地理数据可视化分析系统是一个深度融合大数据技术与地理空间分析的创新平台,专注于对中国铁路站点数据的多维度挖掘与可视化呈现。系统以Hadoop的分布式存储和Spark的高效计算为核心,支持Python或Java开发,结合Django或Spring Boot后端框架,以及Vue、ElementUI和ECharts等前端技术,构建了从数据处理到可视化的完整流程。核心功能包括全国火车站的宏观特征分析,如站点类型占比、铁路局管辖范围及省市站点分布;地理空间分析通过散点图、热力图及胡焕庸线两侧对比,揭示铁路网络的区域差异;铁路局运营管理分析展示管辖版图与站点类型结构;不同层级站点的对比分析挖掘分布模式与命名规律;基于DBSCAN和K-Means算法的空间聚类则自动识别核心铁路城市群与偏远站点。系统利用Spark SQL、Pandas、NumPy处理海量数据,结合MySQL存储,实现了高效的数据清洗、分析与可视化,为铁路网络优化、区域经济研究及交通规划提供了有力支持。
中国火车站站点地理数据可视化分析系统-技术
开发语言:java或Python
数据库:MySQL
系统架构:B/S
前端:Vue+ElementUI+HTML+CSS+JavaScript+jQuery+Echarts
大数据框架:Hadoop+Spark(本次没用Hive,支持定制)
后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)
中国火车站站点地理数据可视化分析系统-视频展示
中国火车站站点地理数据可视化分析系统-图片展示
封面
核心站点聚集区分析
火车站站点等级分析
、
火车站站点信息
铁路局管辖范围分析
用户
站点宏观特征分析
站点空间分布分析
数据分析大屏
中国火车站站点地理数据可视化分析系统-代码展示
# 核心功能1: 基于DBSCAN算法的火车站空间聚类分析
def perform_station_clustering(spark_session, station_data_df):
# 从DataFrame中提取站点经纬度数据
coordinates_df = station_data_df.select("station_id", "station_name", "WGS84_Lng", "WGS84_Lat")
# 转换为RDD以便并行处理
coordinates_rdd = coordinates_df.rdd.map(lambda row: (row["station_id"], row["station_name"],
float(row["WGS84_Lng"]), float(row["WGS84_Lat"])))
# 将经纬度数据转换为NumPy数组,用于DBSCAN算法
coordinates_array = np.array(coordinates_rdd.map(lambda x: [x[2], x[3]]).collect())
# 应用DBSCAN算法进行空间聚类,eps参数表示邻域半径(约10km),min_samples表示形成簇的最小样本数
db = DBSCAN(eps=0.1, min_samples=5, algorithm='ball_tree', metric='haversine').fit(np.radians(coordinates_array))
# 获取聚类标签
cluster_labels = db.labels_
# 统计聚类结果
n_clusters = len(set(cluster_labels)) - (1 if -1 in cluster_labels else 0)
# 将聚类结果与原始数据合并
station_with_clusters = []
for i, (station_id, station_name, lng, lat) in enumerate(coordinates_rdd.collect()):
cluster_id = int(cluster_labels[i])
station_with_clusters.append((station_id, station_name, lng, lat, cluster_id))
# 创建包含聚类信息的DataFrame
cluster_df = spark_session.createDataFrame(station_with_clusters,
["station_id", "station_name", "longitude", "latitude", "cluster_id"])
# 计算每个簇的中心点
cluster_centers = {}
for cluster_id in range(n_clusters):
cluster_points = cluster_df.filter(f"cluster_id = {cluster_id}").select("longitude", "latitude").collect()
if cluster_points:
avg_lng = sum(point["longitude"] for point in cluster_points) / len(cluster_points)
avg_lat = sum(point["latitude"] for point in cluster_points) / len(cluster_points)
cluster_centers[cluster_id] = (avg_lng, avg_lat)
# 识别每个簇所在的主要城市
cluster_cities = {}
for cluster_id in range(n_clusters):
city_counts = cluster_df.filter(f"cluster_id = {cluster_id}").join(
station_data_df, "station_id").groupBy("city").count().orderBy("count", ascending=False).collect()
if city_counts:
cluster_cities[cluster_id] = city_counts[0]["city"]
return cluster_df, cluster_centers, cluster_cities, n_clusters
# 核心功能2: 胡焕庸线两侧火车站数量与密度对比分析
def analyze_hu_line_distribution(spark_session, station_data_df):
# 胡焕庸线的近似表示:从黑龙江省爱辉区到云南省腾冲市的直线
# 起点坐标(爱辉): 约 50.2°N, 127.5°E
# 终点坐标(腾冲): 约 25.0°N, 98.5°E
# 定义胡焕庸线函数:y = kx + b,其中x是经度,y是纬度
aihui = (127.5, 50.2)
tengchong = (98.5, 25.0)
k = (tengchong[1] - aihui[1]) / (tengchong[0] - aihui[0])
b = aihui[1] - k * aihui[0]
# 注册UDF函数判断站点位于胡焕庸线的哪一侧
def determine_hu_line_side(lng, lat):
# 计算点到线的位置:如果点在线上方,则位于东南侧;如果点在线下方,则位于西北侧
y_on_line = k * lng + b
if lat > y_on_line:
return "northwest" # 西北侧
else:
return "southeast" # 东南侧
spark_session.udf.register("determine_hu_line_side", determine_hu_line_side)
# 应用UDF函数确定每个站点的位置
station_data_df.createOrReplaceTempView("stations")
stations_with_side = spark_session.sql("""
SELECT *, determine_hu_line_side(WGS84_Lng, WGS84_Lat) AS hu_line_side
FROM stations
""")
# 统计胡焕庸线两侧的站点数量
side_counts = stations_with_side.groupBy("hu_line_side").count().collect()
# 计算两侧的站点密度
# 中国国土面积约960万平方公里,其中胡焕庸线东南侧约占36%,西北侧约占64%
southeast_area = 9600000 * 0.36 # 单位:平方公里
northwest_area = 9600000 * 0.64 # 单位:平方公里
side_density = {}
for row in side_counts:
side = row["hu_line_side"]
count = row["count"]
if side == "southeast":
density = count / southeast_area * 10000 # 每万平方公里的站点数
side_density[side] = density
else:
density = count / northwest_area * 10000 # 每万平方公里的站点数
side_density[side] = density
# 按省份统计胡焕庸线两侧的站点分布
province_distribution = stations_with_side.groupBy("province", "hu_line_side").count().orderBy("province").collect()
# 计算胡焕庸线两侧的站点类型分布
type_distribution = stations_with_side.groupBy("station_type", "hu_line_side").count().orderBy("station_type").collect()
return side_counts, side_density, province_distribution, type_distribution
# 核心功能3: 全国火车站空间分布热力图数据生成
def generate_station_heatmap_data(spark_session, station_data_df):
# 提取站点坐标和权重数据
# 根据站点类型分配权重:客运站权重高,乘降所权重低
def assign_weight_by_type(station_type):
weights = {
"客运站": 10,
"客货运站": 8,
"乘降所": 3,
"货运站": 5,
"其他": 2
}
return weights.get(station_type, 2)
spark_session.udf.register("assign_weight", assign_weight_by_type)
# 应用权重函数
station_data_df.createOrReplaceTempView("stations")
weighted_stations = spark_session.sql("""
SELECT
station_id, station_name, WGS84_Lng, WGS84_Lat,
station_type, railway_bureau, province, city,
assign_weight(station_type) AS weight
FROM stations
""")
# 生成热力图所需的数据格式
heatmap_data = weighted_stations.select("WGS84_Lng", "WGS84_Lat", "weight").collect()
heatmap_points = [{"lng": row["WGS84_Lng"], "lat": row["WGS84_Lat"], "count": row["weight"]}
for row in heatmap_data]
# 计算热力图的密度中心
# 使用K-Means算法找出全国范围内的热点区域
coordinates = np.array([[point["lng"], point["lat"]] for point in heatmap_points])
weights = np.array([point["count"] for point in heatmap_points])
# 确定最佳K值 - 使用轮廓系数方法
silhouette_scores = []
k_range = range(3, 15)
for k in k_range:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(coordinates)
if len(set(cluster_labels)) > 1: # 确保有多个簇
score = silhouette_score(coordinates, cluster_labels)
silhouette_scores.append((k, score))
# 选择最佳K值
best_k = max(silhouette_scores, key=lambda x: x[1])[0]
# 使用最佳K值进行聚类
kmeans = KMeans(n_clusters=best_k, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(coordinates)
# 计算每个簇的加权中心
weighted_centers = []
for i in range(best_k):
mask = (cluster_labels == i)
if np.any(mask):
cluster_coords = coordinates[mask]
cluster_weights = weights[mask]
total_weight = np.sum(cluster_weights)
weighted_center = np.sum(cluster_coords * cluster_weights[:, np.newaxis], axis=0) / total_weight
count_in_cluster = np.sum(mask)
weighted_centers.append({
"center": weighted_center.tolist(),
"weight": float(total_weight),
"count": int(count_in_cluster)
})
# 生成省级热力数据
province_heat = weighted_stations.groupBy("province").agg(
F.sum("weight").alias("total_weight"),
F.count("station_id").alias("station_count")
).orderBy(F.desc("total_weight")).collect()
province_data = [{"province": row["province"], "weight": row["total_weight"], "count": row["station_count"]}
for row in province_heat]
return heatmap_points, weighted_centers, province_data, best_k
中国火车站站点地理数据可视化分析系统-文档展示
中国火车站站点地理数据可视化分析系统-结语
10天速成基于Hadoop+Spark的中国火车站地理数据可视化分析系统,5大核心技术全掌握
如果你觉得内容不错,欢迎一键三连(点赞、收藏、关注)支持一下!欢迎在评论区留下你的想法或提出宝贵意见,期待与大家交流探讨!谢谢!