Сжатие точек GPS

У меня есть устройство, которое записывает данные GPS. Показания снимаются каждые 2-10 секунд. Для действия, занимающего 2 часа существует много точек GPS.

Делает любой знает об алгоритме для сжатия набора данных путем удаления избыточных точек данных. т.е. Если серия точек данных - все в прямой линии затем, только запуск и конечная точка требуются.

5
задан BENBUN Coder 29 December 2009 в 15:36
поделиться

4 ответа

проверьте Алгоритм Дугласа Пикара , который используется для упрощения многоугольника. Я успешно использовал его для уменьшения количества gps-точек при передаче их клиентам для отображения.

6
ответ дан 14 December 2019 в 01:09
поделиться

Имеется исследовательская работа по Сжатию данных GPS на мобильных устройствах .

Кроме того, вы можете ознакомиться со статьей CodeProject о Запись приложений GPS . Я думаю, что проблема будет не в прямых точках, а в кривых дорогах. Все зависит от того, насколько точным вы хотите, чтобы ваш путь был.

.
1
ответ дан 14 December 2019 в 01:09
поделиться

Вероятно, Вы хотите аппроксимировать свой путь x(t), y(t) полиномиальным приближением. Вы ищете что-то подобное: http://www.youtube.com/watch?v=YtcZXlKbDJY ???

1
ответ дан 14 December 2019 в 01:09
поделиться

Вы можете удалить избыточные точки, выполнив очень базовое упрощение на основе расчета наклона между последующими точками.

Вот немного, но не полный 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.

Я надеюсь, что это поможет.

1
ответ дан 14 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: