2

我使用 Python:

我有 2 个 GPS 点阵列 - 经度和纬度(超过 500 000 个点)。

我有 1 个日期时间数组。

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

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

GPS_sensor_error = 0.015    

我需要从轨道上没有星号的坐标中排除 GPS_sensor_error。

在此处输入图像描述

(我不画一个坐标相同的点)

在此处输入图像描述

我怎么能做到?

现在:

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

  2. 我找到最小距离,如果它小于 GPS_sensor_error,那么我平均 lon,lat。

  3. 重复 1。

  4. 重复2。

  5. 重复直到所有距离都不再是 GPS_sensor_error

更新:

     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实现它?


谢谢

Ps可能已经在scipy,numpy中有一个GPS过滤器?

4

2 回答 2

5

从数据科学的角度来看,您所做的事情是不正确的。您不能只使用平均误差距离作为截止值,并认为您的数据会更正确。您正在比较的两个点的误差可能大于或小于 15 m,它们可以彼此靠近或远离彼此。而且,如果您没有另一个确切的数据集,则无法判断正确的点。您无法使此数据集更加精确。

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

顺便提一句。如果您使用 lat,lon 进行距离计算,请不要使用毕达哥拉斯。这是无效的,因为 lat,lon 不是欧几里得。使用哈希算法。

于 2013-01-10T15:08:22.330 回答
2

您可以仅使用 numpy 原语轻松完成所有计算,而无需使用 python 循环。

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

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

然后将其应用于您的数据,如下所示:

d = dist(lon[:-1], lat[:-1], lon[1:], lat[1:])

这种表示法意味着您会将第 i点与第 i+1点进行比较。

接下来找到 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]]
于 2013-01-10T08:13:02.573 回答