Python,numpy,scipy:如何从GPS坐标中排除位置误差?(平均lon,lat)

2024-04-23 19:38:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python:

我有2个GPS点阵列-lon和lat(超过50万个点)。在

我有一个日期时间数组。在

lon = numpy.array(lon)
lat = numpy.array(lat)
dt = numpy.array(dt)

我有一个位置错误(GPS传感器错误)。例如15米。在

^{pr2}$

我需要从坐标中排除GPS传感器错误,即轨道上没有星号。在

enter image description here

(我不画坐标相同的点)

enter image description here

我是怎么做到的?

现在:

  1. 我计算点之间的距离。

  2. 我找到最小距离,如果它小于GPS传感器误差,那么我平均lon,lat.

  3. 重复1。

  4. 重复2。

  5. 重复上述步骤,直到所有距离不再是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过滤器了,纽比?


Tags: numpy距离错误dt传感器minarraygps
2条回答

从数据科学的角度来看,你所做的是不正确的。你不能只使用平均误差距离作为一个截止点,认为你的数据会更正确。您正在比较的两个点的误差可能大于或小于15米,它们可以相互移动或彼此移动。如果你没有另一个精确的数据集,就无法判断什么是正确的。无法使此数据集更精确。在

不过,我认为您的目标是简化数据集,而不是使其更精确。为此,您可以使用Douglas–Peucker algorithm。 我建议您将数据加载到启用Postgis的数据库(Postgresql+postgis),然后使用simplify函数。这将需要一些数据库设置时间,但这将大大加快你的速度。不过,如果你想用纯python编写,那么question有一个非常好的片段。在

顺便说一句,如果你用lat计算距离,lon不要用毕达哥拉斯。它是无效的,因为lat,lon不是欧几里德式的。使用haversine算法。在

只使用numpy基元,不需要python循环,就可以轻松地完成所有计算。在

首先,将距离函数定义为对numpy数组进行操作的函数(我假设您已经这样做了):

def dist(lon1, lat1, lon2, lat2):
    """Compute the distance between (lon1, lat1) and (lon2, lat2). 
       Both may be numpy arrays."""
    ...

然后将其应用于您的数据:

^{pr2}$

这个符号表示您将比较ith点与i+1th。在

接下来找到d大于阈值的索引:

I = d > GPS_sensor_error

现在只保留这些和第一点!在

lon_out = numpy.hstack([[lon[0]], lon[1:][I]]) # could also use numpy.where
lat_out = numpy.hstack([[lat[0]], lat[1:][I]])

更新:

如果要保持相同的点数,即将lon[i]设置为最后一个有效值,请使用以下技巧,而不是前两行:

idx, = numpy.where(I)
idx = numpy.hstack([[0], idx])
J = numpy.cumsum(I) # the trick
lon_out = lon[idx[J]]
lat_out = lat[idx[J]]

相关问题 更多 >