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

настройка набора данных для отображения

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

Используем ГИС Конструктор Free для Qt Designer, версия 15 Подскажите возможно ли управлять при отображении составом отображаемых данных для основной карты либо это возможно только для пользовательской карты ?

Согласно примеру из Руководства программиста используем стр 90 hMap и hSite ставим одинаковыми задаем не отображать все наборы перерисовываем карту и никакого результата как отображалась карта так и отображается подскажите что неправильно в наших действиях

 
HMAP - идентификатор документа - совокупности открытых "наборов данных": векторных карт (включая, WFS-сервисы, пространственные базы данных и т.д.),
снимков (растров), матриц, геопорталов, моделей и других видов данных.

Отключить отображение набора данных - векторной карты можно через функции:
Код
  // Запросить - отображается ли карта
  // hMap  - идентификатор открытых данных (документа)
  // hSite - идентификатор открытой пользовательской карты, для фоновой (основной) карты hSite = hMap
  // Если карта не отображается - возвращает ноль

_MAPIMP long int _MAPAPI mapGetSiteViewFlag(HMAP hMap, HSITE hSite);

  // Установить флаг отображения карты
  // hMap  - идентификатор открытых данных (документа)
  // hSite - идентификатор открытой пользовательской карты, для фоновой (основной) карты hSite = hMap
  // flag  - флаг отображения карты (0 - не отображать, 1 - отображать)
  // Возвращает новое значение флага

_MAPIMP long int _MAPAPI mapSetSiteViewFlag(HMAP hMap, HSITE hSite, long int flag);


В версии 15 есть новый набор функций для управления общим списком отображаемых наборов данных.
Там есть, в частности функции:
Код
  /*********************************************************
  *                                                        *
  *  СПИСОК ПОРЯДКА ОТОБРАЖЕНИЯ НАБОРОВ ДАННЫХ В ДОКУМЕНТЕ *
  *                                                        *
  *********************************************************/

  // Запросить число элементов в списке наборов данных
  // Если возвращается нулевое значение, то список отображения не активен
  // hmap - идентификатор открытых данных (документа)
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetViewListCount(HMAP hMap);

...

  // Запросить/Установить состояние флага отображения для элемента списка отображения (0/1)
  // hmap - идентификатор открытых данных
  // index - номер элемента с 1 до mapGetViewListCount()
_MAPIMP long int _MAPAPI mapGetViewListItemViewFlag(HMAP hMap, long int index);
_MAPIMP long int _MAPAPI mapSetViewListItemViewFlag(HMAP hMap, long int index, long int view);

Если необходимо включить/отключить видимость не всего набора (карты), а отдельных слоев или видов или экземпляров объектов, то
используются методы, описанные в Руководстве программиста ... в разделе 4.2.13 Управление составом отображения объектов электронной карты
https://gistoolkit.com/download/doc/mapapi.pdf

При этом:

 // hMap  - идентификатор открытых данных (документа)
// hSite - идентификатор открытой пользовательской карты, для фоновой (основной) карты hSite = hMap
 
Вызов mapSetSiteViewFlag включает/выключает все листы многолистовой карты типа MAP (MAPZ).

Поверх одной карты типа MAP может быть открыта другая карта MAP.
Код
// Отключить отображение второй карты (всех ее листов, если их несколько)
HSITE hsite = mapGetSiteIdent(hmap, 2);
mapSetSiteViewFlag(hmap, hsite, 0);

MPT (MPTZ) - это может быть список из нескольких отдельных карт (листы - это часть многолистовой карты MAP), в том числе карт типа MAP.
Чтобы выключить отображение всех карт из MPT, нужно вызвать функцию mapSetSiteViewFlag для каждой карты из списка в MPT.
 
После того, как карты были открыты в документе - они не знают как их открыли.

Если до добавления MPT в документ запросить число открытых пользовательских карт:
Код
// Сколько было
int sitcount = mapGetSiteCount(hmap);

// Добавить MPT
mapAppendAnyData(hmap, mptname, 0);

// Сколько стало
int last = mapGetSiteCount(hmap);
int first = sitcount + 1;
Добавлены карты с номерами от first до last
 
Спасибо опция не отображать всю карту заработала. пытаюсь на основе вашего примера mapobj задать отображение только например линейных объектов код:



MapHandle = mapOpenAnyDataPro("pegas50k.mpt",GENERIC_READ,&error,0,0);   // в начале кода

.....
// метод настройки отображения вызывается из меню
if (MapHandle == 0)
     return;
.
   int local = 0;      
//   FlagDrawCross = 0;

   HSELECT view = mapCreateMapSelectContext(MapHandle);

   if (view == 0)
     return;

   if (mapGetSiteViewSelect(MapHandle, MapHandle, view) == 0)
     return;

   mapClearSelectContext(view);
   mapSelectLocal(view, -1, 0);
   mapSelectLocal(view, local, 1);
   mapSetSiteViewSelect(MapHandle, MapHandle, view);

   mapDeleteSelectContext(view);

   update();
при загрузке карты .mpt линейные объекты отображаются только для одного листа карты
Подскажите как побороть эту проблему
 
Логика такая же. Нужно устанавливать условия каждой карте.

Код
TEMPHSELECT hselect(mapCreateMapSelectContext(MapHandle));

int sitecount = mapGetSiteCount(MapHandle);
for(int i = 0; i <= sitecount; i++)
{
  HSITE hsite = mapGetSiteIdent(MapHandle, i);
  mapGetSiteViewSelect(MapHandle, hsite, hselect);

  mapClearSelectContext(hselect);
  mapSelectLocal(hselect, -1, 0);
  mapSelectLocal(hselect, local, 1);

  mapSetSiteViewSelect(MapHandle, hsite, hselect);
 }

 update();
 
Не совсем по теме настройки набора данных для отображения. Возникла необходимость установить шкалу отображения (например 5000 м). под шкалой имеется ввиду расстояние от центра отображения карты на экране до верха экрана  не подскажите как этом можно сделать с помощью MAPI ?
 
Примерно так:
Код
// -----------------------------------------------------------------
// Функция изменения масштаба по координатам фрагмента в метрах - показать на все окно
// -----------------------------------------------------------------
int TMapWindow::ChangeScaleByFrame(DFRAME * dframe)
{
  // Габариты окна в пикселах
  RECT   rect = GetClientRect();

  double x1   = dframe->X1;
  double y1   = dframe->Y1;
  double x2   = dframe->X2;
  double y2   = dframe->Y2;

  DOUBLEPOINT center;
  center.X    = (x1 + x2)/2.0;
  center.Y    = (y1 + y2)/2.0;

  mapPlaneToPicture(hmap, &x1, &y1);
  mapPlaneToPicture((hmap, &x2, &y2);

  double dw = (x2 - x1);
  if (dw < 0)
    dw = -dw;
  else
    if (dw == 0)
      dw = 1;

  double dh = (y1 - y2);
  if (dh < 0)
    dh = -dh;
  else
    if (dh == 0)
      dh = 1;

  // Расчет коэффициента изменения масштаба
  double change  = (double)(rect.RT - rect.LT - 64) / (double)dw;
  double change2 = (double)(rect.DN - rect.UP - 64) / (double)dh;

  if (change > change2)
    change = change2;

  double scale = mapGetRealShowScale(hmap);
  scale = scale/ change;

  // Установить масштаб
  mapSetRealShowScale(hmap, scale);

  // Установить окно в центр габаритов объекта
  ViewPlanePoint(center);

  return 1;
}
 
Спасибо за пример. Подскажите есть аналог ли метода  ViewPlanePoint в версии 15  в 14 такой метод есть а в 15 что-то не находится
 
Вид, примерно, такой:
Код
// -----------------------------------------------------------------------------
//  Отобразить участок карты, на котором расположена заданная точка,
//  (в метрах) в центре окна
// -----------------------------------------------------------------------------
void TMapWindow::ViewPlanePoint(const DOUBLEPOINT* point)
{
  RECT rect;
  GetClientRect(rect);

  int delta = (rect.RT - rect.LT) / 3;
  rect.LT = (rect.LT + rect.RT) / 2 - delta;
  rect.RT = rect.LT + delta + delta;
  delta = (rect.DN - rect.UP) / 3;
  rect.UP = (rect.UP + rect.DN) / 2 - delta;
  rect.DN = rect.UP + delta + delta;

  ViewMapPointInRect(point, &rect);
} 

// -----------------------------------------------------------------------------
//  Отобразить участок карты, на котором расположена заданная точка, в определенном фрагменте окна
//  Координаты фрагмента в пикселах в клиентной области
//  При ошибке возвращает ноль
//  Иначе - координаты заданной точки в пикселах
//  в клиентной области окна
// -----------------------------------------------------------------------------
void TMapWindow::ViewMapPointInRect(const DOUBLEPOINT* point, const RECT* rect)
{
  double x, y;
  x = point->x;
  y = point->y;

  mapPlaneToPicture((HMAP)MapDoc, &x, &y);
  POINT pointPicture;
  pointPicture.x = CHECK_INT(x);
  pointPicture.y = CHECK_INT(y);

  POINT pointPix = Picture2Client(pointPicture);

  // Проверить - попадает ли точка в заданный прямоугольник
  if ((pointPix.x <= rect->LT) || (pointPix.x >= rect->RT) || (pointPix.y <= rect->UP) || (pointPix.y >= rect->DN))
  {
    // Точка не видна - переместим изображение
    DRAWPOINT targetPix;
    targetPix.x = (rect->RT + rect->LT) / 2;
    targetPix.y = (rect->UP + rect->DN) / 2;

    ScrollBy(pointPix.x - targetPix.x, pointPix.y - targetPix.y);

    UpdateWindow();
  }
}
Страницы: 1 2 3 4 5 След.
Читают тему (гостей: 3)



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

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