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

Перерисовка части карты

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Перерисовка части карты, Перерисовка части карты при вызове команды QDMapObj ::Center()
 
Добрый день.

У меня следующая задача: нарисовать на карте Подольска несколько пальм.
Делаю я это в программе, основанной на примере myfirst посредством следующего кода:

Код
// Отрисовка пальмы.
HOBJ currentTree = mapCreateSiteObject(MyMap, hMapper, IDDOUBLE2, 0);
mapRegisterObject(currentTree, 79713000, LOCAL_POINT); // пальма
mapAppendPointPlane(currentTree, _x, _y);
mapAppendSemantic(currentTree, 31002, "0", 20);

mapCommitObject(currentTree);
    
// Помещение отрисованной пальмы в центр экрана.
QDMapObj *mapObj = new QDMapObj(centralWidget(), "mapObj");
mapObj->SetMapView(this->ui.DMapView1);
mapObj->SetObjHandle(currentTree);
mapObj->Center();
delete mapObj;
mapObj = 0;

Данный код работает корректно.
   
Проблема заключается в том, что центрироваться на пальме мне надо не всегда. В случае, если я не провожу центровку на пальме (не выполняю команду  mapObj->Center()),
то пальма не будет отрисована, пока я не вызову следующие команды:

Код
    
ui.DMapView1->UpdatePictureBorderForAll();
ui.DMapView1->repaint();

Мне это не подходит, поскольку тогда карта у меня будет часто "мерцать".
Если я правильно понимаю, при  вызове команды Center() происходит перерисовка только определённой части карты.
Подскажите пожалуйста, как мне добиться этой локальной перерисовки, не центрируясь при этом на пальме?

Использую ГИС конструктор для QT Designer, ОС Ubuntu.
 
1. Обновлять Qt виджет при помощи repaint - не хорошо. Есть update. (repaint - принудительно прямо сейчас, update - поставить в очередь)
2. Есть метод Repaint(int x, int y, int width, int height) у QDMapViewWindow - вот ему можно задать какую часть карты обновить.

Исходные тексты компонентов приведены в каталоге /usr/share/gisdesigner/examples/Sources
Изменено: Vladimir Letov - 10.10.2018 14:58:39
 
Добрый день, Владимир.
Благодарю Вас за советы.
С помощью метода QDMapViewWindow::Repaint(int x, int y, int width, int height) пальму удалось отрисовать.

Возникли следующие вопросы:
1. Имеется ли аналог метода QDMapView::UpdatePictureBorderForAll(), который перерисовывает границы только у объектов,
   находящихся в заданном районе?
2. Я ознакомился с кодом метода QDMapObj::Center(). За что отвечает переменная GetMapView()->VarRendering?
3. Помимо пальм мне также требуется рисовать линии. Линии я рисую с помощью следующего кода:

Код
    HOBJ lineObj = mapCreateSiteObject(this->MyMap, this->hMapper, IDDOUBLE2, 0);
    mapRegisterDrawObject(lineObj, 0, LOCAL_LINE);

    IMGLINE line;
    line.Thick = PIX2MKM(2);
    line.Color = RGB(250,0,0);

    mapAppendDraw(lineObj, IMG_LINE, reinterpret_cast<const char*>(&line));

    mapAppendPointPlane(lineObj, _x, _y, 0);
    mapAppendPointPlane(lineObj, _x1, _y1, 0);

    mapCommitObject(lineObj);


После этого я вызываю выше упомянутый метод QDMapViewWindow::Repaint(int x, int y, int width, int height).
В результате линия прорисовывается только на концах. Примечательно, что если вместо метода
QDMapViewWindow::Repaint(int x, int y, int width, int height) вызвать метод QDMapViewWindow::Repaint(),
то линия отрисовывается корректно.
 
Функция QDMapViewWindow::Repaint(int x, int y, int width, int height) какие в себя координаты принимает? Экрана? QDMapViewWindow? Или метры в СК42? В документации об этом ни слова!
 
Здравствуйте!

Функция Repaint() класса QDMapViewWindow принимает на вход координаты участка карты в пикселах (соответствует значению PP_PICTURE, maptype.h). Соответствующую информацию добавим в документацию - спасибо.
Страницы: 1
Читают тему (гостей: 1)



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

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