Определение прямолинейного перемещения по средствам анализа гексагонов H3
Есть задача, нужно среди передаваемых GPS координат определять прямолинейное движение (без какой либо привязки к дорогам, водоемам и т.п.). Полученные GPS координаты я преобразовал в H3 гексагоны (уровень значения не имеет, можно использовать любой, главное, точность попытаться улучшить). В итоге есть такая идея - взять начальную точку (начальный гекс) и смотреть следующий гекс (по передаваемому timestampу), а потом дальше по цепочке. На выходе, должна быть найдена максимальная ПРЯМАЯ длина гексов по перемещениям. Соответственно, нужно как то понимать, что следующей гекс лежит с определенного угла предыдущего гекса. Возникли следующие вопросы:
- у каждого гекса есть уникальный хеш, можно ли как то обращаться к соседнему гексу? У каждого гекса 6 ребер, если провести аналогию с часами, то самая верхняя часть гекса = 1, а дальше по часовой стрелке до 6. Берем гекс, запоминаем его хеш, смотрим следующий, если следующий гекс лежит с любого угла и ГРАНИЧИТ с предыдущим, то каким-либо образом помещаем это, дальше смотрим следующий гекс, если он лежит с того же угла, что и предыдущий, то запоминаем это и идем дальше. Если дальше следующий гекс не граничит с предыдущим, либо граничит но другой стороной, то будем считать, что направление движения поменялось. В итоге выводим начальную точку, конечную точку и продолжительность (кол-во уникальных гексов) которые представляю из тебя прямую линию (в любом направлении).
- можно попробовать смотреть через уровень соседей (только не знаю как). Например, первоначальная точка, это цент, дальше ищем соседей которые лежат через один уровень и определяем направляем, дальше смотрим еще через один уровень и так дальше.
Для примера, вывел схему. Зеленым отмечены точки разбитые по гексам, и направление движение. По текущей логике, нужно вывести цифру 5 (как длительность непрерывных и прямолинейных связки гексов), а так же хеш гекса (помечен как начало максимального непрерывного движение) и хеш конца. Синим цветом выделил второй трек, который должен вывести 2 и хеши двух соответствующих гекосов.
Написать все это нужно на pyspark/sql/или на python