检测位置数据中的 GPS 峰值

Detect GPS spikes in location data

我的 Google 帐户的 GPS 日志中有一个数据集,我想从中删除 CSV 中显然不应该存在的异常值。

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

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

我如何在大约 43 万行的数据集中检测到这些?像在飞机上旅行时 GPS 更新很少的情况也必须得到照顾。

我选择了混合解决方案。

  • 速度限制: 我使用geopy模块的distance函数来计算两个gps点之间的距离。从 csv 的时间戳和距离我然后计算这些点之间的速度,如果它超过可以根据您的需要调整的某个阈值,它不会将该点写入输出 CSV

代码

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
  • 余弦定律:计算3个点之间的角度,如果角度太窄,去掉​​这个点

代码:

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

这两种方法结合起来效果相当好,大多数时候甚至可以消除静止不动时的小 GPS 尖峰。