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

Нарисовать на карте площадной объект с полупрозрачным фоном

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 4 След.
RSS
Нарисовать на карте площадной объект с полупрозрачным фоном
 
Для уточнения, пришлите нам на почту, пожалуйста, пример карты  на которой проявляется данное поведение (не правильно выполняется перевод координат)
 
Спасибо, разобралась! Дело было в некорректной карте!
 
Цитата
Павел Матвеев написал:
Приветствую!

Объекты сохраняются при вызове commit в любом случае. Или на основной карте, или на пользовательской.
При помощи  mapCreateSiteObject  можно создавать объекты и на основной карте, если hsite 0 указать (вроде).
Если нужно отобразить объекты, которые были нанесены ранее на пользовательскую карту (не на временную, естественно), то после открытия ее надо добавить к основной ( mapAppendData *()).
Альтернативно, можно почитать про работу с проектами (mpt) в документации. Сохранять набор карт в виде проекта, и затем открывать. В этом случае все пользовательские карты, и прочие ресурсы добавятся автоматически.


С уважением,
Матвеев П.В.
Доброе утро! А можете пожалуйста подсказать, где можно именно в документации прочитать про mpt.
Изменено: Анастасия - 09.10.2018 09:47:29
 
Приветствую!

mapapi:

mapOpenProject
mapSaveProject

С уважением,
Матвеев П.В.
 
Цитата
Vladimir Letov написал:
Создать сектор круга можно при помощи функции mapCreateArc.

Пример ее использования:
Код
   HMAP mapHandle = ui.DMapView1->GetMapHandle();
  HOBJ objectHandle = mapCreateObject(mapHandle, IDDOUBLE2, 0);
  if (objectHandle != 0)
  {
      if (mapRegisterObjectByKey(objectHandle, "S1000000002") != 0)
      {
          DOUBLEPOINT center = { mapGetMapX2(mapHandle), mapGetMapY1(mapHandle) };  // левый верхний угол
          double radius = 1000.0;   // 1 km
          double leftAngle = 10.0 * M_PI / 180.0;    // + 10
          double rightAngle = -10.0 * M_PI / 180.0;  // - 10
          DOUBLEPOINT left = { 0.0, 0.0 };
          DOUBLEPOINT right = { 0.0, 0.0 };
          left.x = center.x + radius * sin(leftAngle);
          left.y = center.y + radius * cos(leftAngle);

          right.x = center.x + radius * sin(rightAngle);
          right.y = center.y + radius * cos(rightAngle);

          mapAppendPointPlane( objectHandle, center.x, center.y, 0 );

          if ( mapCreateArc(mapHandle, objectHandle, &left, ¢er, &right, radius) != 0 )
          {
            mapAppendPointPlane( objectHandle, center.x, center.y, 0 );
            mapCommit(objectHandle);
          }
      }
      mapFreeObject(objectHandle);
  }

 
Обращаю внимание, что функция создает именно дугу, а не сектор, т.е. необходимо как в примере выше задать начальную и конечную точки, чтобы получился сектор.
Доброе утро!

Не совсем поняла, как нарисовать полупрозрачный сектор.  Правильно я понимаю, какая точка является началом сектора? Прикладываю изображение.
Код
   int bgColor = 0xffff00;          // Цвет тонирования
   int fgColor = 0xFF << (8 * 2);   // Цвет рамки

   HOBJ hobj = mapCreateSiteObject(hmap, hsite,IDDOUBLE2, 0);
   if (hobj != 0)
   {
       if (mapRegisterDrawObject(hobj, 0, LOCAL_SQUARE) != 0)
       {
           IMGPOLYGONGLASS fill;
           memset((void*) &fill, 0, sizeof(fill));
           fill.Color = bgColor;
           fill.Transparency = 70;
           mapAppendDraw(hobj, IMG_POLYGONGLASS, (const char*) &fill);
           IMGLINE border;
           memset((void*) &border, 0, sizeof(border));
           border.Color = fgColor;
           border.Thick = PIX2MKM(2);
           mapAppendDraw(hobj, IMG_LINE, (const char*) &border);

           DOUBLEPOINT pointStart = {6168349.0, 7416665.0};
           //Дуга
           DOUBLEPOINT center = { 6169418, 7416509};  //  центр дуги?
           double radius = 10000.0;   // 1 km
           double leftAngle = 30.0 * M_PI / 180.0;    // + 10
           double rightAngle = -30.0 * M_PI / 180.0;  // - 10
           DOUBLEPOINT left = { 0.0, 0.0 };
           DOUBLEPOINT right = {0.0, 0.0 };
           left.x = center.x + radius * sin(leftAngle);
           left.y = center.y + radius * cos(leftAngle);
           right.x = center.x + radius * sin(rightAngle);
           right.y = center.y + radius * cos(rightAngle);
           // дуга End

           mapAppendPointPlane(hmap, pointStart.X, pointStart.Y);
           mapAppendPointPlane(hmap, left.X, left.Y);

           // Дуга начало
           if ( mapCreateArc(hmap, hobj, &left, &#162;er, &right, radius) != 0 )
               std::cout<<"Arc OK"<<std::endl;
           // Дуга Конец

           mapAppendPointPlane(hmap, right.X, right.Y);
           mapAppendPointPlane(hmap, pointStart.X, pointStart.Y);

           mapCommitObject(hobj);
           mapFreeObject(hobj);
           ui->viewMap->Repaint();
       }
   }
Но так не работает(

а вот как дальше сюда добавить дугу, чтобы это было единой фигурой с полупрозрачным контуром я не понимаю. Изображение поясняющее мой вопрос https://yadi.sk/i/6BpCze24Jv2TSw

Метод  mapAppendPointPlane возращает 0...

Попробовала так:
 mapPlaneToGeo(hmap,  &pointStart.X, &pointStart.Y );
 int i = mapAppendPointGeo(hmap, pointStart.X, pointStart.Y);
mapAppendPointGeo возвраает 0..


Самое интересное в том, что проверила другой метод в котором я многоугольник рисую и там тоже теперь метод mapAppendPointGeo возращает 0.. Причем это проявляется на карте ПОдольска. Попробовала на другой карте, там рисуется, но не с первого раза..
Изменено: Анастасия - 11.10.2018 09:58:07
 
По поводу построения сектора: сначала задается точка 1 (здесь и далее нумерация из Вашего рисунка), потом вызывается функция mapCreateArc, затем еще раз задать точку 1, чтобы замкнуть объект (все площадные объекты должны быть замкнуты).
По поводу прозрачного - необходимо в классификаторе выбрать с типом Полигон-цветное стекло, он позволяет задать прозрачность.
По поводу карты Подольска - используйте, пожалуйста, вместо нее карту Ногинска. Я заметил некоторые особенности на карте Подольска, в том числе при построении сектора, когда писал пример для Вас.
 
Добрый день!

Возвращаясь к рисованию многоугольника с закрашенным контуром, можно ли посередине этого прямоугольника написать название этой области (любое, которое мы посчитаем нужным)?
Изменено: Анастасия - 15.10.2018 16:03:16
 
Приветствую!

Отдельным пользовательским объектом  типа подпись, наверняка.
Пример создания подписи: http://www.gisweb.ru/forum/messages/forum7/topic8027/message58670/8027#message58670
Остается только определить "середину" произвольного многоугольника)

С уважением,
Матвеев П.В.
 
Доброе утро!

Спасибо за помощь!) Осталось понять, как найти центр произвольного многоугольника)

Уточните пожалуйста как можно задать размер шрифта?
Заполнила поле height в структуре IMGTEXT. Пробовала разные значения, реакции никакой. Высота текста не меняется.
         
Код
            IMGTEXT parm;
            memset((void*) &parm, 0, sizeof(parm));
            parm.Color = 0x000000;
            parm.BkgndColor = 0xc299ff;
            parm.ShadowColor = IMGC_TRANSPARENT;
            parm.Flag = IMGTEXT_SCALE;
            parm.Height = PIX2MKM(500);
            parm.Outline = 0;

            mapAppendDraw(hobj, IMG_TEXT, (const char*) &parm);
            mapAppendPointPlane(hobj, x, y, 0);
            mapPutText(hobj, text, 0);
            mapCommitObject(hobj);
Изменено: Анастасия - 16.10.2018 10:11:58
 
Приветствую!

А как Вы проверяете разницу? Надо смотреть на базовом масштабе.
parm.Flag = IMGTEXT_SCALE; задает растягивание по метрике, т.е. высота рассчитывается автоматически, а то что вы задаете - игнорируется.


Дополнительно, посмотрите методы mapSetObjectPress и mapSetObjectScale

ЗЫ: 500 пикселей не много?

С уважением,
Матвеев П.В.
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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