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

Вася Пупкин (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Вася Пупкин
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3
Рисование эллипса на карте
 
Доброе утро.
Александр, благодарю Вас за ответы.
На текущий момент научился рисовать эллипс "в лоб":
[CODE] this->MyMap = this->ui.DMapView1->GetMapHandle();
this->hMapper = mapCreateAndAppendTempSite(MyMap, "./map/Topo100t.rsc");

HOBJ ellipseObj = mapCreateSiteObject(this->MyMap, this->hMapper, IDDOUBLE2, 0);
mapRegisterDrawObject(ellipseObj, 21, LOCAL_LINE);

IMGSQUARE square;
square.Color = RGB( _redValue, _greenValue, _blueValue );
mapAppendDraw( ellipseObj, IMG_SQUARE, reinterpret_cast<const char*>(&square) );

double A, dA;
dA = M_PI / 180.0;
A = 0.0;
double buferX, buferY, newX, newY;
double radAngle = degreeAngle / 180.0 * M_PI;
while (A <= 2 * M_PI)
{
   // Вычисление координат точки эллипса.
   buferX = _rb * cos(A) + _centerX;
   buferY = -_ra * sin(A) + _centerY;

   // Поворот точки эллипса на заданный угол.
   newX = ( buferX - _centerX ) * cos(radAngle) - ( buferY - _centerY ) * sin(radAngle) + _centerX;
   newY = ( buferX - _centerX ) * sin(radAngle) + ( buferY - _centerY ) * cos(radAngle) + _centerY;

   // Добавление точки.
   mapAppendPointPlane(ellipseObj, newX, newY);

   A = A + dA;
}

mapCommitObject(ellipseObj);

ui.DMapView1->UpdatePictureBorderForAll();
ui.DMapView1->repaint();[/CODE]
Возникли следующие вопросы:
1. В какой слой добавляется эллипс на самом деле? В методе mapRegisterDrawObject я
   указываю слой 21 (В моём случае это заполняющие знаки). При этом если с помощью QDMapSelectDialog убрать какой-нибудь другой слой,
   а слой 21 оставить, то эллипс всё равно пропадает.
2. Начиная с определённого масштаба эллипс перестаёт рисоваться в силу своей малости. Как определить программно, что эллипс перестал рисоваться?
3. При закрытии карты эллипс не сохраняется. Как его сохранить на карте?
P.S. Теоретический вопрос - чем пользовательские карты (*.sit) отличаются от не пользовательских (*.map).
P.P.S. Существует ли учебник или методическое пособие по ГИС конструктору?
          Или кроме того, что выложено на сайте, больше ничего нет?
Рисование эллипса на карте
 
Ознакомился с выше упомянутым разделом.
Попытался нарисовать пунктирную линию.
За основу взял пример myfirst, в качестве карты использовал карту Подольска.
В итоге получился следующий код:[CODE] PAINTPARM Form; // Вид объекта на экране
   IMGDOT Image;              // Описание пунктирной линии
   PLACEDATA Place;        // Описание координат объекта (double)

   MyMap  =  this->ui.DMapView1->GetMapHandle();

   Form.Image = IMG_DOT;
   Form.Parm  = (char *)&Image;
   Form.Mode  = R2_XORPEN;

   Image.Color = RGB(255,0,0);
   Image.Thick = PIX2MKM(2);    //
   Image.Dash  = PIX2MKM(7);    //
   Image.Blank = PIX2MKM(3);    //

   int PointCount = 2;        //
   DOUBLEPOINT * Points = new DOUBLEPOINT[PointCount];
   Points[0].x = 6166368;
   Points[0].y = 7416920;
   Points[1].x = 6170679;
   Points[1].y = 7424867;

   Place.Count = 1;           // Объект состоит из одной части
   Place.PolyCounts = &PointCount;
   Place.Points = Points;

   RECT* rectDraw = new RECT();
   rectDraw->left = ( long int ) this->ui.DMapView1->geometry().left();
   rectDraw->top  = ( long int ) this->ui.DMapView1->geometry().top();
   rectDraw->right  = ( long int ) this->ui.DMapView1->geometry().right();
   rectDraw->bottom = ( long int ) this->ui.DMapView1->geometry().bottom();
   long int width = abs(rectDraw->right - rectDraw->left);
   long int height = abs(rectDraw->top - rectDraw->bottom);

   int MAPDEPTH = 32;
   int BMCELLSIZE = MAPDEPTH / 8;
   size_t size = width * BMCELLSIZE * height;

   char* BitMap = AllocateTheMemory(size);

   XIMAGEDESC ximagedesc;
   ximagedesc.Point     = BitMap;
   ximagedesc.Width     = ( long int ) ( rectDraw->right - rectDraw->left );
   ximagedesc.Height    = ( long int ) ( rectDraw->top - rectDraw->bottom);
   ximagedesc.Depth     = 32;
   ximagedesc.CellSize  = 4;
   ximagedesc.RowSize   = ( long int ) ( width * ximagedesc.CellSize );

   mapPaintUserObjectToXImage(MyMap, &ximagedesc, 0,
                              0, rectDraw, &Form,
                              &Place, PP_PLANE);

   this->ui.DMapView1->UpdatePictureBorderForAll();
   this->ui.DMapView1->repaint();
[/CODE]К сожалению, на текущий момент ничего не отрисовывается.
Возникли следующие вопросы:
1. Как данный код превратить в отрисовку эллипса?
2. Откуда на самом деле надо брать параметры MAPDEPTH, BMCELLSIZE, BitMap, CellSize?
3. В каком слое производится отрисовка?
4. Как потом обращаться к нарисованному объекту, чтобы можно было его изменить\удалить?
Рисование эллипса на карте
 
Доброе утро.
Подскажите пожалуйста, как нарисовать эллипс на карте?
В одной беседе ([URL=http://gisweb.ru/forum/forum7/topic8230/messages/?PAGEN_1=2]http://gisweb.ru/forum/forum7/topic8230/messages/?PAGEN_1=2[/URL]) товарищ упоминал об эллипсе как о части векторного знака IMG_VECTOREX.
Как рисовать векторные знаки IMG_VECTOREX, не нашёл ни на форуме, ни в примерах.
Буду рад примерам в виде кода.
Использую ГИС конструктор для QT Designer, ОС Ubuntu.
Страницы: Пред. 1 2 3



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

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