Google Maps - ищется алгоритм обхода ремонтных участков дорог
Задача: необходимо проложить маршрут, который обходит участки с ремонтом дорог.
С помощью полилиний на карту наносятся участки с ремонтом дорог. Вот так: ![]() Прокладываем путь (синяя линия), например, Москва — Ижевск. Дальше — проверяем, пересекает ли наш путь ремонтные участки. Если пересекает, то ищем обходной путь. Главный вопрос — как его искать. Имеются массивы точек (широта и долгота) каждого ремонтного участка (по которым строились полилинии), также имеется массив "прямого" пути, необходимо найти "обходной" путь. Было решено делать так: у каждого пересекаемого ремонтного участка берем начало и конец, прокладываем между ними прямую, берем середину и делаем перпендикуляр от этой середины. Начинаем с длины перпендикуляра = 5 км. Т.е. примерно так: ![]() Google Maps работает по следующему принципу. Если передать 3 точки: начало (Москва), транзитную точку и конец (Ижевск), то Google Maps строит маршрут проходящий через транзитную точку. Если возле транзитной точки нет близлежащей дороги, то Google Maps "возвращает" на "прямой" путь. Итак, берем шаг=5 км. — см. на рисунке точку A, делаем запрос к Google Maps и передавая 3 точки (начало, транзит, конец) и получаем массив точек "обхода". Проверяем, если возвращенный путь пересекает ремонтируемый участок, то увеличиваем в цикле длину перпендикуляра (см. рисунок) с шагом=5 км. до точки B, C, D, E и т.д. В каждой итерации делаем проверку на предмет пересечения с ремонтным участком, до тех пор пока "обходной" путь не перестанет пересекать ремонтный участок. Проблема №1: ![]() Крюк образуется слишком большой. В данной случае ремонтный участок 60 км., такая же ситуация если ремонтный участок 1-2 км. Неужели нет варианта объезда ближе к ремонтному участку? Проблема №2: ![]() Петля образуется в результате того, что при откладывании перпендикуляра Google Maps ищет ближайшую дорогу и "стремится" попасть в транзитную точку (см. картинку №2 точки A,B,C,D,E). Как убрать эту петлю? Приветствуются любые замечания по алгоритму поиска обходного пути. Заранее благодарен. |
Часовой пояс GMT +3, время: 21:30. |