Python 检测定位数据中的GPS峰值

Python 检测定位数据中的GPS峰值,python,gps,Python,Gps,我有一个来自谷歌账户GPS日志的数据集,我想从中删除CSV中明显不存在的异常值 例如,GPS显示您位于1,1>1,2>9,6>1,2>1,1,因此位置发生了重大变化,几秒钟后又回到了几秒钟前的位置 我已经尝试过通过GPS的速度进行过滤,但这可能会删除飞行时产生的GPS点。当GPS正常时,这也不起作用,然后稍晚更新,到达500公里以外,在那里停留10分钟,然后自我校正,因为移动速度将足够低,可以通过“速度测试” 我如何在大约430k行的数据集中检测这些数据?类似于乘坐GPS更新频率非常低的飞机旅行

我有一个来自谷歌账户GPS日志的数据集,我想从中删除CSV中明显不存在的异常值


例如,GPS显示您位于
1,1>1,2>9,6>1,2>1,1
,因此位置发生了重大变化,几秒钟后又回到了几秒钟前的位置

我已经尝试过通过GPS的速度进行过滤,但这可能会删除飞行时产生的GPS点。当GPS正常时,这也不起作用,然后稍晚更新,到达500公里以外,在那里停留10分钟,然后自我校正,因为移动速度将足够低,可以通过“速度测试”


我如何在大约430k行的数据集中检测这些数据?类似于乘坐GPS更新频率非常低的飞机旅行的事情也必须考虑。

我已经决定采用混合解决方案

  • 速度限制:我使用geopy模块的距离功能,计算出两个gps点之间的距离。根据csv的时间戳和距离,我计算了这些点之间的速度,如果速度超过某个阈值(可根据需要进行调整),则不会将该点写入输出csv
代码

来自geopy导入距离的

d1=距离。距离(坐标1,坐标2)
d1=浮点数(str(d1)[:-3])*1000#换算为米
FMT=“%Y-%m-%d%H:%m:%S”#格式化使其与CSV匹配
时间=(datetime.strtime(cur_line[“Time”],FMT)-datetime.strtime(pre_line[“Time”],
FMT)。总秒数()
速度=d1/次
如果速度<800:#根据您的需要设置此值
#做事
  • 余弦定律:计算3个点之间的角度,如果角度太窄,则删除该点
代码:

来自geopy导入距离的

从trianglesolver导入求解
从数学进口学位
d1=距离。距离(坐标1,坐标2)
d2=距离。距离(坐标2,坐标3)
d3=距离。距离(坐标3,坐标1)
d1=浮动(str(d1)[:-3])*1000
d2=浮动(str(d2)[:-3])*1000
d3=浮点数(str(d3)[:-3])*1000
degTresh=30.0
如果d1>0.01和d2>0.01和d3>0.01:#如果它们为0,则会出现错误
a、 b,c,a,b,c=求解(a=d1,b=d2,c=d3)#从侧面计算角度
A、 B,C=学位(A),学位(B),学位(C)#转换为数学学位
如果(360.0-degTresh)

这两种方法结合在一起效果相当好,大多数情况下,当站着不动时,甚至可以去除小的GPS尖峰。

我可能误解了,但您是否有明确的说明,说明什么可以识别异常值?是基于位置、速度和时间吗?你是通过主要的变化来识别它们的吗?例如,GPS显示你在1,1>1,2>2,6>1,2>1,1,所以位置上有一个主要的变化,几点之后就变成了第二个答案——是的,这看起来不错,但除了另一个程序的插件外,没有真正的代码可供选择。但我会研究一下余弦定律,试着用头脑去思考它,如果这对我有用的话
from geopy import distance
d1 = distance.distance(coords_1, coords_2)
d1 = float(str(d1)[:-3])*1000 # Convert to meters

FMT = "%Y-%m-%d %H:%M:%S" #Formatting so it matches CSV
Time = (datetime.strptime(cur_line["Time"], FMT) - datetime.strptime(pre_line["Time"], 
FMT)).total_seconds()
Velocity = d1 / Time
if Velocity < 800: # Set this to your needs
    # DO Stuff
from geopy import distance
from trianglesolver import solve
from math import degrees
d1 = distance.distance(coords_1, coords_2)
d2 = distance.distance(coords_2, coords_3)
d3 = distance.distance(coords_3, coords_1)
d1 = float(str(d1)[:-3])*1000
d2 = float(str(d2)[:-3])*1000
d3 = float(str(d3)[:-3])*1000

degTresh = 30.0
if d1 > 0.01 and d2 > 0.01 and d3 > 0.01: # if they are 0, there will be an error
    a,b,c,A,B,C = solve(a=d1, b=d2, c=d3) # Calculate the angles from the sides
    A,B,C = degrees(A), degrees(B), degrees(C) # Convert to math.degrees
    if (360.0 - degTresh) < C or C < degTresh:
        spike= True
    else:
        spike = False