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

Подготовка карты для отображения в окне с координатами

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2
RSS
Подготовка карты для отображения в окне с координатами
 
Цитата
Oleg Belenkov написал:
Закрашивайте фон отдельно от рисования карт
Возможно я не могу правильно сформулировать вопрос...
Посмотрите пожалуйста рисунок. Это я делаю в вашем примере mapinfo. Ваш пример работает следующим образом...
При установке масштаба 1:1 000 000 со смещением -200 пикселов получается картинка
Скрытый текст
Вопрос как реализовать вариант чтобы при уменьшении масштаба карта уменьшалась, а подложка (или основа или габариты) нет.
Иначе я не могу видеть часть карты при смещении, как представлено на рисунке.
Изменено: Алексей Рылякин - 21.10.2020 09:19:56
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Поправьте значение нижнего правого угла, чтобы он соответствовал вашему изображению.
Увеличьте его значение.
 
Цитата
Oleg Belenkov написал:
Поправьте значение нижнего правого угла, чтобы он соответствовал вашему изображению.
Увеличьте его значение.
Не получается Олег.

Синим цветом закрасил для наглядности отображения подложки(основы) карты.
Перепробовал все варианты.
Сдвигаю влево-вниз (-100, -100) верхний угол карты вместе с подложкой (основой) относительно окна отображения.
Скрытый текст
Сдвигаю карту относительно подложки(основы) (100, 0).
Скрытый текст
Но нижний угол подложки(основы)не могу сдвинуть.
Что и где менять в методе DrawMap для фиксации угла подложки (ну что бы он меньше чем мое окно не рисовался) в углу окна отображения карты, в моем случае это 600*600 пикселов.

Скрытый текст
Изменено: Алексей Рылякин - 21.10.2020 15:28:22
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Если размер фоновой области (клиентской области) окна, например, 800 на 600,
то значение правой нижней точки RECT ставим 800 и 600, а не размер изображения карты.
Если левая верхняя точка равна 0,0, то карта рисуется от верхнего левого угла.
Закрашиваемый фон в этом случае должен быть на все окно.

Начинаем уменьшать левую верхнюю точку в отрицательную область - карта должна рисоваться правее и ниже.
 
Цитата
Oleg Belenkov написал:
Если размер фоновой области (клиентской области) окна, например, 800 на 600,то значение правой нижней точки RECT ставим 800 и 600, а не размер изображения карты.

Значит изначально я правильно менял эти параметры.....

Не получается это сделать в данном примере mapinfo в методе void MapWidget::DrawMap(QPainter* p, int cx, int cy, int cw, int ch).
Окно у меня  в вашем тестовом примере зафиксировано 600*600 пикселов.
При масштабе до 1:1000000 данные cw и ch передаются в метод 580,580 из-за скролинга, так как карта больше моего окна.
Когда карта меньше окна отображения, начиная с масштаба 1:1000000 и далее cw и ch уменьшается и я не могу его установить 600*600.

Подскажите как это сделать. Не могу разобраться.
Попробуйте сделать в этом примере.



Метод void MapWidget::paintEvent(QPaintEvent *event)
Скрытый текст
Методы этого класса, а именно:
event->rect().right()
и
event->rect().bottom()
возвращают значение меньше габаритов моего окна, когда масштаб карты меньше этого окна.
Соответственно и синяя область рисуется не во все окно.
Так как я ранее не был связан с графикой я не могу пока понять как это исправить, а именно что бы значения менее чем 600*600 не возвращалось.
Изменено: Алексей Рылякин - 21.10.2020 16:35:16
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Здравствуйте.

У класса MapWidget можно запросить текущие размеры окна, например, с помощью методов this->width(), this->height().
Затем можно указать условие их применения: если приходящее    значения оказывается меньше полученных размеров окна, то вместо них использовать размеры окна.

 
.
Изменено: Алексей Рылякин - 23.10.2020 10:55:22
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Здравствуйте.

Уточните, пожалуйста, используемую версию ГИС Конструктор.
 
.
Изменено: Алексей Рылякин - 23.10.2020 10:54:38
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Ниже приводим пример отрисовки подложки и фрагмента карты с произвольным смещением:

customwidget.h:
Код
#ifndef CUSTOMWIDGET_H
#define CUSTOMWIDGET_H


#include <QWidget>


class CustomWidget : public QWidget
{
  Q_OBJECT
  
  public:
  CustomWidget(QWidget *parent = NULL);
  
  protected:
  void paintEvent(QPaintEvent *event);
};


#endif // CUSTOMWIDGET_H
customwidget.cpp:
Код
#include <QImage>
#include <QPainter>


#include "mapapi.h"
#include "qdmcmp.h"


#include "customwidget.h"


CustomWidget::CustomWidget(QWidget *parent) : QWidget(parent)
{
  QDMapView();
}


void CustomWidget::paintEvent(QPaintEvent *event)
{
  QImage paintimage(this->width(), this->height(), QImage::Format_RGB32);
  paintimage.fill(Qt::blue);


  HMAP mapHandle = mapOpenData("/tmp/Noginsk/Noginsk.sit");


  int paintWidth = 200;
  int paintHeight = 200;


  RECT rectDraw;
  rectDraw.left = 1000;
  rectDraw.top = 1000;
  rectDraw.right = rectDraw.left + paintWidth;
  rectDraw.bottom = rectDraw.top + paintHeight;


  XIMAGEDESC xImageDesc;
  xImageDesc.Point = (char *)paintimage.bits();
  xImageDesc.Width = paintimage.width();
  xImageDesc.Height = paintimage.height();
  xImageDesc.Depth = 32;
  xImageDesc.CellSize = xImageDesc.Depth / 8;
  xImageDesc.RowSize = xImageDesc.Width * xImageDesc.CellSize;


  mapPaintToXImage(mapHandle, &xImageDesc, 300, 300, &rectDraw);


  QPainter painter(this);
  painter.drawImage(0, 0, paintimage);


  mapCloseData(mapHandle)
}

main.cpp:
Код
#include <QApplication>


#include "customwidget.h"


int main(int argc, char *argv[])
{
  QApplication a(argc, argv);


  QWidget * customWidget = new CustomWidget();
  customWidget->resize(800, 600);
  customWidget->show();


  return a.exec();
}
Изменено: Константин Ганюшин - 23.10.2020 17:23:05
Страницы: Пред. 1 2
Читают тему (гостей: 1)



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

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