Могут ли в приведённом выше примере не выводиться надписи, если масштаб карты 1:900 000? При том, что поддерживается 1:1 000 000?
23.01.2020 08:53:22
Могут ли в приведённом выше примере не выводиться надписи, если масштаб карты 1:900 000? При том, что поддерживается 1:1 000 000?
|
|
|
|
23.01.2020 09:05:47
Карту Вы закрыли. Потом создаете и открываете временную карту. Во-первых, она открылась успешно? Рекомендую добавить проверку возвращаемого значения от mapCreateAndAppendTempSite. Во-вторых, в зарамочное оформление выносятся данные из паспорта указанной карты. В основном из структуры LISTREGISTEREX, которая для временных карт вообще не заполняется. Но часть параметров берется из структуры MAPREGISTEREX, который при некоторый условиях копируется во временную карту из основной, но не всегда. При создании временной карты параметры датума, эллипсоида, проекции и часть сведений из паспорта копируются из основной карты - той, что была первой, когда Вы получили hMap. Если основная карта - это не карта, а, например, геопортал, либо карта, но чтение паспорта для которой запрещено (при открытии с ГИС Сервера с соотв. полномочиями), - тогда во временную карту будут заполнены только параметры СК и проекции, а все метаданные паспорта останутся пустыми. Паспорт вновь созданной карты Вы самостоятельно не заполняете. Отсюда можно сделать вывод, что весьма мала вероятность успешного построения зарамочного оформления по временной карте, которая для Вас является по сути "черным ящиком", а заполнение ее паспорта весьма вариативно и зависит от целого ряда условий. Поэтому я бы не рекомендовал использовать временную карту в качестве исходной для формирования зарамочного оформления. |
|||
|
|
23.01.2020 14:58:58
Зависит от той логики, которую Вы хотите реализовать.
Не совсем понятно, зачем делать зарамочное оформление для новой и пустой карты. Но, если это так необходимо, то да, карту лучше создать реальную (не временную) - как минимум на время отладки Вашего приложения. Так Вы сможете хотя бы посмотреть паспорт этой карты в ГИС Панорама и убедится, что все параметры, которые подлежат переносу на рамку, заполнены. Теоретически можно использовать как постоянную, так и временную карту, если корректно заполнить структуры MAPREGISTEREX и LISTREGISTER. Функция Скорее всего, для корректного заполнения зарамочного оформления придется внести параметры MAPREGISTEREX и LISTREGISTER с помощью Зарамочное оформление изначально предназначено для оформления рамки номенклатурных листов. Поэтому информация о листе карты имеет важное значение. А в пользовательских картах (SIT, SITX, SITZ) это не является необходимым условием при создании, поэтому LISTREGISTER заполняется не всегда. Чтобы заполнить LISTREGISTER сразу при создании карты SIT, можно воспользоваться Подробное описание параметров шаблона зарамочного оформления |
|
|
|
23.01.2020 15:46:54
Большое спасибо за информацию!
Вообще задача следующая: Есть основная карта. Необходимо распечатать её часть - прямоугольную область, выбранную мышкой заданного стандартного размера с зарамочным оформлением, сеткой координат и т.д. Должна быть задана возможность двигать область мышкой. Соответственно её надо перерисовывать. Объекты, составляющие шаблон зарамочного оформления я получить не могу, чтобы их уничтожить. Поэтому необходим "слой", на котором я отображаю прямоугольник и, при необходимости перерисовки, просто его уничтожаю и создаю заново. Логика примерно такая. |
|
|
|
24.01.2020 11:26:36
Пересоздавать зарамочное оформление динамически, интерактивно меняя область и позиционирование, не есть хорошо, так как эта операция все таки требует определенных затрат.
В лучшем случае надо это делать один раз, когда пользователь уже выбрал ту область, которая должна быть оформлена. Ну или если уж очень надо показывать зарамочное оформление в процессе выбора области, то делать это не в процессе перемещения или редактирования области, а хотя бы в момент отпускания мыши. Для ускорения работы тут как раз можно посоветовать использовать временную карту, причем в памяти:
|
|||
|
|
13.02.2020 16:07:24
В данный момент, если я перебираю все листы и применяю соответствующие паспорта на пользовательской карте, прямоугольник зарамочного оформления перестаёт рисоваться совсем. Он отображается только если я "масштабирую" карту с помощью колесика мышки. И отображается только начиная с определённого масштаба. И по прежнему не рисуется ничего кроме рамки.
В данный момент код выглядит так: dfarmeFrm = new DFRAME; dfarmeFrm->X1 = paperPP_BR.x; dfarmeFrm->Y1 = paperPP_TL.y; dfarmeFrm->X2 = paperPP_TL.x; dfarmeFrm->Y2 = paperPP_BR.y; if (!mapCloseSiteForMap(hMap, hSite)) { qDebug() << "ОШИБКА! Пользовательская карта корректно не закрылась!"; } QString rscFileName = "frm"+QString::number(/*scale*/500000)+".rsc"; QString frmFileName = QString::number(/*scale*/500000)+".frm"; qDebug() << "Имена файлов классификатора и формы " << frmFileName << rscFileName; const WCHAR *rsc = rscFileName.toStdWString().c_str(); hSite = mapCreateAndAppendTempSitePro(hMap,rsc, 0); if (!mapGetDocProjection(hMap, &mapRegTemp, &mapDatumTemp, &mapEllTemp)) { qDebug() << "ОШИБКА! Не получены реквизиты паспорта основной карты (MAPREGISTEREX, DATUMPARAM, ELLIPSOIDPARAM)"; } for (int i = 1; i<mapGetListCount(hMap)+1; i++){ if (!mapGetMapInfoPro(hMap, i, &mapRegTemp, &listRegTemp, &sheetNameTemp)) { qDebug() << "ОШИБКА! Не получены реквизиты паспорта основной карты (MAPREGISTEREX, LISTREGISTER, SHEETNAMES)"; } if (!mapUpdateSiteInfoEx(hMap, hSite, &mapRegTemp, &listRegTemp, i, &mapDatumTemp, &mapEllTemp, 0)) { qDebug() << "ОШИБКА! Данные паспорта основной карты не перенесены на пользовательскую карту для печати"; } } if (hSite) { if (!mapAddMarginalRepresentationSite(hMap, hSite, frmFileName.toStdString().c_str(), dfarmeFrm)) { QMessageBox::information(nullptr, "Ошибка","Не удалось загрузить шаблон frm") ; } } else { qDebug() << "ОШИБКА! Пользовательская карта для отображения зарамочного оформления и печати не создана"; } // inputRectNum = mapCommitObject(inputRectObj); hView->Repaint();
Изменено: |
|
|
|
14.02.2020 13:15:14
Раз вы пользуетесь mapGetMapInfoPro, значит имеется многолистовая карта формата map.
Далее в созданный временный sit вы переносите паспортные данные из последнего листа (нашли в цикле, не понял зачем в цикле). А прямоугольник у вас для габаритов последнего листа, или на всю многолистовую карту? |
|
|
|
14.02.2020 13:54:55
Да, у меня есть многолистовая карта. Я создаю временный sit. sit, если я правильно понимаю, охватывает всю карту. Так как функция mapUpdateSiteInfoEx(hMap, hSite, &mapRegTemp, &listRegTemp, i, &mapDatumTemp, &mapEllTemp, 0)) принимает номер листа, я передал реквизиты всех листов, составляющих базовую карту. В частности координаты углов этих листов.
Прямоугольник у меня меньше листа и может располагаться в любом месте карты, затрагивать несколько листов. Мне необходимо добавить зарамочное оформление для куска карты, входящего в этот прямоугольник и распечатать полученный фрагмент карты. Кроме этого должна быть предусмотрена возможность передвигать прямоугольник.
Изменено: |
|
|
|
14.02.2020 14:05:27
Map - многолистовая карта. К map можно добавить несколько sit. Sit и лист карты не одно и тоже. Зачем вообще переносить параметры в sit? mapCreateAndAppendTempSitePro создает sit с параметрами основной карты.
|
||||
|
|
|||
© КБ Панорама, 1991-2024 Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности |