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:用于在地图上绘制动态内容(可选)。
  • imageiomatplotlib.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.animationfolium 绘制动态地图。这里我们使用 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()

注意事项

  1. 数据准确性:确保你使用的地铁站点和线路数据是准确和最新的。
  2. 性能:绘制和更新大量数据点可能会影响动画的性能。优化数据处理和绘制逻辑可以提高性能。
  3. 可视化效果:根据需求调整动画的帧率和更新逻辑,以获得更好的视觉效果。

这只是一个基本的示例,你可以根据实际需求进行扩展和优化。希望这对你有所帮助!

项目实战

首先准备数据,以北京市为例,在高德地图地铁页面进行抓包,抓包地址为:

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%免费】

在这里插入图片描述

Logo

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

更多推荐