настройка набора данных для отображения, отображение основной карты
Пользователь
Сообщений: Регистрация: 06.05.2025
06.05.2025 12:07:35
Используем ГИС Конструктор Free для Qt Designer, версия 15 Подскажите возможно ли управлять при отображении составом отображаемых данных для основной карты либо это возможно только для пользовательской карты ?
Согласно примеру из Руководства программиста используем стр 90 hMap и hSite ставим одинаковыми задаем не отображать все наборы перерисовываем карту и никакого результата как отображалась карта так и отображается подскажите что неправильно в наших действиях
Администратор
Сообщений: Регистрация: 05.06.2008
06.05.2025 14:13:50
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 Управление составом отображения объектов электронной карты
При этом:
// hMap - идентификатор открытых данных (документа) // hSite - идентификатор открытой пользовательской карты, для фоновой (основной) карты hSite = hMap
Администратор
Сообщений: Регистрация: 05.06.2008
07.05.2025 07:35:59
Вызов mapSetSiteViewFlag включает/выключает все листы многолистовой карты типа MAP (MAPZ).
Поверх одной карты типа MAP может быть открыта другая карта MAP.
Код
// Отключить отображение второй карты (всех ее листов, если их несколько)
HSITE hsite = mapGetSiteIdent(hmap, 2);
mapSetSiteViewFlag(hmap, hsite, 0);
MPT (MPTZ) - это может быть список из нескольких отдельных карт (листы - это часть многолистовой карты MAP), в том числе карт типа MAP. Чтобы выключить отображение всех карт из MPT, нужно вызвать функцию mapSetSiteViewFlag для каждой карты из списка в MPT.
Администратор
Сообщений: Регистрация: 05.06.2008
07.05.2025 09:21:06
После того, как карты были открыты в документе - они не знают как их открыли.
Если до добавления MPT в документ запросить число открытых пользовательских карт:
Код
// Сколько было
int sitcount = mapGetSiteCount(hmap);
// Добавить MPT
mapAppendAnyData(hmap, mptname, 0);
// Сколько стало
int last = mapGetSiteCount(hmap);
int first = sitcount + 1;
Добавлены карты с номерами от first до last
Пользователь
Сообщений: Регистрация: 06.05.2025
07.05.2025 13:30:26
Спасибо опция не отображать всю карту заработала. пытаюсь на основе вашего примера mapobj задать отображение только например линейных объектов код:
MapHandle = mapOpenAnyDataPro("pegas50k.mpt",GENERIC_READ,&error,0,0); // в начале кода
..... // метод настройки отображения вызывается из меню if (MapHandle == 0) return; . int local = 0; // FlagDrawCross = 0;
Не совсем по теме настройки набора данных для отображения. Возникла необходимость установить шкалу отображения (например 5000 м). под шкалой имеется ввиду расстояние от центра отображения карты на экране до верха экрана не подскажите как этом можно сделать с помощью MAPI ?
Администратор
Сообщений: Регистрация: 05.06.2008
25.05.2025 17:18:29
Примерно так:
Код
// -----------------------------------------------------------------
// Функция изменения масштаба по координатам фрагмента в метрах - показать на все окно
// -----------------------------------------------------------------
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;
}
Пользователь
Сообщений: Регистрация: 06.05.2025
26.05.2025 14:22:23
Спасибо за пример. Подскажите есть аналог ли метода ViewPlanePoint в версии 15 в 14 такой метод есть а в 15 что-то не находится
Администратор
Сообщений: Регистрация: 05.06.2008
27.05.2025 08:44:19
Вид, примерно, такой:
Код
// -----------------------------------------------------------------------------
// Отобразить участок карты, на котором расположена заданная точка,
// (в метрах) в центре окна
// -----------------------------------------------------------------------------
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();
}
}