您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用Python实现可视化动态公交线路图
## 引言
在现代城市交通规划中,公交线路可视化是优化交通网络的重要工具。本文将详细介绍如何使用Python技术栈构建一个完整的动态公交线路可视化系统,涵盖数据采集、处理、可视化和交互的全流程。通过本文,您将掌握使用Pandas进行数据处理、Folium/Plotly构建地图可视化以及实现动态效果的完整方法。
---
## 一、技术选型与准备工作
### 1.1 核心工具库
```python
# 基础数据处理
import pandas as pd
import numpy as np
# 地理数据处理
import geopandas as gpd
from shapely.geometry import Point, LineString
# 可视化
import folium
from folium.plugins import TimestampedGeoJson
import plotly.express as px
# 其他
from datetime import datetime
import json
def generate_bus_data(num_routes=5, num_stops=15):
routes = []
for i in range(num_routes):
route = {
'route_id': f'R{i+1:03d}',
'stops': [(31.23 + np.random.uniform(-0.1, 0.1),
121.47 + np.random.uniform(-0.1, 0.1))
for _ in range(num_stops)]
}
routes.append(route)
return routes
route_id | stop_sequence | stop_name | longitude | latitude | arrival_time |
---|---|---|---|---|---|
B1 | 1 | 人民广场 | 121.475 | 31.230 | 08:00:00 |
B1 | 2 | 南京东路 | 121.485 | 31.235 | 08:05:00 |
def clean_data(df):
# 处理缺失值
df = df.dropna(subset=['longitude', 'latitude'])
# 时间格式标准化
df['arrival_time'] = pd.to_datetime(df['arrival_time'])
# 坐标有效性验证
df = df[(df['longitude'].between(-180, 180)) &
(df['latitude'].between(-90, 90))]
return df
gdf = gpd.GeoDataFrame(
df,
geometry=gpd.points_from_xy(df.longitude, df.latitude),
crs="EPSG:4326"
)
base_map = folium.Map(
location=[df['latitude'].mean(), df['longitude'].mean()],
zoom_start=12,
tiles='Stamen Toner'
)
for route in df['route_id'].unique():
route_df = df[df['route_id'] == route]
folium.PolyLine(
locations=route_df[['latitude', 'longitude']].values,
color='blue',
weight=3
).add_to(base_map)
base_map.save('static_routes.html')
# 自定义图标样式
def style_function(feature):
return {
'fillColor': '#ffaf00',
'color': '#00ff00',
'weight': 2,
'dashArray': '5, 5'
}
# 添加交互式弹窗
for idx, row in df.iterrows():
folium.CircleMarker(
location=[row['latitude'], row['longitude']],
radius=5,
popup=f"<b>{row['stop_name']}</b><br>到达时间: {row['arrival_time']}",
fill=True
).add_to(base_map)
# 生成轨迹点时间序列
features = []
for _, row in df.iterrows():
features.append({
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [row['longitude'], row['latitude']]
},
'properties': {
'time': row['arrival_time'].strftime('%Y-%m-%dT%H:%M:%S'),
'style': {'color': get_color(row['route_id'])},
'icon': 'circle',
'iconstyle': {
'fillColor': '#ff0000',
'fillOpacity': 0.6,
'stroke': False
}
}
})
TimestampedGeoJson(
{'type': 'FeatureCollection', 'features': features},
period='PT1M',
add_last_point=True,
auto_play=True,
loop=False,
max_speed=10,
loop_button=True
).add_to(base_map)
import random
from IPython.display import display, clear_output
while True:
# 模拟新数据生成
new_point = generate_new_position(last_point)
# 更新地图
marker = folium.CircleMarker(
location=new_point,
radius=5,
color='red'
)
marker.add_to(base_map)
# 刷新显示
clear_output(wait=True)
display(base_map)
time.sleep(1)
gdf.sindex.query_bounds(bounds)
df = df.sample(frac=0.3) # 随机采样30%数据
import plotly.express as px
fig = px.scatter_mapbox(
df,
lat="latitude",
lon="longitude",
animation_frame="arrival_time",
color="route_id",
zoom=10
)
fig.update_layout(mapbox_style="carto-darkmatter")
fig.show()
# 数据加载
shanghai_routes = pd.read_csv('shanghai_bus.csv')
# 创建动画地图
m = folium.Map([31.23, 121.47], zoom_start=12)
# 添加时间轴控制器
TimestampedGeoJson(
process_data(shanghai_routes),
period='PT5M',
duration='PT1M'
).add_to(m)
# 保存交互式HTML
m.save('shanghai_bus_animation.html')
实时交通数据集成:
三维可视化:
import keplergl
map_3d = KeplerGl(height=600)
map_3d.add_data(data=df, name='bus_routes')
路径规划应用:
本文详细介绍了从数据准备到动态可视化的完整实现流程。关键点总结:
建议下一步尝试接入真实API数据,或结合客流分析开发更复杂的交通模拟系统。完整项目代码已托管在GitHub仓库。 “`
注:本文为示例文档,实际运行时需要根据具体数据调整参数。可视化效果在不同浏览器中可能有所差异,建议使用Chrome或Firefox最新版查看。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。