На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Поиск минимального пути

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 След.
RSS
Поиск минимального пути
 
Цитата
Александр Махин написал:
Здравствуйте, Ирина!
Вся суть в том, что я должен кликнуть на любое место на карте и получить ближайший узел к этой точке.

Вот я написал код (пишу на C#)
var ax1 = xx;
var ay1 = yy;
MapObj.St yle = TxObjectStyle.OS_NORMAL;
var tdp1 = new TxDoublePoint {X = ax1, Y = ay1};
MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp1);
MapObj.St yle = TxObjectStyle.OS_SELECT;
MapObj.Center();
MapObj.ShowDialogInfo(1);
MapNet1.GetEdgesFromNode(MapObj.ObjHandle, 2000);

Но я не получаю этот узел т.е. нет выделения этого ближайшего узла.((

А нет посмотрев netapi ни чего не понял и нет в C# таких функций.
Моя задача заключается в следующем я выбираю из списков населенных пунктов пункт отправки (точка А) и пункт назначения (точка Б).
Далее программно ищу ближайшие узлы к этим пунктам и выделяю построенный маршрут.
Но у меня ни чего не получается API не то, можете мне помочь именно кодом на C#.
Заранее благодарю!!
 
Функции построения маршрута на  C#  начинаются с GetShotWay...
 
Я сделал так как Вы посоветовали и вот какой у меня получился код

if (RoadObj.Checked) //Добавить координаты по щелчку мыши
           {
               if (Point_A1 <= 0 && Point_B1 <= 0)
               {
                   Point_A1 = xx;
                   Point_B1 = yy; return;
               }
               if (Point_A2 <= 0 && Point_B2 <= 0)
               {
                   Point_A2 = xx;
                   Point_B2 = yy;
               }
               if (Point_A1 <= 0 | Point_B1 <= 0 | Point_A2 <= 0 | Point_B2 <= 0) return;
               
                   MapNet1.OpenGraph(MapView.MapHandle, MapNet1.NetSitHandle);
                   TxTASKPARM parm;
                   parm.Language = 2;

                   double ax1 = Point_A1;
                   double ay1 = Point_B1;
                   var tdp1 = new TxDoublePoint { X = ax1, Y = ay1 };
               MapView.ConvertMetric(ref Point_A1, ref Point_B1, TxPPLACE.PP_GEO, TxPPLACE.PP_PICTURE);
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp1);

                   var ax2 = Point_A2;
                   var ay2 = Point_B2;
                   var tdp2 = new TxDoublePoint { X = ax2, Y = ay2 };
               MapView.ConvertMetric(ref Point_A2, ref Point_B2, TxPPLACE.PP_GEO, TxPPLACE.PP_PICTURE);
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp2);
                   
                   MapNet1.GetShotWay(MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp1), MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp2));
                   MapNet1.BuildNet(true);
               MapObj.St yle = TxObjectStyle.OS_SELECT;
               RoadObj.Checked = false;
               
           }

Но после чего происходит изменение цветов всех дуг и весь граф охватывает сплошная рамка (на скринах)
Что я делаю не так и что нужно изменить?? Уже 8 день не получается(((
1_2.PNG (77.62 КБ)
1_1.PNG (105.95 КБ)
 
Не нужно делать MapNet1.BuildNet(true);
Функция BuildNet строит граф по  объектам.
У Вас граф уже есть.
Нужно его открыть MapNet1.OpenGraph.
Выбрать две точки (или узла) MapNet1.GetNodeByPoint.
Построить маршрут MapNet1.GetShotWay.
Получить и записать результат в HOBJ.
Выделить результат на карте.
 
Описание функций  http://gistoolkit.ru/download/doc/gtk12.pdf#page=133&zoom=100,0,570
 
Здравствуйте, Ирина! Я переписал код, но ни чего не происходит, посмотрите пожайлуста, что делаю не так?? (  пошел 9-ый день мучений)))!!!!  )


private void Road_ItemClick(object sender, ItemClickEventArgs e)
       {
           MapNet1.OpenGraph(MapView.MapHandle, MapNet1.NetSitHandle);

           using (var f = new F_RoadEdit())
           {
               if (f.ShowDialog() != DialogResult.OK) return;

               MapView.ConvertMetric(ref f._out.Breadth, ref f._out.Longitud, TxPPLACE.PP_GEO, TxPPLACE.PP_PLANE);
               var tdp1 = new TxDoublePoint { X = f._out.Breadth, Y = f._out.Longitud };
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp1);

               MapView.ConvertMetric(ref f._in.Breadth, ref f._in.Longitud, TxPPLACE.PP_GEO, TxPPLACE.PP_PLANE);
               var tdp2 = new TxDoublePoint { X = f._in.Breadth, Y = f._in.Longitud };
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp2);

               MapNet1.GetShotWay(MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp1), MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp2));

               MapObj.CreateObject(MapNet1.NetSitHandle, (int)TxMetricType.IDDOUBLE2, true, 1, 448020010, (int)TxObjectLocal.OL_LINE);
           }
      }

У меня есть пару вопросов:
1. Я получаю координаты в таком виде (Х - 42.6987894, Y - 51.6321569) надо ли их ковертировать в метры или радианы?
2. Правильно ли я использую функции?
3. Как создать объект и выделить его не могу понять?
 
Добрый день!
1.Координаты должны быть в метрах.
2. Вместо MapNet1.GetShotWay нужно воспользоваться функцией TMapNet. GetShotWayByPointAndCreateObject
либо TMapNet. GetShotWayByPointExAndCreateObject, предварительно создав объект для результата Info: HOBJ с помощью функции  MapObj.CreateObject

Описание функций:
TMapNet. GetShotWayByPointAndCreateObject
function GetShotWayByPointAndCreateObject(Info: HOBJ; var PointStart,PointFinish: TDOUBLEPOINT):
integer;
Метод определяет оптимальный путь между указанными точками. Граф сети предварительно должен
быть открыт функцией OpenGraph(). Параметр Info - идентификатор объекта в памяти, предварительно
созданного функцией mapCreateObject() или mapCreateSiteObject(), в котором будет размещен результат -
минимальный путь. PointStart,PointFinish - начальная и конечная точки в метрах на местности.
При ошибке возвращает ноль.

TMapNet. GetShotWayByPointExAndCreateObject
function TMapNet.GetShotWayByPointExAndCreateObject(Info: HOBJ; var PointStart,PointFinish:
TDOUBLEPOINT; select:HSelect): integer;
Метод определяет оптимальный путь между указанными точками. Граф сети предварительно должен
быть открыт функцией OpenGraph(). Параметр Info - идентификатор объекта в памяти, предварительно
созданного функцией mapCreateObject() или mapCreateSiteObject(), в котором будет размещен результат -
минимальный путь. PointStart,PointFinish - начальная и конечная точки в метрах на местности, select -
контекст условий поиска (должен содержать ребра, которые исключаются из поиска минимального пути).
При ошибке возвращает ноль.

3. Выделить объект можно средствами TMapSelect.
 
Ирина, я попробывал сделать так как Вы сказали

MapNet1.OpenGraph(MapView.MapHandle, MapNet1.NetSitHandle);
Point_A1 = 54.056281;
Point_B1 = 69.1576267;
MapView.ConvertMetric(ref Point_A1, ref Point_B1, TxPPLACE.PP_GEO, TxPPLACE.PP_PLANE);
MapObj.CreateObject(0, (int)TxMetricType.IDFLOAT2, false, 1, 0, (int)TxObjectLocal.OL_MARK);   /// в этой строчке я правильно передаю параметры???

Но в MapNet1.GetShotWayByPointAndCreateObject() нужно передать info и он имеет тип integer, а MapObj.CreateObject  записать в переменную с типом integer либо преобразовать ее не получается.

И вообще я правильно данный код написал))???
И еще такой вопрос, что я должен передать в PointStart и PointFinish - начальная и конечная точки в метрах на местности??? Откуда они берутся???
 
И еще я попробывал вот так сделать:

if (RoadObj.Checked) //Добавить координаты по щелчку мыши
           {
               MapNet1.OpenGraph(MapView.MapHandle, MapNet1.NetSitHandle);

               Point_A1 = 55.5890164;
               Point_B1 = 47.2097598;
               Point_A2 = 54.2906647;
               Point_B2 = 48.2439578;

               MapView.ConvertMetric(ref Point_A1, ref Point_B1, TxPPLACE.PP_GEO, TxPPLACE.PP_PLANE);
               MapView.ConvertMetric(ref Point_A2, ref Point_B2, TxPPLACE.PP_GEO, TxPPLACE.PP_PLANE);
               int r = MapObj.CreateObjectByExcode(1, (int)TxMetricType.IDFLOAT2, 5559, (int)TxObjectLocal.OL_MARK);

               var tdp1 = new TxDoublePoint { X = Point_A1, Y = Point_B1 };
               var tdp2 = new TxDoublePoint { X = Point_A2, Y = Point_B2 };
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp1);
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp2);

               MapNet1.GetShotWayByPointAndCreateObject(r, ref tdp1,  ref tdp2);
               MapNet1.SelectColor = Color.Red;
           }
 
Цитата
Александр Махин написал:
И еще я попробывал вот так сделать:

if (RoadObj.Checked) //Добавить координаты по щелчку мыши
           {
               MapNet1.OpenGraph(MapView.MapHandle, MapNet1.NetSitHandle);

               Point_A1 = 55.5890164;
               Point_B1 = 47.2097598;
               Point_A2 = 54.2906647;
               Point_B2 = 48.2439578;

               MapView.ConvertMetric(ref Point_A1, ref Point_B1, TxPPLACE.PP_GEO, TxPPLACE.PP_PLANE);
               MapView.ConvertMetric(ref Point_A2, ref Point_B2, TxPPLACE.PP_GEO, TxPPLACE.PP_PLANE);
               int r = MapObj.CreateObjectByExcode(1, (int)TxMetricType.IDFLOAT2, 5559, (int)TxObjectLocal.OL_MARK);

               var tdp1 = new TxDoublePoint { X = Point_A1, Y = Point_B1 };
               var tdp2 = new TxDoublePoint { X = Point_A2, Y = Point_B2 };
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp1);
               MapNet1.GetNodeByPoint(MapObj.ObjHandle, ref tdp2);

               MapNet1.GetShotWayByPointAndCreateObject(r, ref tdp1,  ref tdp2);
               MapNet1.SelectColor = Color.Red;
           }
Но все равно нет результата и выделения маршрута(((
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности