数据
在某些建模比赛中,经常碰见一些地理信息的数据,它们大多都是车辆在驾驶过程中随时间产生的经纬度序列,并伴随着车辆的各种参数。由于GPS信号并不是一直都很好(如过隧道或偏远地区),无论建模的问题是安全驾驶、驾驶工况或频繁路径挖掘等,都绕不过数据预处理,而地理信息可视化可以较为直观地帮助发现问题和评估效果。
下面以一辆车地行驶数据为例,对其行驶轨迹进行可视化处理。数据和代码下载可见我的Github。数据表头如下表所示:
序号 | 指标名称 | 指标说明 | 说明 |
---|---|---|---|
1 | vehicleplatenumber | 车牌号码 | |
2 | device_num | 设备号 | |
3 | direction_angle | 方向角 | 范围:0-359(从定位点的正北方向起,顺时针方向至行驶方向间的水平夹角) |
4 | lng | 经度 | 东经 |
5 | lat | 纬度 | 北纬 |
6 | acc_state | ACC 状态 | 点火 1/熄火 0 |
7 | right_turn_signals | 右转向灯 | 灭 0/开 1 |
8 | left_turn_signals | 左转向灯 | 灭 0/开 1 |
9 | hand_brake | 手刹 | 灭 0/开 1 |
10 | foot_brake | 脚刹 | 无 0/有 1 |
11 | location_time | 采集时间 | |
12 | gps_speed | GPS 速度 | 单位:km/h |
13 | mileage | GPS 里程 | 单位:km |
可视化方法——Basemap
本文共总结两种地理信息可视化,第一篇介绍Basemap的可视化方法,个人认为当前的Basemap手册上手不是很快,具体应用的时候还是要啥搜啥,感兴趣的可以先看下这位仁兄的Basemap手册翻译版本。
很多注释在代码里都写了,这里就不赘述了,就说明一下,由于是国内的数据,所以为了将省的轮廓显示出来,需要下载CHN_adm_shp包,同样在Github里也有。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import pandas as pd
#-----底图绘制
matplotlib.rcParams['toolbar'] = 'None'
fig = plt.figure(figsize=(12, 12), edgecolor='w')
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
##中国地图
#m = Basemap(projection='lcc',
# llcrnrlon=80.33,
# llcrnrlat=3.01,
# urcrnrlon=138.16,
# urcrnrlat=56.123,
# resolution='h',
# lat_0 = 42.5,
# lon_0=120,
# ax=ax1,
# area_thresh=10000)
#江西地图
m = Basemap(projection='merc', #投影方式
llcrnrlon=113.5,#起始经度 113.5
llcrnrlat=24.5, #起始纬度 24.5
urcrnrlon=117.5, #终止经度117.5
urcrnrlat=30.05,#终止纬度30.05
resolution='h',#设置边界的详细程度,h是高
lat_0 = 28.68,
lon_0=115.89,
ax=ax1,
area_thresh=10000)
island_col = '#FFDEAD' #陆地颜色
lake_col = '#87CEFA' #湖水颜色
line_col = 'purple' #轨迹颜色
m.fillcontinents(color = island_col,lake_color = lake_col)
m.drawstates() # 绘制州
m.drawcoastlines() # 绘制海岸线
m.drawcountries() # 绘制国家
m.drawparallels(np.arange(24,31,1),labels=[1,1,0,1])
# 画出纬线, 在北纬10度到90度区间内以20度为单位, 纬度标记在图形左右和下测
m.drawmeridians(np.arange(112,120,1),labels=[1,1,0,1])
# 画出经线, 从西经180度到东经180度区间内以30度为单位, 经度标记在图形左右和下测
shp_info = m.readshapefile("./CHN_adm_shp/CHN_adm1",'states',drawbounds=True) # CHN_adm1的数据是中国各省区域
#-----数据读取
posi = pd.read_csv('driving_data.csv',header = 0)
num = len(posi)
lng = posi["lng"].values # 获取经度值
lat = posi["lat"].values # 获取纬度值
x,y = m(lng,lat)
#-----轨迹绘制
#散点
m.scatter(x, y, s=1, c='r', alpha=0.7, zorder=10)
#连线
#m.plot(x,y,marker=None,color = line_col,linewidth = 1)
效果
先看散点图,1)散点图的点设置的点很小,但绘制出来看上去很大,可以推断这辆车是反复行驶于某一路径。2) 某些点看上去间距较大,显得“不连续”,推断这可能是数据收集中断了一段时间,或者是GPS发生了偏移。
再看连线图,可以很明显地看出数据质量非常差,偏移经常发生,如这种横着或者竖着一大段的,都可以推断出是GPS信号偏移严重。
数据质量是可视化的前提,所以可视化要好看,预处理得费一定功夫。不过就目前而言,本人发现的Basemap最小显示单位是省,所以Basemap适合于宏观上的分析,运行速度比较快。想要更细节的地理可视化怎么办?不会调地图API怎么办?还有一款姊妹篇 python 基于Folium地理信息可视化 等着你。