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

Программное создание условного знака, который сохраняет размеры при изменении масштаба карты

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Программное создание условного знака, который сохраняет размеры при изменении масштаба карты
 
Здравствуйте.

Стоит задача запрограммировать отображение на карте некоторого условного знака. В проекте, для которого стоит задача, используется классификатор operator.rsc, в нем требуемый условный знак отсутствует, и изменение классификатора крайне не желательно. Поэтому остается вариант создать требуемый условный знак программно. Мне известно, что можно зарегистрировать объект функцией mapRegisterDrawObject, добавить к нему примитивы функцией mapAppendDraw и точки для них функцией mapAppendPointPlane. Но в функцию mapAppendPointPlane передаются координаты на карте, поэтому при изменении масштаба карты условный знак, нарисованный функциями mapAppendDraw и mapAppendPointPlane, будет изменять свои размеры пропорционально масштабу карты. Как можно программно создать условный знак, отображаемые размеры которого остаются постоянными при изменении масштаба карты? Читал, что можно как-то создавать условные знаки с помощью IMLAPI, при этом создаются библиотеки .so, которые надо подключать к проекту. Можно ли как-то в данном случае обойтись без IMLAPI?

Заранее спасибо.
 
Здравствуйте!

Для установки признака масштабируемости графического объекта применяется функция mapSetObjectScale() (mapapi.h):
Код
 // Установить/Запросить масштабируемость объекта
 // Применяется ТОЛЬКО для графических объектов, имеющих внутренний код равный нулю
 // Для объектов из классификатора значение игнорируется
 // scale = 1 для установки масштабируемости при увеличении карты
 //         0 для сброса признака масштабируемости
 // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSetObjectScale(HOBJ info, long int scale);
_MAPIMP long int _MAPAPI mapGetObjectScale(HOBJ info);
 
Здравствуйте!

В примере mapobj в функцию MapWidget::CreateObjects вместо создания четырех групп объектов добавил следующий код:
Код
{
    HOBJ hobj = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
    mapRegisterDrawObject(hobj, 0, LOCAL_LINE);
    mapAppendPointPlane(hobj, x, y);
    mapAppendPointPlane(hobj, x, y+1000);
    IMGLINE parm;
    parm.Color = RGB(0, 0, 0);
    parm.Thick = PIX2MKM(3);
    mapAppendDraw(hobj, IMG_LINE, (char*)&parm);
    mapSetObjectScale(hobj, 0);
    mapCommitObject(hobj);
}
В результате, если запустить проект и нажать "Объекты/Создать объекты на пользовательской карте", на карте появляется линия, длина которой меняется при изменении масштаба карты, хотя функция mapSetObjectScale возвращает 1.
 
Цитата
Дмитрий написал:
Здравствуйте!

В примере mapobj в функцию MapWidget::CreateObjects вместо создания четырех групп объектов добавил следующий код:
Код
 {
    HOBJ hobj = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
    mapRegisterDrawObject(hobj, 0, LOCAL_LINE);
    mapAppendPointPlane(hobj, x, y);
    mapAppendPointPlane(hobj, x, y+1000);
    IMGLINE parm;
    parm.Color = RGB(0, 0, 0);
    parm.Thick = PIX2MKM(3);
    mapAppendDraw(hobj, IMG_LINE, (char*)&parm);
    mapSetObjectScale(hobj, 0);
    mapCommitObject(hobj);
}
 
В результате, если запустить проект и нажать "Объекты/Создать объекты на пользовательской карте", на карте появляется линия, длина которой меняется при изменении масштаба карты, хотя функция mapSetObjectScale возвращает 1.
Добрый день!

Для того, чтобы линия сохраняла фиксированную длину, можно реализовать ее в составе векторного объекта. В этом случае вторая точка метрики будет задавать направление линии. Для подготовки векторного знак можно воспользоваться средствами редактора классификатора в настольных продуктах или добавить объект программно в классификатора. В случае, если у Вас нет возможности вносить правки в рабочий классификатор, можно подготовить отдельный классификатор с необходимыми знаками, создать на основе него пользовательскую карту и наносить нее требуемые знаки.
В качестве альтернативного варианта для отображения некоторых символов можно использовать в подписи знаки из шрифтов TrueType, зарегистрированных в операционной системе.
Если Вы используете классификатор operator.rsc и при работе у Вас возникает необходимость в знаках, которые на текущий момент отсутствуют в классификаторе, пожалуйста, сообщите нам, какие знаки требуется добавить в классификатор, и мы рассмотрим возможность его дополнения.  
С уважением, Демиденко Р.А.
 
В проекте, которым я занимаюсь, требуется наносить под объектами из классификатора подпись, заключенную в рамку (незакрашенный прямоугольник). Размеры подписи могут быть разными, поэтому фиксированная длина линии не подойдет. Как разместить подпись к объекту без рамки, я разобрался - создать объект типа подпись, точку привязки сделать совпадающей с точкой привязки объекта из классификатора, выровнять подпись с помощью функций mapPutTextHorizontalAlign и mapPutTextVerticalAlign и добавления пустых строк. С рамкой получается сложнее - надо как-то получить прямоугольник, занимаемый текстом подписи, и на его основе нанести линии. Как я понял, в моем случае остается вариант использования IMLAPI.
Цитата
В случае, если у Вас нет возможности вносить правки в рабочий классификатор, можно подготовить отдельный классификатор с необходимыми знаками, создать на основе него пользовательскую карту и наносить нее требуемые знаки.
- имеется в виду вместо operator.rsc создать свой классификатор, в который перенести используемые в проекте знаки и добавить знаки, отсутствующие в operator.rsc?
 
Цитата
Дмитрий написал:
- имеется в виду вместо operator.rsc создать свой классификатор, в который перенести используемые в проекте знаки и добавить знаки, отсутствующие в operator.rsc?
Добрый день!

Да, именно так. Создать дополнительный классификатор для работы с подписями
С уважением, Демиденко Р.А.
 
Добрый день!

То есть, в одном проекте можно использовать несколько классификаторов? Как бы вы посоветовали поступить в случае с рамкой вокруг подписи - создать дополнительный классификатор или использовать IMLAPI?
 
Цитата
Дмитрий написал:
То есть, в одном проекте можно использовать несколько классификаторов?
Добрый день!

Конечно, в проекте может быть разное количество карт и все со своими классификаторами.
Цитата
Дмитрий написал:
Как бы вы посоветовали поступить в случае с рамкой вокруг подписи - создать дополнительный классификатор или использовать IMLAPI?
Есть готовые варианты подписей. Их взять за основу и сформировать свой вид объекта в классификаторе.
С уважением, Демиденко Р.А.
 
Цитата
Конечно, в проекте может быть разное количество карт и все со своими классификаторами.
а одна карта может быть с несколькими классификаторами?
Цитата
Есть готовые варианты подписей. Их взять за основу и сформировать свой вид объекта в классификаторе.
где их можно взять?
 
Цитата
Дмитрий написал:
а одна карта может быть с несколькими классификаторами?
Нет, одна карта - один классификатор.
Цитата
Дмитрий написал:
где их можно взять?
Я приводил Вам пример карты в другой ветке форума
В составе продукта есть карта "shape.sitx", на которой есть несколько вариантов оформления подписи.
С уважением, Демиденко Р.А.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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