海量数据读取与可视化分析--1

 

  • 实验环境搭建
    1. 数据库平台搭建

本实验运用了mysql8.0数据库,从官网下载msi安装包进行安装,安装过程中可自定义安装路径和设置登录名称及密码,本文实验的登录名称和密码分别为:root、225859.安装完成后,打开命令行并输入密码后就能进入数据库操作命令行,界面如下,说明已经安装成功。

由于mysql数据库界面的不清爽友好,因此需要下载Navicat的第三方连接工具与mysql进行连接。然后新建数据库cardb,并在该数据库下新建数据表carpos,最后在carpos中新建字段,由于提供的数据样例中共有9个字段,但是没有可作为主键的字段,是因为这些字段值并没有是唯一不重复的项。因此需要额外添加一个no的字段,用来标记数据记录序号。各个字段设计如下:

    1. 编辑编译环境搭建

本实验用到的python版本为2.7,为了方便各种三方库的加载和使用,利用了aconada2的集成环境。虽然python编辑器有很多,但这里推荐使用vscode。Vscode是微软推出的插件式软件开发平台,能够进行c++、java和python及前端等开发,特别是对于python语言,具有代码提示,自动缩进和版本切换快捷等优势。在此实验中需要用到txt,html和python多种文件类型,在同一编辑器中打开有利于修改和查看。本实验需要用到的文件如下:

    1. 百度地图API的申请

为了更加直观可视化显示对海量数据的操作结果,本实验利用百度地图的API的批量地址逆解析,海量数据点标注及单路径多途径点规划三个功能,需要申请百度开放平台的AK密钥。笔者申请到的密钥如图所示:

百度地图API浏览器端的使用很方便快捷,打开网址http://lbsyun.baidu.com/jsdemo.htm#g0_1后,找到对应功能并理解原有js代码的基础上对其进行修改。在本实验中需要在js中读取本地txt文件,并将txt文件中存放的数据记录添加到地图点实例中,然后修改相关函数即可。值得注意的是,打开txt文件的操作需要IE内核的支持,因此需要浏览器的兼容模式,在此处应用了360极速浏览器作为网页打开工具。效果图如下:

  • 实验数据导入

Navicat自带了txt文件导入的功能,但是gps1.txt文件中的字段不包含主键,不利于后期的查询操作,并且导入也相当费时。因此编写了python脚本wb.py和mysql_operator.py。前者逐行读取txt文本内容,获取各个字段数值,获取字段时需要将各个字段值提取到字段变量中。其命令如下:

并且新增no的int型字段,后者利用pymysql库初始了数据库连接参数并封装了数据库连接,命令执行,及数据库关闭的方法。导入命令如下:

随后等待一段时间后,打开Navicat,刷新后会发现记录数量不断增长,说明程序执行成功。程序中添加有计时器,全部导入完毕后输出所用的时间。结果如下:

  • 实验运行

实验运行的核心程序文件是geo_pro.py.与之配套的有数据库连接与命令执行文件mysql_operator.py文件,查找结果存储txt文件即po_par.txt、po_pla.txt、po_rou.txt,可视化展示html文件即position_parse.html、position_spread.html、position_trace.html文件。其实现的功能有:

  1. 批量地址逆解析
  2. 某一时刻车辆位置的分布
  3. 单条车辆踪迹绘制

分别对应着三个txt文件与html文件。其对应关系图如下

在Vscode中执行主程序文件后,首先根据数据库连接初始参数进行连接,然后根据提示选择对应的功能项。主程序列举出三个功能项,下面介绍每一个功能项的具体操作与实现。

    Function1.此功能用于批量地址逆解析,即是将经纬度解析成(区、县、街道)的形式。百度地图API的样例中提供了地址逆解析的功能展示。需要输入要解析的记录的No范围,即上界和下界。然后执行SQL语句如下:

执行成功后获取查找记录,然后将记录添加到po_par.txt文件中,注意插入时需要将其拼接成以‘,’隔开的字符串,同时注意换行符的添加。记录写入成功后自动弹出浏览器界面,注意js中的读文件操作需要IE内核的支持,因此需要以浏览器兼容模式运行。即使在兼容模式下,浏览器也会提示是否允许浏览器之外的操作,点击允许并确定后,position_parse.html中的js标签内会读取po_par.txt文件中的记录如下:

然后会根据经度纬度生成Bmap.Point实例,并添加到要逆解析和标注的列表中。如此便能实现地址的逆解析和可视化。

Function2.此功能用于时域上的车辆分布情况的统计。需要按提示输入年月日时分秒,并且用逗号隔开的形式。在python2.x版本中,通过input函数输入的逗号隔开字符会将其视为元组,但在python3.x中会将输入整体看成一个字符串。注意到不同后,就将输入的日期拆解,然后将长度为1的字符前缀0,然后再拼接到SQL语句中。执行的SQL语句如下:

语句运行后的流程一如Function1.此处不再赘余。不同的是记录写入到po_pla.txt,然后被position_spread.html读。

Function3.此功能是在地域上对一个车辆路径的追踪并显示。因此只需要输入要查询轨迹的车辆ID,并将数据进行降序排列,执行的SQL语句如下:

值得注意的是,百度地图API中关于途径点的数量有上限限制,即最多不能超过30个。但是获取的记录数远不止这么多,因此折衷获得相对精确,对记录数按照固定跳数进行取样,直到取满25个点位置,并且起点和终点都固定为记录的第一条和最后一条。

四、实验结果

接下来对各个功能的运行结果进行展示,只列举出重要步骤。

Function1:批量地址逆解析

  1. 运行geo_pro.py程序
  2. 功能序号输入1,然后输入下界与上界

  1. 自动弹开position_parse网页

  1. 查看po_par.txt中存储的查找记录

Function2.同一时间车辆位置显示

  1. 运行geo_pro.py
  2. 输入功能序号:2和逗号隔开的时间

  1. 自动弹开网页position_spread.

  1. 打开po_pla.txt文件,观察记录

Function3.单条车辆踪迹绘制

  1. 运行geo_pro.py
  2. 输入功能序号:3和要跟踪的车辆ID

  1. 自动弹开position_trace网页

  1. 打开po_rou.txt文件

    • 结论

以上成果均为亲身实践,查阅众多资料所得,期间遇到众多bug也都一一解决。通过这个项目的练习能切实的提升编程能力和学习能力,在将自己想法付诸实施的过程中,按照思路循序渐进的展开,无疑也会收获颇多。希望在以后的研究生生活中多接手项目,锻炼自己。最后由于源码众多,就不粘贴于附录,会将其放在我的CSDN博客(ID:菜地里翻滚的猪)上供交流学习。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值