【数据处理】 python 基于Basemap地理信息可视化

数据

  在某些建模比赛中,经常碰见一些地理信息的数据,它们大多都是车辆在驾驶过程中随时间产生的经纬度序列,并伴随着车辆的各种参数。由于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地理信息可视化 等着你。

发布了22 篇原创文章 · 获赞 6 · 访问量 4145

猜你喜欢

转载自blog.csdn.net/qq_34862636/article/details/101602504