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

Настройка отображения матрицы качеств

Поиск  Пользователи  Правила  Войти
Форум » Linux » ГИС Панорама для Linux
Страницы: 1
RSS
Настройка отображения матрицы качеств, Частичное отображение и полупрозрачность в "ГИС Конструктор для ПС Конструктора" под МСВС 3.0
 
Здравствуйте уважаемые разработчики!
Необходимо отобразить на карте матрицу качеств, содержащую в себе ослабления энергетического состояния радиосигнала в каждой точке вокруг объекта (зону радиопокрытия).

Требования к отображению:
-вывод на экран только определенные состояния, подкрашенные определенным цветом;
-вывод на экран поверх карты в полупрозрачном режиме.


Матрица и палитра окраски создаются по средствам функций MAPAPI. После чего название созданной матрицы отправляется в QDMapView. На каком этапе необходимо произвести настройку отображения матрицы для решения поставленных задач? И какие функции для этого использовать?

Пример конкретного условия:
- ослабление радиоволн в точке ниже -200 ДБ не отображать (значение ослабления отрицательно);
- отображенная матрица полупрозрачна.


Матрица радиопокрытия это дополнительный элемент, основная программа для отображения обстановки уже написана и переписывать в MAPAPI не рассматривается из-за сжатых сроков.

Разработка производится в «ГИС Конструктор для ПС Конструктора» версия 10 под МСВС 3.0 изм.4
Изменено: Дмитрий Григорьев - 10.12.2012 14:36:12
 
После заполнения матрицы качеств нужно вызвать mapSetMtqShowRange(... minvalue, maxvalue) - Установить диапазон отображаемых элементов матрицы качеств, элементы со значениями вне границ (minvalue, maxvalue) не отображаются.
mapSetMtqPalette(COLORREF * palette, long int count) - Установить описание палитры матрицы качеств (count = кол-во цветов).
mapSetMtqPaletteDiapason(double * diapason, long int count) - Установить верхние значения диапазонов палитры матрицы качеств (функция позволяет задать неравномерные диапазоны палитры матрицы качеств, например нужно отобразить значения от 0 до 10 - красным, от 10 до 50 - жёлтым, от 50 до 200 - зелёным. Тогда задаём палитру из трёх цветов функцией mapSetMtqPalette, а потом задаём верхние значения диапазонов палитры функцией mapSetMtqPaletteDiapason в виде массива diapason = {10,50,200} и count = 3)
Установить порядок отображения матрицы - mapSetMtrViewOrder(order = 0 - под картой, 1 - над картой)
Установить степень видимости матрицы - mapSetMtrView(view = от 0 до 5, 0 - не видна, 1 - полная, 3 - полупрозрачная, 5 - прозрачная)
Изменено: Александр Горбунов - 10.12.2012 18:43:48
 
Спасибо за ответ.
Палитру отображения матрицы выбрал дискретную для каждого из диапазона.
Возникла проблема с отображением матрицы:
- все что не входит в назначенный диапазон окрашивается цветам нулевого диапазона(белый цвет в результате);
- прозрачность не включилась.
Может я что-то делаю не правильно?
скрытие не нужного решилось просто не внесением значения в матрицу.

Пример текста программы:
Код
   ...
   BUILDMTW parm;
   MTRPROJECTIONDATA proj;

   COLORREF palette[10];
   double Diapason[10]; //настройка палитры матрицы

   palette[0]=RGB(255, 255, 255);
   palette[1]=RGB(255, 0, 255);
   palette[2]=RGB(235, 0, 235);
   palette[3]=RGB(215, 0, 215);
   palette[4]=RGB(195, 0, 195);
   palette[5]=RGB(175, 0, 175);
   palette[6]=RGB(155, 0, 155);
   palette[7]=RGB(135, 0, 135);
   palette[8]=RGB(115, 0, 115);
   palette[9]=RGB(95, 0, 95);


   Diapason[0]=-200;
   Diapason[1]=-130;
   Diapason[2]=-120;
   Diapason[3]=-115;
   Diapason[4]=-110;
   Diapason[5]=-105;
   Diapason[6]=-100;
   Diapason[7]=-90;
   Diapason[8]=-80;
   Diapason[9]=-0;


   memset(&parm, 0, sizeof(BUILDMTW));
   parm.StructSize=sizeof(BUILDMTW);
   parm.BeginX=X1-Radius;
   parm.BeginY=Y1-Radius;
   parm.Width=Radius*2;
   parm.Height=Radius*2;
   parm.ElemSizeMeters=Step;
   parm.ElemSizeBytes=8;
   parm.Scale=100000;

   HMAP hm=mapCreateMtq("/*путь к матрице*/", &parm, 0, palette, 10);
   if(hm==0)
   {
      QMessageBox::warning( this, tr("Внимание"),tr("Ошибка создания матрицы"), tr("Выход"), 0, 0, 1 );
      return;
   }

   double x, y;
   double BegX, BegY;
   double EndX, EndY;
   double Elem;
   double Value=1.0;

   Elem=parm.ElemSizeMeters;
   BegX=parm.BeginX;
   BegY=parm.BeginY;
   EndX=parm.BeginX+parm.Height;
   EndY=parm.BeginY+parm.Width;

   for(x=BegX; x<=EndX; x+=Elem)
   {
      for(y=BegY; y<=EndY; y+=Elem)
      {
         ...
         
         if(R<Radius) //Значения не входящие в радиус не записываются
         {
            ...
            if(l>Diap) //Значения не удовлетворяющие условию не записываются
            {
               mapPutMtqValue(hm, 1, x, y, l); 
            }
         }
      }
   }

   mapSetMtqShowRange(hm, 1,-100.0, 200.0);
   mapSetMtqPalette(hm, palette, 10, 1);
   mapSetMtqPaletteDiapason(hm, Diapason, 10, 1);
   mapSetMtrView(hm, 1, 5);

   mapSaveMtqPalette(hm, palette, 10, 1);

   mapCloseMtq(hm);

...

//подключение матрицы к QDMapView
...
int num;
QDMapView *View;
QDMapMtrs *mtq;
...
num=View->VarMapMtrs->Append(“/*путь к матрице*/”);
mtq=View->VarMapMtrs->GetMapMtrs(num);
mtq->SetMtrViewOrder(1); //отображать над картой
mtq->SetMtrView(TRUE);
...

Результат:
http://i52.fastpic.ru/big/2012/1211/cd/6fcb776dcd2105e7738375ed0a5ed7cd.png
Изменено: Дмитрий Григорьев - 12.12.2012 09:40:06
 
Вызывает сомнение строка - mapSetMtqShowRange(hm, 1,-100.0, 200.0); Она задаёт для всей матрицы min = -100  max = 200
А верхние значения диапазонов, в сумме с минимумом матрицы составляющие интервал (max-min), начинаются с -200 и кончаются нулём.
Попробуйте установить верхние значения диапазонов как в примере предыдущего сообщения (неравномерные диапазоны - красный,жёлтый,зелёный).
То есть установите например mapSetMtqShowRange(hm, 1, -250.0, 0.0); Так как весь интервал отображаемых значений матрицы (max-min) состоит из цветовых диапазонов (равномерных или неравномерных), в сумме составляющих весь интервал (max-min).
Изменено: Александр Горбунов - 12.12.2012 09:17:29
 
Пробовал различные вариации установки диапазона.
mapSetMtqShowRange(hm, 1,-100.0, 200.0);
mapSetMtqShowRange(hm, 1,-90.0, 0.0);
mapSetMtqShowRange(hm, 1,-90.0, -80.0);
разница только в окрашивании цветом диапазона 0 все что меньше границы min.
mapSetMtqShowRange(hm, 1,-90.0, -100.0);
все что меньше границы min окрашивается цветом диапазона 0, а все что больше границы min окрашивается цветом диапазона 9.

Вопрос о прозрачности так же не решен.
 
Дмитрий, попробуем смоделировать ситуацию и проверить отображение матрицы на указанном примере. Результаты сообщим.
 
Цитата
Александр Горбунов пишет:
Дмитрий, попробуем смоделировать ситуацию и проверить отображение матрицы на указанном примере. Результаты сообщим.
Очень интересны результаты по этому багу)))
 
1.В 10 версии механизм отрисовки такой -
Цитата
все что не входит в назначенный диапазон окрашивается цветам нулевого диапазона
В 11 версии предложена функция
Код
  // Установить флаги отображения элементов матрицы качеств
  // вне границ диапазона, заданного в функции mapSetMtqShowRange
  // hMap   - идентификатор открытой основной карты
  // number - номер матрицы в цепочке.
  // viewUp - отображать элементы, значения которых больше верхней
  //          границы диапазона (параметр maxvalue функции mapSetMtqShowRange)
  // viewDown - отображать элементы, значения которых меньше нижней
  //          границы диапазона (параметр minvalue функции mapSetMtqShowRange)
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSetMtqViewOutRange(HMAP hMap,           // 08/06/11
long int number,
long int viewUp,
long int viewDown); 

2.Прозрачность записывается в файл INI.
Задать его можно функцией
Код
  // Установить новое имя INI-файла документа
  // При ошибке возвращает ноль
_MAPIMP const char * _MAPAPI mapSetMapIniName(HMAP hMap, const char * mapininame); 

Записать состояние карты в файл можно функцией
Код
  // Сохранить текущие параметры окна карты в INI-файл карты,   // 03/10/06
  // имя файла можно запросить через mapGetMapIniName()
  // Вызывается перед закрытием окна карты
  // Сохраняет описание открытых данных, масштаб, палитру, признаки видимости,
  // редактируемости, состав отображаемых объектов...
  // hmap  -  идентификатор открытых данных
  // point -  координаты центра окна в метрах (может быть 0)
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSaveMapState(HMAP hMap, DOUBLEPOINT * point); 

Восстановить состояние карты можно функцией:
Код
  // Восстановить параметры окна карты из INI-файла карты,      // 03/10/06
  // имя файла можно запросить через mapGetMapIniName()
  // Вызывается после открытия карты
  // Восстанавливает описание списка данных, масштаб, палитру, признаки видимости,
  // редактируемости, состав отображаемых объектов...
  // hmap  -  идентификатор открытых данных
  // point -  координаты центра окна в метрах (может быть 0)
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapRestoreMapState(HMAP hMap, DOUBLEPOINT * point);
 
Возник вопрос по палитре в C#:
private uint RGB(int r, int g, int b)
{
   return (uint)(255 + 0x100 * 255 + 0x10000 * 255);  //RBG->COLORREF
}
...
           uint[] palette = new uint[10];
           
           palette[0] = RGB(255, 255, 255);
           palette[1] = RGB(0, 255, 255);
           palette[2] = RGB(0, 235, 235);
           palette[3] = RGB(0, 215, 215);
           palette[4] = RGB(0, 195, 195);
           palette[5] = RGB(0, 175, 175);
           palette[6] = RGB(0, 155, 155);
           palette[7] = RGB(0, 135, 135);
           palette[8] = RGB(0, 115, 115);
           palette[9] = RGB(0, 95, 95);
...
int rcPalette = MapControl.MapAccess.mapSetMtqPalette(hMtq,  //вызываю API-функцию
               GCHandle.Alloc(palette, GCHandleType.Pinned).AddrOfPinnedObject(), palette.Length, 1);

В общем, делаю все, как товарищ, создавший тему. Но среди цветов в итоге отображаются только синий и черный (еще иногда прозрачный, когда именно - пока не разобрался). Причем синий и черный остаются независимо от заполнения палитры и ее длины. Подозреваю, что дело может быть в uint или в переводе RGB в COLORREF.
 
Вопрос перенесен по ссылке: http://gisweb.ru/forum/messages/forum2/topic531/message58381/#message58381
Страницы: 1
Читают тему (гостей: 1)



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

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