Выкладываю на всеобщее обозрение скрипт роутинга маршрута до ближайшего полигона с подсчетом расстояния до него.
На хабре и других ресурсах не встретил вменяемого решения.
Основная «фишка» в алгоритме. После клика по некой точке вне полигона происходит следующее:
- Определяется индекс полигона, расстояние до которого минимально. (просто берём все вершины полигона и ищем расстояние от них до той точки, на которую кликнули. Ищем минимальное расстояние. Сравниваем с минимальными расстояниями других полигонов.)
- Определяем геометрический центр ближайшего полигона (к примеру, по оси X — это центр линии с вершинами самой левой и самой правой вершины полигона; аналогично — с осью Y)
- Строим маршрут от точки, куда кликнули до этого геометрического центра.
- Делим маршрут на отрезки и для каждого отрезка определяем — лежит ли он внутри полигона или нет
- Все отрезки, лежащие вне полигона — добавляем в некий массив отрезков, который и будет искомым маршрутом
- Находим тот отрезок, который пересекает наш полигон (перебираем каждую грань полигона и проверяем функцией пересечения отрезков с заранее известными координатами)
- Находим точку пересечения этого отрезка и полигона и её добавляем в искомый массив отрезков.
- Строим маршрут.