Python数据可视化-制作一线城市地铁运行动态图
制作一线城市地铁运行动态图是一个复杂但有趣的任务,通常涉及多个步骤,包括数据收集、数据预处理、地图绘制以及动画生成。以下是一个基本的流程和一些示例代码,帮助你了解如何完成这个任务。首先,你需要收集地铁线路和站点数据。这些数据通常可以通过地铁运营商的官方网站或API获取。这只是一个基本的示例,你可以根据实际需求进行扩展和优化。希望这对你有所帮助!你需要一些Python库来绘制地图和生成动画。首先,绘
Python制作一线城市地铁运行动态图
制作一线城市地铁运行动态图是一个复杂但有趣的任务,通常涉及多个步骤,包括数据收集、数据预处理、地图绘制以及动画生成。以下是一个基本的流程和一些示例代码,帮助你了解如何完成这个任务。
步骤 1:数据收集
首先,你需要收集地铁线路和站点数据。这些数据通常可以通过地铁运营商的官方网站或API获取。以下是一个示例数据结构:
# 地铁线路和站点数据示例
metro_data = {
"lines": [
{
"name": "Line 1",
"color": "#FF0000", # 线路颜色
"stations": [
{"name": "Station A", "lat": 39.9042, "lon": 116.4074},
{"name": "Station B", "lat": 39.9142, "lon": 116.4174},
# 更多站点...
]
},
# 更多线路...
]
}
步骤 2:安装必要的库
你需要一些Python库来绘制地图和生成动画。以下是常用的库:
geopandas:用于处理地理数据。matplotlib:用于绘制地图。folium:用于在地图上绘制动态内容(可选)。imageio或matplotlib.animation:用于生成动画。
你可以通过以下命令安装这些库:
pip install geopandas matplotlib folium imageio
步骤 3:绘制静态地图
首先,绘制一个简单的静态地图,以确认数据是否正确。
import geopandas as gpd
import matplotlib.pyplot as plt
# 创建一个GeoDataFrame来存储地铁站点
stations_gdf = gpd.GeoDataFrame([
gpd.GeoSeries(gpd.points_from_xy(station['lon'], station['lat'])).rename("geometry")
.assign(name=station['name'])
for line in metro_data['lines'] for station in line['stations']
])
# 设置坐标参考系统(CRS)
stations_gdf.set_crs(epsg=4326, inplace=True) # WGS 84
stations_gdf.to_crs(epsg=3857, inplace=True) # Web Mercator
# 绘制地图
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
stations_gdf.plot(ax=ax, color='blue')
plt.title("Metro Stations")
plt.show()
步骤 4:绘制动态地图
使用 matplotlib.animation 或 folium 绘制动态地图。这里我们使用 matplotlib.animation 来演示。
import numpy as np
import matplotlib.animation as animation
# 创建一个函数来更新动画帧
def update(frame):
ax.clear()
# 绘制所有地铁线路
for line in metro_data['lines']:
x, y = zip(*[(station['lon'], station['lat']) for station in line['stations']])
ax.plot(x, y, color=line['color'])
# 绘制当前帧的地铁列车位置(假设列车在站点之间匀速移动)
# 这里需要一些逻辑来模拟列车的位置,比如基于时间或帧数
for i, line in enumerate(metro_data['lines']):
num_stations = len(line['stations'])
if num_stations > 1:
# 假设列车从第一个站点到最后一个站点
train_pos = np.linspace(0, 1, frame % (num_stations * 10) + 1)[-2] # 线性插值
start_station = line['stations'][0]
end_station = line['stations'][-1]
train_lon = start_station['lon'] + train_pos * (end_station['lon'] - start_station['lon'])
train_lat = start_station['lat'] + train_pos * (end_station['lat'] - start_station['lat'])
ax.plot(train_lon, train_lat, 'ro') # 用红色圆点表示列车
# 更新图形
stations_gdf.plot(ax=ax, color='blue')
plt.title(f"Metro Trains - Frame {frame}")
# 创建图形和轴
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
# 设置动画
ani = animation.FuncAnimation(fig, update, frames=100, interval=100)
# 显示动画
plt.show()
注意事项
- 数据准确性:确保你使用的地铁站点和线路数据是准确和最新的。
- 性能:绘制和更新大量数据点可能会影响动画的性能。优化数据处理和绘制逻辑可以提高性能。
- 可视化效果:根据需求调整动画的帧率和更新逻辑,以获得更好的视觉效果。
这只是一个基本的示例,你可以根据实际需求进行扩展和优化。希望这对你有所帮助!
项目实战
首先准备数据,以北京市为例,在高德地图地铁页面进行抓包,抓包地址为:
http://map.amap.com/subway/index.html?&1100

北京市地铁信息接口为:
http://map.amap.com/service/subway?_1599997789354=&srhdata=1100_drw_beijing.json

对json数据进行解析,使其成为Bmap数据格式
import requests import json url='http://map.amap.com/service/subway?_1599997789354=&srhdata=1100_drw_beijing.json' response=requests.get(url) result=json.loads(response.text) stations=[] for i in result['l']: station=[] for j in i['st']: station.append([float(k) for k in j['sl'].split(',')]) stations.append(station) print(stations)

1.北京地铁线路图
from pyecharts.charts import BMap from pyecharts import options as opts from pyecharts.globals import BMapType, ChartType c=( BMap(init_opts=opts.InitOpts(width="1600px", height="800px")) .add_schema( baidu_ak="", #百度秘钥ak center=[116.397128, 39.916527], #当前视角的中心点,用经纬度表示 zoom=14, #当前视角的缩放比例 is_roam=True, #是否开启鼠标缩放和平移漫游 ) .add( series_name="", type_=ChartType.LINES, data_pair=stations, is_polyline=True, #是否是多段线 is_large=True, #是否启用大规模线图的优化,在数据图形特别多的时候(>=5k)可以开启 linestyle_opts=opts.LineStyleOpts(color="purple", opacity=0.6, width=1), effect_opts=opts.EffectOpts(trail_length=0.5), ) .add_control_panel( copyright_control_opts=opts.BMapCopyrightTypeOpts(position=3), maptype_control_opts=opts.BMapTypeControlOpts( type_=BMapType.MAPTYPE_CONTROL_DROPDOWN ), scale_control_opts=opts.BMapScaleControlOpts(), overview_map_opts=opts.BMapOverviewMapControlOpts(is_open=True), navigation_control_opts=opts.BMapNavigationControlOpts(), geo_location_control_opts=opts.BMapGeoLocationControlOpts(), ) ) c.render_notebook()

2.上海地铁线路图

3.广州地铁线路图

4.深圳地铁线路图

赶紧动手做一下你所在城市的地铁线路图吧!
完整代码可以扫描下方CSDNA官方认证二维码领取【保证100%免费】

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)