С несколькими допущениями:
- Ваш путь довольно плотный (если нет, вы можете интерполировать промежуточные точки)
- Ваш маршрут не перекрывает сам себя (скажем, не будет работать с повторяющимся круговым путем)
.. один грубый путь будет следующим:
Используя псевдокод Python'y, скажем, у вас есть маршрут, подобный следующему:
points = [LatLng(1, 1), LatLng(2, 2), LatLng(3, 3), LatLng(4, 4)]
Вы рисуете это как PolyLine как обычно.
Тогда, учитывая ваше текущее положение, вы найдете ближайшую точку на маршруте:
cur_pos = LatLng(3.1, 3.0123)
nearest_latlng = closest_point(points, to = cur_pos)
Тогда nearest_latlng
будет содержать LatLng(3, 3)
Найдите nearest_latlng
в списке, затем просто нарисуйте вторую полилинию до этой точки. Другими словами, вы усекаете список points
на текущем LatLng:
progress_points = [LatLng(1, 1), LatLng(2, 2), LatLng(3, 3)]
.. затем нарисуйте это на карте
Как уже упоминалось, это прервется, если путь вернется к себе (closest_point
найдет только первую или последнюю точку)
Если вы знаете, как далеко пройдено, существует расширение epoly , которое дает несколько методов, которые можно использовать, в основном:
.GetIndexAtDistance(metres)
Returns the vertex number at or after the specified distance along the path.
Этот индекс можно использовать вместо closest_point
, рассчитанного выше