2

私はPythonを使用しています:

GPS ポイントの 2 つの配列があります - 経度と緯度 (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 より小さい場合は、最小距離を見つけて、経度、緯度を平均します。

  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

データ サイエンスの観点からすると、あなたがしていることは正しくありません。平均誤差距離をカットオフとして使用して、データがより正確になると考えることはできません。比較している 2 つのポイントの誤差は 15 m より大きくても小さくても、互いに近づいたり離れたりする可能性があります。また、別の正確なデータセットがない場合、何が正しいポイントかを知る方法はありません。このデータセットをこれ以上正確にすることはできません。

ただし、データセットをより正確にすることではなく、データセットを単純化することが目標だと思います。そのために、Douglas–Peucker アルゴリズムを使用できます。Postgis対応データベース (Postgresql + postgis)にデータをロードしてから、 simplify関数を使用することをお勧めします。これにはデータベースのセットアップ時間が必要ですが、大幅に高速化されます。ただし、純粋な python でそれが必要な場合は、この SOの質問に非常に優れたスニペットがあります。

ところで。緯度経度で距離計算を行っている場合は、ピタゴラスを使用しないでください。緯度、経度はユークリッドではないため、有効ではありません。haversineアルゴリズムを使用します。

于 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] を最後の適切な値に設定する場合は、前の 2 行の代わりに次のトリックを使用します。

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 に答える