轨迹OD可视化
针对轨迹的起点和终点区域进行可视化
可视化效果
可视化代码
{hide}
import numpy as np
import pandas as pd
from keplergl import KeplerGl
# 读取CSV文件
OD = pd.read_csv("data/OD.csv")
shiqu = pd.read_csv("data/gz_lon_lat.csv")
# 合并数据,获取源位置的经度和纬度
OD = OD.merge(shiqu[['省份城市', '经度', '纬度']], left_on='start_area', right_on='省份城市', how='left')
OD.rename(columns={'经度': 'o_lon', '纬度': 'o_lat'}, inplace=True)
# 去除不需要的列
temp = OD.drop(columns="省份城市")
# 合并数据,获取目标位置的经度和纬度
temp = temp.merge(shiqu[['省份城市', '经度', '纬度']], left_on='end_area', right_on='省份城市', how='left')
temp.rename(columns={'经度': 'd_lon', '纬度': 'd_lat'}, inplace=True)
temp = temp.drop(columns="省份城市")
temp.to_csv("temp/OD_lon_lat.csv")
# 准备数据
data = {
'source_lat': temp["o_lat"].tolist(), # 源位置的纬度
'source_lng': temp["o_lon"].tolist(), # 源位置的经度
'target_lat': temp["d_lat"].tolist(), # 目标位置的纬度
'target_lng': temp["d_lon"].tolist(), # 目标位置的经度
'flow': temp["nums"].tolist() # 流量值
}
# 计算中心经度和纬度
# center_lon = np.mean(np.concatenate((temp["o_lon"].tolist(), temp["d_lon"].tolist())))
# center_lat = np.mean(np.concatenate((temp["o_lat"].tolist(), temp["d_lat"].tolist())))
center_lon = np.mean((temp["o_lon"].tolist()))
center_lat = np.mean((temp["o_lat"].tolist()))
# 转换为 pandas DataFrame
df = pd.DataFrame(data)
# 配置地图
config = {
"version": "v1",
"config": {
"visState": {
"layers": [
{
"type": "arc",
"config": {
"dataId": "Flow Data",
"label": "Arc Layer",
"color": [255, 153, 31],
"highlightColor": [252, 242, 26, 255],
"columns": {
"lat0": "source_lat", # 源纬度
"lng0": "source_lng", # 源经度
"lat1": "target_lat", # 目标纬度
"lng1": "target_lng" # 目标经度
},
"isVisible": True,
"visConfig": {
"opacity": 0.8,
"thickness": 5, # 设置默认线的粗细
"thicknessField": {"name": "flow", "scale": "flow", "type": "real"}, # 使用 flow 字段调整粗细
"thicknessScale": "linear", # 使用线性比例调整粗细
"colorRange": {
"name": "Global Warming",
"type": "sequential",
"category": "Uber",
"colors": ["#5A1846", "#900C3F", "#C70039", "#FF5733", "#FFC300"]
},
"sizeRange": [5, 120], # 控制线的粗细范围
"targetColor": [149,12,105], # 目标点颜色(绿色)
"sourceColor": [228,155,0] # 源点颜色(红色)
}
}
}
]
},
"mapState": {
"bearing": 0,
"latitude": center_lat,
"longitude": center_lon,
"pitch": 45,
"zoom": 9
}
}
}
# 创建 KeplerGl 对象并加载配置
map_1 = KeplerGl(config=config)
map_1.add_data(data=df, name="Flow Data")
# 显示地图
map_1.save_to_html(file_name='temp/gz_flow_map.html')
{/hide}