Track Analise
Скачать
Страница с обработанными треками
Программа на PHP (для инициализации через web-запрос, но можно изменить и под скрипт) анализирующая трек GPX.
Задачи разделения трека:
- Убирает из трека время инициализации GPS и то время, при котором автомобиль стоит в начале трека.
- Убирает из трека то время, при котором автомобиль стоит или паркуется, а также кружится в поисках места для парковки, в конце трека.
- Убирает из трека путь, который прошли пешком до и от машины.
- Разбивает трек на сегменты, которые значительно отличаются по скорости выявляя пробки и скоростные участки.
- Cегменты, на которые разбивается трек, не должны быть слишком короткие и учитывать светофоры, обгон и временные затруднения.
Для реализации этих задач были выявлены слеудующие условия, которым должен удовлетворять полученный трек:
- Скорость удаления от начальной точки полученного трека до любой точки первого километра фактического пути не должна быть меньше 0.8 м/c (2.88 км/ч).
- То же, что и предыдущее, только для приближения к концу полученного пути.
Для выполнения этих условий сдвигаются точки начала и конца трека, но не более чем на километр. Скорость удаления и приближения считается по расстоянию между точками, а не по дистанции. Это позволит в начале пути удалить точки инициализации GPS, а в конце - поиск места для парковки.
Допускается, что 2.88 км/ч - скорость раздела движения автомобиля и человека. Первый километр вводится для того, чтобы в случае начальной пробки или объезда чего-либо не потерять больше километра пути - допускается, что его можно пройти пешком.
- Каждый сегмент должен быть не менее, чем два километра.
- Средняя скорость первых двух километров сегмента должна отличаться как минимум в два раза от средней скорости предыдущего сегмента или на 8 м/c (28.8 км/ч).
Через два километра, согласно предыдущему условию, можно поставить разделитель сегментов. В этом случае средняя скорость сегментов будет отличаться в два раза, но это может противоречить условию по отношению к следующему сегменту. Следовательно, в продолжении сегмента его средняя скорость может приближаться к предыдущему. Так как трафик сегмента формирует скорость (которую нам и нужно выявить), то можно допустить, что средняя скорость сегмента не сильно отличается от точечной. Это позволяет предположить, что средняя скорость полученных сегментов, может не в два раза, но будет значительно отличаться. В любом случае точка разделения сегментов будет разделять два участка трека по крайней мере в два километра отличающихся по скорости как минимум в два раза или примерно на 30 км/ч.
- Сохраняется как можно больше фактического трека при соблюдении вышеперечисленных условий.
- После разбиения трека на сегменты нельзя добавить точку разделения, удовлетворяющую вышеперечисленным условиям.
Последние два условия чисто комбинаторные, так как трек, состоящий из одного сегмента без первого и последнего километра, будет удовлетворять всем предыдущим условиям. Для того, чтобы задача имела смысл, и введены эти два условия.
Реализация:
Для реализации задачи используется встроенный в PHP xml_parser. Дистанция между соседними точками считается, как "радиус земли" (6372795 м), умноженный на угловую разницу, которая в свою очередь считается по формуле
Возникающая погрешность при таких расчетах вполне приемлимая для данной задачи. Данная функция, а также другие необходимые функции хранятся в файле tfunc.inc.
На этапе формирование новой точки отбрасываются те, которые имеют погрешность по горизонтали или вертикали больше трех (hdop или vdop > 3). Каждая точка, в зависимости от условий, записывается сразу в файл к текщему сегменту или в буфер (переменная $seg), создавая предполагаемый новый сегмент. Соответственно, сегмент разделяется на записаную часть, по которой считается дистанция и время, и буферную часть, по которой считаются
координаты начала и конца, время начала и дистанция.
Весь путь делиться на 4 части, обозначающихся флагом $flag. В начале трека $flag=begin,
собирающий начальные теги GPX. Далее по порядку (для краткости отличающиеся сегменты по средней скорости в два раза или на 8 м/с будем называть просто "отличающиеся по скорости"):
- $flag = start. На первом километре фактического трека считается скорость
удаление от предполагаемой точки старта трека до текущей. Если она
не больше 0.8 м/с, то отбрасываются все предыдущие точки и текущая точка
становиться предполагаемой точкой начала. После первого километра незаписанная
часть сегмента записывается и флаг принимает значение
- $flag = run. Для того, чтобы первый сегмент был не менее двух километров,
записывается все точки до второго километра трека.
- $flag = track. Если скорости записаной (которая всегда не
меньше двух километров) и незаписанной частей сегмента
не отличаются, то записывается незаписанная часть сегмента.
Иначе продолжается незаписанная часть до двух километров.
Если незаписаная часть сегмента перевалила за два километра
и скорость на ней все еще отличается от записаной, то незаписаная часть
становиться началом нового сегмента и записывается.
После анализа первых трех частей может остаться незаписанная часть последнего сегмента меньше двух километров, но отличающаяся от записанной части по скорости. В этом случае буфер переворачивается и парсится с
- $flag = finish. Тоже, что и при start, но с учетом того, что время "движется назад". Точки, удаленные от фактического конца пути более, чем на километр прибавляются к буферу безусловно.
Далее полученный буфер переворачивается и прибавляется к последнему сегменту.
|