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

Оптимальные компоненты и методы для решения задачи

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Оптимальные компоненты и методы для решения задачи, Оптимальные компоненты и методы для решения задачи
 
Добрый день.
Использую GIS ToolKit Active 13
Например, у меня есть задача разместить на карте  радиолокационные станции, нарисовать их зоны ответственности(видимости) и все это сделать программно.
1.  Допустим при запуске приложения открывается карта местности
2.  Cоздается временная карта обстановки CreateAndAppendTempSite с классификатором rls.rsc
3.  Cоздаются объекты PЛС методом CreateObjectByInCode, данные берутся из базы данных или из xml.

Вопрос. Как нарисовать зоны ответственности РЛС? Допустим для упрощения это должны быть окружности или сектора без учета высот и рельефа. Цвет зон может быть разный в зависимости от типа Рлс. Это могут быть объекты из классификатора? Или их как-то отдельно можно нарисовать?  Какие методы лучше использовать для создания таких объектов?


Как визуальный пример я видел у вас "Комплекс расчетных задач в интересах РТВ".
 
Алгоритм правильный. Зоны можно создавать графическими объектами (mapRegisterDrawObject) или объектами из классификатора (надо добавить в классификатор объекты нужного типа), для которых задавать цвет отображения через служебную семантику (номер 31002). Метрику (окружность, сектор) можно сформировать АПИ функциями, например сектор:

mapAppendPointPlane(pHobj, pCenter.X, pCenter.Y, 0);           // центр
   mapAppendPointPlane(pHobj, pCenter.X + pRadius, pCenter.Y, 0);    // вверх на растояние радиуса
phi = (fAlfa - pSquare / (pRadius * pRadius));
   mapRotateObject(pHobj, &pCenter, &phi);                         // повернуть вокруг центра до первой грани сектора
   mapGetPlanePoint(pHobj, &point1, 2, 0);                      // читаем точку
   gamma = 2 * pSquare / (pRadius * pRadius);
   mapRotateObject(pHobj, &pCenter, &gamma);                       // повернуть вокруг центра до второй грани сектора
   mapGetPlanePoint(pHobj, &point2, 2, 0);                      // читаем точку
   mapCreateArc(pHmap, pHobj, &point2, &pCenter, &point1, pRadius); // создаем дугу
   mapAppendPointPlane(pHobj, pCenter.X, pCenter.Y, 0);           // Возвращаемся в исходную точку в центр

Если подключить матрицу рельефа, то можно построить зоны прямой видимости в виде растра mapVisibilityZonePro.
 
Андрей, спасибо за ответ.
Есть еще пару вопросов:
1. Каким методом можно получить идентификатор объекта на карте не в момент создания объекта, т.е. axMapObj не указывает на нужный объект.
2. Функция mapCreateArc рисует дугу, а например окружность можно  нарисовать с помощью нее же( сектор 360* )? или есть другая функция API?
Изменено: Александр Смагин - 30.08.2021 13:51:42
 
1. Объект нужно сначала найти (просто перебором, по ключу или другим признакам), а затем узнать его номер. Искать можно через MapFind с установкой в MapObj.

2. Пример построения окружности на Паскале.
procedure mapDrawCircle(Obj : HObj; Center:TDoublePoint; Radius : double);
 var i : integer;
     P : TDoublePoint;
 begin
  while mapPointCount(Obj,0)>0 do
  mapDeletePointPlane(Obj,1,0);
  for i:=0 to 72 do
  begin
   P.X:=Center.X+Radius*sin(pi*i/36);
   P.Y:=Center.Y+Radius*cos(pi*i/36);
   mapAppendPointPlane(Obj, P.X,P.Y,0);
  end;
 end;
 
Добрый день.
В sdk13 есть пример с движущимся объектом - Traffic.
Там есть счетчик ,который вызывает функцию
Код
С#
axMapScreen.UpdateObjects(0)

которая вызывает в OnMapScreenUpdate обновление метрики объекта

Код
C#
MapPoint.SetPoint(PlaneMetric[FCurrMetric, 0], PlaneMetric[FCurrMetric, 1]);
MobilObj.Metric.Update(0, 1, MapPoint.C_CONTAINER); 
// нарисуем объект в буфер
MobilObj.PaintObjectUp();

и далее обновляем экран

Код
axMapScreen.RepaintWindow();      // обновим изображение в окне из буфера объектов

Вопрос следующий. Если у меня таких объектов будет много(например 20, заранее не известно) и метрика у них будет обновляться по такому же принципу где-то   ~ раз в секунду. Как мне их нарисовать в буфер и обновить экран из буфера объектов за одну "транзакцию" ? Или тут не применимо понятие транзакции, ведь commit  я тут не делаю?

Т.е вопрос производительности. Нужно ли рисовать много объектов из буфера на экран за один раз, а не каждый по отдельности  если я правильно мыслю? Сама "транзакция" тоже что-то стоит.  

Видел темах упоминание таких функций, но не очень понимаю как я могу их применить(команду commit явно не использую)

Код
_MAPIMP long int _MAPAPI mapLogCreateAction(HMAP hMap, HSITE hSite, long int type);

_MAPIMP void _MAPAPI mapLogCommitAction(HMAP hMap, HSITE hSite);
Изменено: Александр Смагин - 24.09.2021 15:27:57
 
Если у Вас 20 - 100 объектов (условно), то можно создать такое-же количествj TMapObj с признаком выделения. Это тормозить отрисовку не должно (в зависимости от фоновой карты). Для высоконагруженных систем надо применять наше АПИ, т.е. отрисовка поверх - вызов АПИ, или компонент MаpSc reen, который имеет методы заполнения нескольких буферов подвижными объектами.
 
1 Уточните пожалуйста, что за признак выделения TMapObj?
2. Я правильно понимаю, что если создать  TMapObj по количеству подвижных объектов, то каждый  TMapObj  будет держать связь со своим объектом и в этом варианте поиск объектов не требуется?
 
1. TMapObj может содержать описание объекта карты (атрибуты, метрика, условный знак) и при этом объекта в карте не будет (т.е. его туда не сохраняли). Отображаться такой объект будет средствами TMapObj поверх других объектов карты, а не TMapScreen. Для этого в TMapObj надо установить признак в свойстве Style (что он должен отрисоваться нужным способом) .
2. Да, каждый TMapObj будет содержать свои параметры объекты.
 
Несколько дополнительных моментов.

1.
Журнал транзакций не связан с операциями отрисовки.
Надо определиться, нужен ли он вам вообще, либо его отключить:
Скрытый текст


Если журнал транзакций нужен, то при множественных операциях редактирования желательно самостоятельно открыть свою транзакцию и по окончании ее подтвердить.
В противном случае транзакция будет создаваться автоматически на каждый Commit каждого объекта.


2.
При относительно большом количестве объектов (несколько сотен и более) держать их все в памяти (в axMapObj) и самостоятельно выполнять их отрисовку не рационально. Лучше в этом случае все же сохранить их на карту и выполнять ее отрисовку штатными средствами ГИС-ядра.
Как вариант можно для этого использовать временную карту, размещенную в памяти (не будет дисковых операций):
Скрытый текст

Эту карту надо сделать в той же проекции и СК, что и основная карта, чтобы избежать пересчетов при их совместной отрисовке.

3.
Цитата
Александр Смагин написал:
Функция mapCreateArc рисует дугу, а например окружность можно  нарисовать с помощью нее же( сектор 360* )? или есть другая функция API?

Да, этой же функцией создается и окружность.
Пример для С++ (окружность с радиусом r и центром в x-y):        
Цитата

       DOUBLEPOINT point1 = {x-r,y};
       DOUBLEPOINT center = {x  ,y};
       mapCreateArc(hMap, obj, &point1, ¢er, &point1, r);

4.
Метод CreateObjectByInCode (или SetObjectByIncode) работает быстрее, чем CreateObjectByExCode (SetObjectByExcode). Однако, следует иметь в виду, что при изменениях в классификаторе внутренние коды могут измениться.
Страницы: 1
Читают тему (гостей: 1)



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

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