前前言最近在上海出差,有对数据挖掘和机器学习的实践感兴趣,想要面基的小伙伴可以联系我。

联系方式在 Resume 里面,也可以看一下我的介绍,到时候咱们可以面基面的更有针对性。

困死了,实在写不下去了,前两节定的内容公式太多,打的我脑壳子痛,急需一份睡眠来缓解一下……

前言

GPS数据是很重要的用户数据,但同时其处理也是特别困难的,在信号不好的时候容易产生噪声,很多时候用户的行为本身也自带噪声(相对于描述用户的模型来说)。GPS数据是分布在球面上的一组数据(如果忽略海拔和地球的偏心率),而从我实际的工作中来看,能直接使用的代码也是特别的少。

GPS数据处理的好,是能挖出金矿的,本文力求从工程实践的角度出发来写GPS数据的处理,在公式的推导上也力求眼睛。

我以Java为语言(因为我司业务系统用Java,我只能用JVM系的语言,否则妥妥C+Python),力求清楚的描述清楚GPS数据处理常用的算法和原理。

目前代码零零碎碎的都写完了,但是还没有好好的整理,我会在一个月内整理成一个完整的库,手册的话看情况写~

目录GPS数据简述GPS数据的采集

GPS数据的一般记录格式

球面上的测地线测地线的长度求取

点到测地线的最短测地线

困死爹了,实在写不下去了,以下内容作为下卷出现吧!GPS序列操作GPS序列的清洗

GPS轨迹长度求和

GPS序列的压缩

Geo Hash 计算概述简单的GeoHash模型

高精度GeoHash模型

GPS数据简述

GPS数据的采集

GPS数据主要由GPS模块采集,一般的GPS模块通过串口通信来报告自己的方位,一般都是遵循NMEA-0183协议的,这个协议可以百度到。 我们一般通过软件Filter(我还没见过哪家MCU支持这个协议的,是我孤陋寡闻了)配合模块自带的Filter功能来采集有效的GPS信息(也包括UTC时间的信息),也可以通过串口设置采集频率和设置过滤器,各家有所不同,需要仔细阅读文档。 下图是一个随便走淘宝上找的GPS模块。

关于GPS的信号采集代码,我提供一份我写的STM32F407上的版本: gps.c

这里就不赘述了,这个不是重点。

GPS数据的一般记录格式

在这里我们不关心方向,速度,海拔,我们手动忽略这些东西,我们关心的其实是经度和纬度,一般的,我们使用负数表示南纬和西经。 经纬度的定义如下图所示

0度经线在格林尼治(领先就有定义的权利啊……)

球面上的测地线

在曲面上连接两点的最短路径我们称之为测地线,因为我们生活在一个球上,所以这个测地线还是比较好求的。

测地线的长度求取

本节的代码主要在类:GeometryPoint.java 里面可以找到。 仅仅通过经纬度来计算测地线长度是可以的,但是推导会麻烦一点,我们首先将球面坐标系(经纬度)映射到欧氏坐标:

然后根据求出的

求内积,最后得到这样的公式:

我们稍微合并一下同类项,做出来的代码是这样的:

/**** @param point1* @param point2* @return 3D-vector inner product of two normlized vectors*/

public double getInnerProduct(GeometryPoint point1, GeometryPoint point2){

return Math.sin(point1.latitude *DEG2RAD)*Math.sin(point2.latitude *DEG2RAD)+

Math.cos(point1.latitude *DEG2RAD)*Math.cos(point2.latitude *DEG2RAD)*

Math.cos(point1.longitude *DEG2RAD-point2.longitude *DEG2RAD);

}

求出了内积,求弧度并且计算出测地距离就是顺理成章的事情:

private double geodesicDistance(GeometryPoint point1, GeometryPoint point2){

double alpha = getInnerProduct(point1,point2);

if (alpha>=1.0D){

return 0.0D;

}else if (alpha<=-1.0D){

return Math.PI*EARTH_RADIUS;

}else{

return Math.acos(alpha)*EARTH_RADIUS;

}

}

点到测地线的最短距离

这部分没整理好,暂时不开源,会在一个月内整理到工程中 在此之前,我们先考虑一下我们如何描述一条测地线? 球面上任意不同两点可以指定唯一一条测地线,其次,测地线上取3个不同点,所组成的平面一定过圆心(想一下球面上测地线的定义,这里就不赘述了,如果这里描述有误请指出)。

我们怎么描述呢?如果只用两点描述,求点到测地线的关系就难求,我们最好求测地线所在平面的法向量。 展开一下法向量其实就是:

关于求外积的代码,我是使用行列式生成的结果做的:

public static double[] outerProduct3(double[] v1, double[] v2) {

assert (v1.length == 3);

assert (v2.length == 3);

double[] returnValue = {

v1[1] * v2[2] - v1[2] * v2[1],

-v1[0] * v2[2] + v1[2] * v2[0],

+v1[0] * v2[1] - v1[1] * v2[0]

};

return returnValue;

}

这么写比较快,关于推导,我肯定不会用纸啦~Matlab大法好:

syms i j k x1 x2 x3 y1 y2 y3

z = det([i j k;x1 x2 x3;y1 y2 y3])

% 输出

z = i*x2*y3 - i*x3*y2 - j*x1*y3 + j*x3*y1 + k*x1*y2 - k*x2*y1

随后是求取法向量和球面上一点(目标向量v3)的夹角我们就可以间接得到平面和目标向量的夹角了~(用90°减一下就好)

(就这张图是自己画的,请叫我灵魂手绘师)

求完以后我们发现一个问题,有可能我们绘制的点到某个圆上的测地线并不落在v1和v2之间的测地线上,这个时候,如果我们尝试用v1,v2和n作为一组新的基去表征v3,如果描述v1和v2的两个量里有一个是负数,就说明落在外面了。这个是线性代数的基础,在此不赘述了。 那么如何用v1,v2和n作为一组新的基去表征v3呢? 如果我们有

我们也能列出下面这个鬼:

这个时候不妨设矩阵:

那么:

求逆矩阵的函数:

/*** @param x 3×3 Matrix* @return inv(x)->3×3 Matrix*/

public static double[][] invO3(double[][] x) {

assert (x.length == 3);

double[][] returnValue = {

{

x[1][1] * x[2][2] - x[1][2] * x[2][1],

x[0][2] * x[2][1] - x[0][1] * x[2][2],

x[0][1] * x[1][2] - x[0][2] * x[1][1]

},

{

x[1][2] * x[2][0] - x[1][0] * x[2][2],

x[0][0] * x[2][2] - x[0][2] * x[2][0],

x[0][2] * x[1][0] - x[0][0] * x[1][2]

},

{

x[1][0] * x[2][1] - x[1][1] * x[2][0],

x[0][1] * x[2][0] - x[0][0] * x[2][1],

x[0][0] * x[1][1] - x[0][1] * x[1][0]

},

};

double factor = x[0][0] * x[1][1] * x[2][2]

- x[0][0] * x[1][2] * x[2][1]

- x[0][1] * x[1][0] * x[2][2]

+ x[0][1] * x[1][2] * x[2][0]

+ x[0][2] * x[1][0] * x[2][1]

- x[0][2] * x[1][1] * x[2][0];

for (double[] array : returnValue) {

assert (array.length == 3);

array[0] = array[0] / factor;

array[1] = array[1] / factor;

array[2] = array[2] / factor;

}

return returnValue;

}这样写快滴恨(手动陕西话)

不要BLAS

用Matlab配合正则之类的很轻松就生成代码了,你以为是我手写的么(手动抠鼻)

还有优化的余地

记得处理AssertionError

最后我们看一下关于测地线的类的一些业务代码: 1、在初始化的时候就求好逆矩阵,以后计算快得很。

private GeometryPoint point1;

private GeometryPoint point2;

private double[][] iM;

private double[] n;

public GeodesicLine(GeometryPoint p1, GeometryPoint p2) {

point1 = p1;

point2 = p2;

double[] v1 = point1.get3DPos();

double[] v2 = point2.get3DPos();

n = outerProduct(v1, v2);

norm2Vector(1.0, n);

double[][] M = {v1, v2, n};

iM = invO3(M);

}

2、先判断是否在范围内,如果不在范围内用端点的距离最小值作为到测地线段的距离:

public double distance(GeometryPoint point) {

double[] v3 = point.get3DPos();

double[] params = {0, 0, 0};

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 3; j++) {

params[j] += iM[i][j] * v3[j];

}

}

if (params[0] > 0 && params[1] > 0) {

//返回和n的内积的角度的余角计算出的数值 return Math.asin(

n[0] * v3[0] + n[1] * v3[1] + n[2] * v3[2]

) * GeometryPoint.EARTH_RADIUS;

} else {

//两个端点中选一个近的 return Math.min(point.distance(point1), point.distance(point2));

}

}

这样,我们就求出了点到测地线的距离。

python gps数据处理_GPS数据处理简述(上)相关推荐

  1. python数据处理pdf_Python数据处理pdf (中文版带书签)、原书代码、数据集

    原博文 2018-08-08 16:02 − Python数据处理 前言 xiii第1 章 Python 简介 11.1 为什么选择Python 41.2 开始使用Python 41.2.1 Pyth ...

  2. 基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用实践技术

    查看原文>>>基于Python长时间序列遥感数据处理及在全球变化.物候提取.植被变绿与固碳分析.生物量估算与趋势分析等领域中的应用实践 目录 专题一.长时序遥感产品在全球变化/植被变 ...

  3. python空间数据处理_基于Python语言的空间数据处理

    龙源期刊网 http://www.doczj.com/doc/7b0e0476172ded630a1cb662.html 基于Python语言的空间数据处理 作者:何丽娴甘淑陈应跃 来源:<价值 ...

  4. 长时间序列遥感数据植被物候提取/遥感数据产品分析暨MODIS NDVILAI多年产品数据批处理分析/Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

    基于MATLAB长时间序列遥感数据植被物候提取与分析 1.本课程基于matlab语言 2.提供所有代码 3.以实践案例为课程内容主线,原理与操作相结合 4.根据讲解内容,布置作业,巩固所学内容及拓展在 ...

  5. sql和python的区别_数据处理简单对比:Excel,SQL,Python

    前言 无论是什么工具,做数据分析的时候一定会涉及到两类工作: 合并多个关联表 做数据透视表 这篇文章简单对比一下Excel.SQL和Python在这两类任务上的实现过程,从而对比其异同. 用到的数据表 ...

  6. 零基础学python免费网课-零基础学Python量化投资,超值线上课程反复回看

    原标题:零基础学Python量化投资,超值线上课程反复回看 超值网络课程 量化投资是一种严谨.系统化的投资方式,相比起传统投资,量化投资风险低回报高,但是它要求投资者使用数据处理分析.计算机编程技术. ...

  7. python线上课程-零基础学Python量化投资,超值线上课程反复回看

    原标题:零基础学Python量化投资,超值线上课程反复回看 超值网络课程 量化投资是一种严谨.系统化的投资方式,相比起传统投资,量化投资风险低回报高,但是它要求投资者使用数据处理分析.计算机编程技术. ...

  8. Python教学 | Python 中的循环结构(上)【附本文代码和数据】

    查看原文:[数据seminar]Python教学 | Python 中的循环结构(上)[附本文代码和数据] (qq.com) Part1引言 上期文章我们向大家介绍了 Python 程序控制结构中的分 ...

  9. Python 机器学习实战 —— 无监督学习(上)

    ​​​ 前言 在上篇<Python 机器学习实战 -- 监督学习>介绍了 支持向量机.k近邻.朴素贝叶斯分类 .决策树.决策树集成等多种模型,这篇文章将为大家介绍一下无监督学习的使用. 无 ...

最新文章

  1. JavaScript深入之变量对象
  2. [翻译] DTCoreText 从HTML文档中创建富文本
  3. graphicsmagick 获取图片质量_第 72 期 水稻图片素材
  4. Python主要智能优化算法库汇总
  5. 李宏毅线性代数笔记6:矩阵的计算
  6. Knative Serverless 之道:如何 0 运维、低成本实现应用托管?
  7. python35是什么意思_python -m是什么意思CentOS 升级 Python3 (附带: 一键升级脚本)...
  8. Knockoutjs 实践入门 (2) 绑定事件
  9. python的类是什么意思_Python 各种下划线都是啥意思_、_xx、xx_、__xx、__xx__、_classname_...
  10. 新年元旦海报设计模板|具有浓厚中国风味的画面
  11. 机器视觉——棱镜的妙用
  12. K-Fold Cross Validation
  13. 七月算法机器学习4 凸优化初步
  14. 修改服务器cimc地址,【交换机在江湖】实战案例十三 HUAWEI S系列交换机802.1x特性对接H厂商IMC服务器配置指导...
  15. 去掉 新版GeForce Experience 桌面录制视频时的 右上角图标
  16. 常见的输入、输出、存储设备
  17. php版工行聚合支付和e支付
  18. Datawhale--组队学习第12期--python爬虫基础学习---task0/task1环境配置和网页请求基础
  19. 什么是动态规划?动态规划的意义是什么?
  20. 传输层 --- 面向连接的传输TCP

热门文章

  1. 亏大了!一男子薅羊毛 13 万被判 3 年
  2. RTMP局域网直播环境搭建(ffmpeg+crtmpserver+xampp+jwplayer7)
  3. nat123访问者怎样用
  4. 大规模数据集的读存技巧
  5. 特征选择:11 种特征选择策略总结
  6. C++实现机房预约系统
  7. linux 下 PHP安装扩展
  8. java播放ape音频,Java使用Jaudiotagger读取Mp3及Flac音频操作
  9. 西门子1214C系列PLC如何连接松下A6伺服驱动器?
  10. sonoff开关改装件控制(1)