главная страница
программы
 tvix wallpaper maker
 track analyse
плугины к
 mobilebalance
 mediamonkey
материалы
устройства
умный дом

Track Analise
Скачать
Страница с обработанными треками

Программа на PHP (для инициализации через web-запрос, но можно изменить и под скрипт) анализирующая трек GPX.

Задачи разделения трека:

  1. Убирает из трека время инициализации GPS и то время, при котором автомобиль стоит в начале трека.
  2. Убирает из трека то время, при котором автомобиль стоит или паркуется, а также кружится в поисках места для парковки, в конце трека.
  3. Убирает из трека путь, который прошли пешком до и от машины.
  4. Разбивает трек на сегменты, которые значительно отличаются по скорости выявляя пробки и скоростные участки.
  5. Cегменты, на которые разбивается трек, не должны быть слишком короткие и учитывать светофоры, обгон и временные затруднения.

Для реализации этих задач были выявлены слеудующие условия, которым должен удовлетворять полученный трек:

  1. Скорость удаления от начальной точки полученного трека до любой точки первого километра фактического пути не должна быть меньше 0.8 м/c (2.88 км/ч).
  2. То же, что и предыдущее, только для приближения к концу полученного пути.

    Для выполнения этих условий сдвигаются точки начала и конца трека, но не более чем на километр. Скорость удаления и приближения считается по расстоянию между точками, а не по дистанции. Это позволит в начале пути удалить точки инициализации GPS, а в конце - поиск места для парковки. Допускается, что 2.88 км/ч - скорость раздела движения автомобиля и человека. Первый километр вводится для того, чтобы в случае начальной пробки или объезда чего-либо не потерять больше километра пути - допускается, что его можно пройти пешком.

  3. Каждый сегмент должен быть не менее, чем два километра.
  4. Средняя скорость первых двух километров сегмента должна отличаться как минимум в два раза от средней скорости предыдущего сегмента или на 8 м/c (28.8 км/ч).

    Через два километра, согласно предыдущему условию, можно поставить разделитель сегментов. В этом случае средняя скорость сегментов будет отличаться в два раза, но это может противоречить условию по отношению к следующему сегменту. Следовательно, в продолжении сегмента его средняя скорость может приближаться к предыдущему. Так как трафик сегмента формирует скорость (которую нам и нужно выявить), то можно допустить, что средняя скорость сегмента не сильно отличается от точечной. Это позволяет предположить, что средняя скорость полученных сегментов, может не в два раза, но будет значительно отличаться. В любом случае точка разделения сегментов будет разделять два участка трека по крайней мере в два километра отличающихся по скорости как минимум в два раза или примерно на 30 км/ч.

  5. Сохраняется как можно больше фактического трека при соблюдении вышеперечисленных условий.
  6. После разбиения трека на сегменты нельзя добавить точку разделения, удовлетворяющую вышеперечисленным условиям.

    Последние два условия чисто комбинаторные, так как трек, состоящий из одного сегмента без первого и последнего километра, будет удовлетворять всем предыдущим условиям. Для того, чтобы задача имела смысл, и введены эти два условия.

Реализация:

Для реализации задачи используется встроенный в PHP xml_parser. Дистанция между соседними точками считается, как "радиус земли" (6372795 м), умноженный на угловую разницу, которая в свою очередь считается по формуле

Возникающая погрешность при таких расчетах вполне приемлимая для данной задачи. Данная функция, а также другие необходимые функции хранятся в файле tfunc.inc.

На этапе формирование новой точки отбрасываются те, которые имеют погрешность по горизонтали или вертикали больше трех (hdop или vdop > 3). Каждая точка, в зависимости от условий, записывается сразу в файл к текщему сегменту или в буфер (переменная $seg), создавая предполагаемый новый сегмент. Соответственно, сегмент разделяется на записаную часть, по которой считается дистанция и время, и буферную часть, по которой считаются координаты начала и конца, время начала и дистанция.

Весь путь делиться на 4 части, обозначающихся флагом $flag. В начале трека $flag=begin, собирающий начальные теги GPX. Далее по порядку (для краткости отличающиеся сегменты по средней скорости в два раза или на 8 м/с будем называть просто "отличающиеся по скорости"):

  1. $flag = start. На первом километре фактического трека считается скорость удаление от предполагаемой точки старта трека до текущей. Если она не больше 0.8 м/с, то отбрасываются все предыдущие точки и текущая точка становиться предполагаемой точкой начала. После первого километра незаписанная часть сегмента записывается и флаг принимает значение
  2. $flag = run. Для того, чтобы первый сегмент был не менее двух километров, записывается все точки до второго километра трека.
  3. $flag = track. Если скорости записаной (которая всегда не меньше двух километров) и незаписанной частей сегмента не отличаются, то записывается незаписанная часть сегмента. Иначе продолжается незаписанная часть до двух километров. Если незаписаная часть сегмента перевалила за два километра и скорость на ней все еще отличается от записаной, то незаписаная часть становиться началом нового сегмента и записывается.

    После анализа первых трех частей может остаться незаписанная часть последнего сегмента меньше двух километров, но отличающаяся от записанной части по скорости. В этом случае буфер переворачивается и парсится с

  4. $flag = finish. Тоже, что и при start, но с учетом того, что время "движется назад". Точки, удаленные от фактического конца пути более, чем на километр прибавляются к буферу безусловно.

    Далее полученный буфер переворачивается и прибавляется к последнему сегменту.