我使用Python:
我有2个GPS点阵列-lon和lat(超过50万个点)。在
我有一个日期时间数组。在
lon = numpy.array(lon)
lat = numpy.array(lat)
dt = numpy.array(dt)
我有一个位置错误(GPS传感器错误)。例如15米。在
^{pr2}$我需要从坐标中排除GPS传感器错误,即轨道上没有星号。在
(我不画坐标相同的点)
我是怎么做到的?
现在:
我计算点之间的距离。
我找到最小距离,如果它小于GPS传感器误差,那么我平均lon,lat.
重复1。
重复2。
重复上述步骤,直到所有距离不再是GPS传感器错误
更新:
lon = numpy.array()
lat = numpy.array()
flag = True
while flag:
lon1 = lon[:-1]
lon2 = lon[1:]
lat1 = lat[:-1]
lat2 = lat[1:]
'''distance'''
x = (lon2 - lon1)
y = (lat2 - lat1)
d = numpy.sqrt(x * x + y * y)
min = numpy.min(d)
if min < GPS_sensor_error:
j = numpy.where(d == min)[0][0]
lon[j] = (lon[j] + lon[j + 1]) / 2
lat[j] = (lat[j] + lat[j + 1]) / 2
lon = numpy.delete(lon, j + 1)
lat = numpy.delete(lat, j + 1)
else:
flag = False
绕过所有点在纯python上工作很长时间。。。 请提示,如何使用scipy、numpy实现?
谢谢
p.s.可能已经有GPS过滤器了,纽比?
从数据科学的角度来看,你所做的是不正确的。你不能只使用平均误差距离作为一个截止点,认为你的数据会更正确。您正在比较的两个点的误差可能大于或小于15米,它们可以相互移动或彼此移动。如果你没有另一个精确的数据集,就无法判断什么是正确的。无法使此数据集更精确。在
不过,我认为您的目标是简化数据集,而不是使其更精确。为此,您可以使用Douglas–Peucker algorithm。 我建议您将数据加载到启用Postgis的数据库(Postgresql+postgis),然后使用simplify函数。这将需要一些数据库设置时间,但这将大大加快你的速度。不过,如果你想用纯python编写,那么question有一个非常好的片段。在
顺便说一句,如果你用lat计算距离,lon不要用毕达哥拉斯。它是无效的,因为lat,lon不是欧几里德式的。使用haversine算法。在
只使用numpy基元,不需要python循环,就可以轻松地完成所有计算。在
首先,将距离函数定义为对numpy数组进行操作的函数(我假设您已经这样做了):
然后将其应用于您的数据:
^{pr2}$这个符号表示您将比较ith点与i+1th。在
接下来找到d大于阈值的索引:
现在只保留这些和第一点!在
更新:
如果要保持相同的点数,即将lon[i]设置为最后一个有效值,请使用以下技巧,而不是前两行:
相关问题 更多 >
编程相关推荐