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

mapBuildMtq

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
mapBuildMtq, очень долго работает на больших картах
 
Добрый день Уважаемые разработчики.
Сейчас работаю над возможностью градиентной заливки.
Столкнулся с такой проблемой:
При использовании функции mapBuildMtq на карте подольска все очень хорошо закрашивается и получается очень красивый рисунок.
Но, когда я применяю ту же самую функцию для закрашивания карты миры, то программа начинает ООООчень долго думать и порой просто не дожидаешься конца операции.

Пробовал делать больше "стороны элементарного участка", делал до 5-10 км, но тогда вся карта в квадратах и ни о какой плавности речи не идет.

У меня 2 вопроса:
1. как можно увеличить скорость работы при максимальном сохранении плавности (понимаю, что эти вещи взаимоисключающие, но все же)
2. Не нашел функции для того, что бы сделать слой mtq полупрозрачным (нашел только mtr), есть ли он?

Вот код:
Заполняю массивы:
Код
void NativeMap::setArrays(QList<LATLONH> *llh, QList<COLORREF> *cr)
{
   for (int i = 0; i < 1000; i++)
   {
                LATLONH q;
           double x = width * ((double) rand() / (double) RAND_MAX);
      double y = height * ((double) rand() / (double) RAND_MAX);

      wrapper->mapPictureToPlane(hMap, &x,&y);
      wrapper->mapPlaneToGeo(hMap, &x, &y);

      q.lat = x;
      q.lon = y;
      q.h = i;

      llh->append(q);
        }
   for (int i = 0; i < 255; i++)
   {
      cr->append(RGB(i, 00, 255));
   }
}

Вызов:
Код
map->drawPalitra(llh, cr, 500, mtqFile);

Функция:
Код
void NativeMap::drawPalitra(QList<LATLONH> latlonh, 
QList<COLORREF> rgb,
int sizeSmall, QString path)
{

#ifdef Q_OS_WIN
   char* pathChar = cyr_detect_and_convert(
         path.toUtf8().data(), CYR_TABLE_WIN);
#else
   char pathChar[255];
   strncpy(pathChar, path.toUtf8().data(), 255);
#endif  //Q_OS_WIN

   int countXYH = latlonh.count();
   int countRGB = rgb.count();
   XYHDOUBLE mtqData[countXYH];

   for (int i = 0; i < countXYH; i++)
   {
      LATLONH tmplatlonh;
      XYHDOUBLE tmpData;

      tmplatlonh = latlonh.at(i);
      double x = tmplatlonh.lat;
      double y = tmplatlonh.lon;

      wrapper->mapGeoToPlane(hMap, &x, &y);
      tmpData.X = x;
      tmpData.Y = y;
      tmpData.H = tmplatlonh.h;
      mtqData[i] = tmpData;
   }

   COLORREF cr[countRGB];
   for (int i = 0; i < countRGB; i++)
   {
      cr[i] = rgb.at(i);
   }

   if(wrapper->mapBuildMtq(hMap, pathChar, &cr[0],
      countRGB, &mtqData[0], countXYH, sizeSmall, 0, countXYH, NULL))
   {
      qDebug() << "OK mtq";
   }
   else
   {
      qDebug() << "error mtq";
   }
   wrapper->mapOpenMtqForMap(hMap, pathChar, 0);
   wrapper->mapSetMtqViewOrder(hMap,1,1);
} 
 
Для прозрачности MTQ применяется функция mapSetMtqView (MTRAPI.H)
параметр wiew - такой же, как для mapSetMtrView.
Прошу уточнить - каков порядок числа исходных точек pointCount,
подаваемый на вход mapBuildMtq для случаев "Подольск" и вся "Россия" ?
Данная функция mapBuildMtq по исходным точкам строит сеть треугольников
(триангуляцию), а затем выбирает из построенной триангуляции значения для
заполнения элементов матрицы. Таким образом - чем больше исходных точек
и чем больше размеры самой матрицы (Россия гораздо больше Подольска),
тем построение идёт дольше.
 
mapSetMtqView используется для отображения и скрытия слоя mtq.

 // Запросить/Установить отображение матрицы качеств
 // hMap - идентификатор открытой основной карты
 // number - номер файла в цепочке
 // view : 0 - матрицу не отображать, 1 - отображать

_MAPIMP long int _MAPAPI mapGetMtqView(HMAP hMap,long int number);
_MAPIMP long int _MAPAPI mapSetMtqView(HMAP hMap,long int number,
long int view);

У тут меня интересует именно полупрозрачность слоя.

Для Подольска - 1000 точек
Для мира      - 1000000 точек
 
// Запросить/Установить степень видимости матрицы
 //  hMap   - идентификатор открытой основной векторной карты
 //  number - номер файла в цепочке
 //  view = 0 - не виден
 //  view = 1 - полная
 //  view = 2 - насыщенная
 //  view = 3 - полупрозрачная
 //  view = 4 - средняя
 //  view = 5 - прозрачная

_MAPIMP long int _MAPAPI mapSetMtqView(HMAP hMap,long int number,
long int view);

По кол-ву точек : на 1 000 000 точек строить триангуляцию весьма долго,
предлагаю Вам рассмотреть возможность применения для Вашей задачи MTD-модель (mtdapi.h).
Миллион точек быстро загрузятся в MTD-модель, а затем можно построить матрицу качеств (с заданным)
дискретом, используя полученную MTD-модель. Точки должны быть записаны в TXT-файл.
Загрузка точек в MTD-модель : Файл - Создать - MTD-модель.
 
Цитата
Александр Горбунов написал:

По кол-ву точек : на 1 000 000 точек строить триангуляцию весьма долго,
предлагаю Вам рассмотреть возможность применения для Вашей задачи MTD-модель (mtdapi.h).
Миллион точек быстро загрузятся в MTD-модель, а затем можно построить матрицу качеств (с заданным)
дискретом, используя полученную MTD-модель. Точки должны быть записаны в TXT-файл.
Загрузка точек в MTD-модель : Файл - Создать - MTD-модель.
добрый день, похожая задача: необходимо построить матрицу качеств по массиву точек. Массив размером 1000000 точек. Функцией mtrBuilMtq матрица строится более суток. Нету ли какого-нибудь примера работы с MTD-моделью?
удивительно, что если этот же массив подсунуть «Оператору» в виде текстового файла формата XYH, то построение такой матрицы занимает несколько минут
 
Добрый день!

Примера нужного Вам преобразования, к сожалению, нет. И прямых api-функций получения из XYH-файла матрицы качеств тоже нет.

MTD модель может быть построена либо в интерфейсе ГИС Оператор (Панорама) загрузкой файла с точками Файл - Импорт растр и матриц - Из облака точек (TXT),
либо  с использованием api-функции

 // Создать матричную карту
 // Возвращает идентификатор открытой матричной карты (TMapAccess*)
 // Структурa BUILDMTL описанa в mtlapi.h
 // blockpointcount - массив количеств точек в блоках матрицы
 // Структурa MTRPROJECTIONDATA описанa в maptype.h
 // При ошибке возвращает ноль

 _MAPIMP HMAP _MAPAPI mapCreateMtdByBlockPointCountUn(const WCHAR * mtrname,  
                                            BUILDMTL * mtrparm,
                                            int* blockpointcount,          
                                            MTRPROJECTIONDATA * mtrprojectiondata);

Далее по построенной MTD-модели выполняется загрузка в матрицу качеств, либо также из интерфейса ГИС Оператор (Панорама) через
Файл - Создать матрицу качеств - выбираем режим из открытой MTD-модели,
либо через api-функции

 // Создать матрицу качеств
 // Возвращает идентификатор открытой матричной карты (TMapAccess*)
 // Структуры BUILDMTW,MTRPROJECTIONDATA описаны в maptype.h
 // palette - указатель на палитру
 // countpalette - количество цветов в палитре
 // name - имя файла создаваемой матрицы

_MAPIMP HMAP _MAPAPI mapCreateMtqUn(const WCHAR *name, BUILDMTW *parm,
                                   MTRPROJECTIONDATA *projectiondata,
                                   COLORREF *palette, int countpalette);

и через выборку высот из открытой MTD-модели
 
// Открыть матричные данные
 // Возвращает идентификатор открытой матричной карты
 // При ошибке возвращает ноль

 _MAPIMP HMAP _MAPAPI mapOpenMtdUn(const WCHAR *mtrname, long int mode = 0);  

и поэлементную запись их в матрицу качеств заполняем матрицу качеств:

 // Цикл по элементам создаваемой матрицы качеств
 for (double X = X1; X < X2; X += ElemSize)
   {
     for (double Y = Y1; Y < Y2; Y += ElemSize)
       {
 
         // Считываем высоту элемента из всех MTD ( позволяет строить матрицу по группе MTD - с выбором области "По рамке" )  19/12/13
         double H = mapGetHeightValue(Map, X, Y);

         if (H <= ERRORHEIGHT) continue;

         // Записываем высоту в матрицу
         bool IsPutVal;
         IsPutVal = mapPutMtqValue(mtr, 1, X, Y, H);

         // Уточняем максимальное, минимальное значение
         if (H < MinVal)
           MinVal = H;
         if (H > MaxVal)
           MaxVal = H;
       }
   }
Страницы: 1
Читают тему (гостей: 1)



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

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