Да, как упоминалось ранее, алгоритм Дугласа-Пекера - это простой способ упростить двухмерные соединенные пути. Но, как вы указали, вам нужно будет расширить его до трехмерного случая, чтобы правильно упростить трек GPS с присущим временным измерением, связанным с каждой точкой. Я сделал это для собственного веб-приложения, использующего реализацию Дугласа-Пукера на PHP.
Легко расширить алгоритм до трехмерного случая с небольшим пониманием того, как работает алгоритм. Допустим, у вас есть входной путь, состоящий из 26 точек, помеченных от A до Z. Простейшая версия этого пути имеет две точки, A и Z, поэтому мы начнем с них. Представьте отрезок линии между A и Z. Теперь просмотрите все оставшиеся точки с B по Y, чтобы найти точку, наиболее удаленную от отрезка AZ. Скажем, что самая дальняя точка - это J. Затем вы сканируете точки между B и I, чтобы найти самую дальнюю точку от отрезка AJ, и сканируете точки от K до Y, чтобы найти точку, наиболее удаленную от отрезка JZ, и так далее, до оставшихся точек все лежат в пределах некоторого желаемого порога расстояния.
Это потребует некоторых простых векторных операций. Логически, это тот же процесс в 3D, что и в 2D. Если вы найдете алгоритм Дугласа-Пекера, реализованный на вашем языке, возможно, в нем реализована некоторая двумерная векторная математика, и вам нужно будет расширить ее, чтобы использовать 3 измерения.
Вы можете найти реализацию 3D C ++ здесь: 3D Douglas-Peucker в C ++
Ваши координаты x и y, вероятно, будут в градусах широты / долготы, а координата z (времени) может быть в секундах с начала эпохи Unix. Вы можете устранить это несоответствие, выбрав соответствующие пространственно-временные отношения; Допустим, вы хотите просмотреть один день активности на карте площадью 1 квадратная миля. Представляя эти отношения как куб 1 миля на 1 милю на 1 день, вы должны предварительно масштабировать переменную времени. Преобразование из градусов в расстояние от поверхности нетривиально, но для этого случая мы упрощаем и говорим, что один градус составляет 60 миль; тогда одна миля составляет 0,0167 градусов. Один день составляет 86400 секунд; затем, чтобы сделать единицы эквивалентными, наш коэффициент предварительной шкалы для вашей метки времени составляет 0,0167 / 86400 или около 1/5 000 000.
Если, скажем, вы хотите просматривать активность GPS в одной и той же области карты площадью 1 кв. Милю в течение 2 дней, вместо этого разрешение по времени становится вдвое менее важным, поэтому уменьшите его вдвое, до 1/10 000 000. Веселитесь.