Добрый день.
Задача не такая простая, как кажется на первый взгляд.
Для поиска маршрута нет готовых инструментов в MapInfo. Для решения поставленной задачи Вам потребуется построение топологической модели дорожной сети по графическим объектам карты в виде графа. Затем уже по графу, используя любой алгоритм поиска кратчайшего пути между вершинами, например Дейкстры, найти маршрут.
"Грабли", обычно встречаются при построении топологической модели дорожной сети по самой карте, если изначально она (карта) не предназначалась для решения подобных задач. Т.е. не были соблюдены определенные топологические правила при отрисовке. Самая распространенная ошибка - несовмещение конечных узлов сегментов, наличие пересечений сегментов без формирования узла в точке пересечения.
Для обеспечения достаточного быстродействия и получения ожидаемых результатов рекомендуется действовать следующим образом:
1. Подготовка картографических данных. Создание объектов карты с соблюдением правил топологии. Делается вручную оператором.
2. Проверка картографических данных на соблюдение правил топологии. Выявление ошибок автоматически при помощи инструментария. Исправление ошибок вручную оператором. Повторение п.2 до тех пор, пока не будут устранены все ошибки топологии.
3. Поиск и построение маршрутов для решения поставленной задачи.
Приведу основное правило топологии, которое необходимо соблюдать при создании карты.
Сегменты дорог должны обрываться при пересечении с другими дорогами и продолжаться с полным совпадением координат конечного и начального узла (от перекрестка до перекрестка отдельные сегменты).
При поиске маршрута "на лету" можно каждый раз строить модель по дорожной сети, либо один раз сделать модель и использовать ее при поиске маршрутов. При изменении карты перестраивать модель.
Что представляет собой модель? Это взвешенный граф, (в случае наложения ограничений таких как односторонние улицы - ориентированный взвешенный граф). Для построения простого взвешенного графа делаем следующее (не претендую на самый оптимальный алгоритм):
1. Из всех линий, обозначающих дороги, считываем координаты конечных узлов в массив. Также сохраняем идентификатор линии (ссылку на объект карты).
2. Делаем сортировку узлов в массиве по координатам. Узлы, принадлежащие различным сегметам, образующим прекресток выстраиваются вместе.
3. Проходим по массиву и в случае обнаружения 2-х и более точек с одинаковыми координатами заносим данные о сегментах в матрицу отношений (способ описания графа).
Как осуществляем поиск маршрута.
1. Пользователь указывет начало и конец маршрута.
2. Поиск ближайшего сегмента дороги к указанной точке начала маршрута.
3. Поиск ближайшего сегмента дороги к указанной точке окончания маршрута.
4. Поиск кратчайшего пути в графе между указанными вершинами по модели (в случае, если начало и окончание маршрута лежит не на конечном узле сегмента учесть это при расчете расстояния).
5. По списку вершин, вошедших в маршрут, осуществить подстветку на карте сегментов дорожной сети с соответствющими идентификаторами (они были сохранены при чтении данных).
Удачи...
Сообщение отредактировал swatch: 15.02.2010, 11:14:57