GPS データを記録するデバイスを持っています。読み取りは 2 ~ 10 秒ごとに行われます。2 時間かかるアクティビティの場合、多くの GPS ポイントがあります。
冗長なデータポイントを削除してデータセットを圧縮するアルゴリズムを知っている人はいますか? つまり、一連のデータ ポイントがすべて直線上にある場合は、開始点と終了点のみが必要です。
GPS データを記録するデバイスを持っています。読み取りは 2 ~ 10 秒ごとに行われます。2 時間かかるアクティビティの場合、多くの GPS ポイントがあります。
冗長なデータポイントを削除してデータセットを圧縮するアルゴリズムを知っている人はいますか? つまり、一連のデータ ポイントがすべて直線上にある場合は、開始点と終了点のみが必要です。
ポリゴンを単純化するために使用されるDouglasPeuckerアルゴリズムを確認してください。私はこれをうまく使用して、表示目的でクライアントに送信されるときのgpsウェイポイントの量を減らしました。
モバイルデバイスでのGPSデータの圧縮に関する研究論文があります。
さらに、 GPSアプリケーションの作成に関するこのCodeProjectの記事を見ることができます。あなたが抱える問題は、まっすぐな点ではなく、曲がった道路だと思います。それはすべて、あなたがあなたの道をどれだけ正確にしたいかに依存します。
パスx(t)、y(t)を多項式近似で近似することをお勧めします。このようなものをお探しですか:http ://www.youtube.com/watch?v = YtcZXlKbDJY ???
後続のポイント間の勾配の計算に基づいて非常に基本的な単純化を実行することにより、冗長なポイントを削除できます。
以下は、考えられるアルゴリズムを示す完全ではありませんが、C++ コードの一部です。
struct Point
{
double x;
double y;
};
double calculate_slope(Point const& p1, Point const& p2)
{
// dy y2 - y1
// m = ---- = ---------
// dx x2 - x1
return ((p2.y - p1.y) / (p2.x - p1.x));
}
// 1. Read first two points from GPS stream source
Point p0 = ... ;
Point p1 = ... ;
// 2. Accept p0 as it's first point
// 3. Calculate slope
double m0 = calculate_slope(p0, p1);
// 4. next point is now previous
p0 = p1;
// 5. Read another point
p1 = ... ;
double m1 = calculate_slope(p0, p1);
// 6. Eliminate Compare slopes
double const tolerance = 0.1; // choose your tolerance
double const diff = m0 - m1;
bool if (!((diff <= tolerance) && (diff >= -tolerance)))
{
// 7. Accept p0 and eliminate p1
m0 = m1;
}
// Repeat steps from 4 to 7 for the rest of points.
お役に立てば幸いです。
上記のコードには、不適切になる可能性のある問題がいくつかあります。
「同じ勾配」許容値は、角度ではなく勾配の差を測定するため、NNE から NNW は、NE から SE よりもはるかに大きな差と見なされます (y 軸が南北に走っていると仮定します)。
これに対処する 1 つの方法は、2 つのセグメントのドット積がそれらの長さの積とどのように比較されるかを許容誤差で測定することです。(2 つのベクトルの内積は、それらの長さとそれらの間の角度のコサインの積であることを覚えておくと理解に役立つかもしれません。) ただし、次の点を参照してください。
位置エラーではなく勾配エラーのみを考慮するため、長い ENE セグメントの後に長い ESE セグメントが続く場合、ENE と ESE が交互に繰り返される一連の短いセグメントと同じように、単一のセグメントに圧縮される可能性があります。
私が考えていたアプローチは、ベクター グラフィックス アプリケーションがカーソル座標のリストを一連の曲線に変換するために何をするかを調べることです。たとえば、lib2geom の bezier-utils.cpp を参照してください。(i) 方向ベースではなく、ほぼ完全に位置ベースであることに注意してください。(ii)ポリラインではなく3次ベジエ曲線を出力として提供しますが、同じアプローチを使用してポリライン出力を提供することもできます(その場合、ニュートン・ラフソンステップは本質的に単純な内積になります)。