У меня есть устройство, которое записывает данные GPS. Показания снимаются каждые 2-10 секунд. Для действия, занимающего 2 часа существует много точек GPS.
Делает любой знает об алгоритме для сжатия набора данных путем удаления избыточных точек данных. т.е. Если серия точек данных - все в прямой линии затем, только запуск и конечная точка требуются.
проверьте Алгоритм Дугласа Пикара , который используется для упрощения многоугольника. Я успешно использовал его для уменьшения количества gps-точек при передаче их клиентам для отображения.
Имеется исследовательская работа по Сжатию данных GPS на мобильных устройствах .
Кроме того, вы можете ознакомиться со статьей CodeProject о Запись приложений GPS . Я думаю, что проблема будет не в прямых точках, а в кривых дорогах. Все зависит от того, насколько точным вы хотите, чтобы ваш путь был.
.Вероятно, Вы хотите аппроксимировать свой путь 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.
Я надеюсь, что это поможет.