Как разделить массив координат маршрута на равные части расстояния? - PullRequest
0 голосов
/ 04 января 2019

Я работаю с Google Maps API в приложении для iOS.У меня есть маршрут между точкой A и точкой B. Этот маршрут закодирован в строку, которую я декодировал в массив координат, из которого фактически создается маршрут.

И теперь проблема возникаетМне нужно разделить этот маршрут некоторым способом, который позволит мне получить координаты точек, которые удалены друг от друга на заданное расстояние, скажем, 20 километров.Я знаю, что точки не выглядят равномерно на расстоянии, поэтому это должно быть +/- 20 км, зависит от того, насколько плотно точки находятся на участке дороги.Например:

let decodedPolylinePoints = 
[(22.3456, 23.3232), (32.3232, 32.3332), (33.4555,34.466), ….]

И после вычислений в результате получается массив, в котором следующие элементы имеют +/- 20 км друг от друга.

Есть идеи?Я внедряю приложение Swift, но язык свободен в выборе.Все дело в алгоритме.

маршрут со всеми маркерами координат

экран маршрута с увеличенными точками

1 Ответ

0 голосов
/ 04 января 2019

Предполагая, что вы хотите, чтобы сумма расстояний между точками была одинаковой:

Преобразование массива кортежей в массив CLLocation объектов.

Сопоставление массиваCLLocation возражает против массива структур, где каждая структура содержит начальную и конечную точку пары точек (AB, BC, CD, DE и т. Д.) И рассчитанное расстояние между этими точками (с использованием метода CLLocation distance(from:).)что Segment.

Определите тип PolyLine, который является массивом Segment объектов.

Теперь определите тип, который имеет массив типов PolyLine s.(Вызовите массив Polyline sa Route.

Создание пустой переменной Route (trip). (var trip = Route()) Создание пустого PolyLine var currentPolyLine. (var currentPolyLine = Polyline()).)

Теперь переберите большой исходный массив сегментов. Если сумма расстояний в текущей полилинии плюс новый сегмент ≤ вашего желаемого порога, добавьте сегмент к currentPolyLine. Еслиновый сегмент сделает текущую PolyLine слишком длинной, добавит currentPolyLine к маршруту, очистит currentPolyLine и заменит его новым сегментом. Когда у вас заканчивается Segment s, добавьте последний оставшийся PolyLine к Route.

Это должно дать вам массив PolyLines, которые ≤ вашего желаемого расстояния. Последняя PolyLine может быть короче всех остальных.

Если вы хотите принять PolyLines, это может бытьнемного длиннее или немного короче желаемого расстояния, оно становится более сложным.

Если предположить, что ваши Segment достаточно короткие, а желаемое расстояние PolyLine достаточно велико, вы должны получить PolyLine s.которые abиз той же длины.Когда ваша самая длинная длина Segment становится ближе к вашей PolyLine длине, изменение длины PolyLine будет увеличиваться.

...