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

Сохранение пользовательских слоев

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

Тут очень все просто) Я ее открыла и увидела добавленный мной объект.

Может последовательность не та?

1) Открываю основную карту карту
2) Получаю идентификатор пользовательской карты
3) Добавляю объект на карту с учетом полученного идентификатора польз. карты
4) и далее, чтобы проверить я на основную карту накладываю свою пользовательскую
Изменено: Анастасия - 09.07.2018 16:45:37
 
Пример кода можно ?

Цитата
Я ее открыла и увидела добавленный мной объект.
Может вместе с основной картой ещё и пользовательская открылась ?
 
Здравствуйте!

Цитата
Анастасия написал:
Далее добавляю объектКод    HOBJ hObj = mapCreateSiteObject(hmap, hsite, IDDOUBLE2);   // создаём пустой объект на карте (контейнер)
   std::cout viewMap->Repaint();  Но на саму карту он не добавляется. Я этого не вижу. Хотя результат работы методов не равен 0.В результате работы данного кода объекты добавляются на основную карту и сохраняются на ней, а мне необходимо, чтобы они на пользовательской карте сохранялись.
Каким образом Вы проверяете, что объект был нанесен именно на базовую карту?
Если визуально, то необходимо убедиться, что отображение производится только пользовательской карты, а не базовой карты с прикрепленным к ней набором пользовательских слоев.

Цитата
Анастасия написал:
Как мне получить идентификатор созданной ранее пользовательской карты?
Функции создания пользовательских карт обычно возвращают идентификатор созданной карты (HSITE).
Если нужно получить идентификатор пользовательской карты, добавленной к главной, то можно воспользоваться семейством функций mapGetSiteIdent (sitapi.h):
Код
  // Определить идентификатор открытой пользовательской карты
  // по ее номеру в цепочке
  // hMap   - идентификатор открытой карты
  // number - номер пользовательской карты в цепочке
  // Если number == 0, возвращается идентификатор фоновой
  // (базовой) карты, равный hMap (он может применяться вместо HSITE)!
  // При ошибке возвращает ноль

_MAPIMP HSITE _MAPAPI mapGetSiteIdent(HMAP hMap, long int number);

  // Определить идентификатор открытой пользовательской карты
  // по имени файла паспорта
  // hMap - идентификатор открытой карты
  // name - имя файла паспорта пользовательской карты
  // При ошибке возвращает ноль

_MAPIMP HSITE _MAPAPI mapGetSiteIdentByName(HMAP hMap, const char *name);
_MAPIMP HSITE _MAPAPI mapGetSiteIdentByNameUn(HMAP hMap, const WCHAR *name);
 
Здравствуйте!

Подскажите пожалуйста, как правильно добавлять объекты на пользовательскую карту? Ранее я описала алгоритм как я это делаю.

1) я открываю карту базовую - SetMapFileName(имя базовой карты)
2) добавляю к базовой карте пользовательскую  карту ui->viewMap->VarMapSites->Append(fullname2);  (fullname2 - имя пользовательской карты *.sit)
При добавлении пользовательской карты я запоминаю порядковый номер в списке открытых карт совместно с основной картой

Итого, как я понимаю, открыта базовая карта, а поверх нее открыта пользовательская. Верно?


3) Далее, чтобы добавлять объекты на карту, я получаю HSITE
Код
    hsite2 = mapGetSiteIdent(hmap, тут указываю номер карты, полученный в пункте 2);
    std::cout<<"hsite = "<<hsite2<<std::endl;

Получаю не 0 hsite в результате

4) ДОбавляю объект на пользовательскую карту
Код
    HOBJ hObj = mapCreateSiteObject(hmap, hsite2, IDDOUBLE2);      // причем тут я указываю идентификатор пользовательской карты полученный ранее
    mapRegisterObject(hObj, 10092, LOCAL_POINT);
    mapAppendPointPlane(hObj, 6170267, 7411269, 0);                
    mapCommitObject(hObj);  

4) В результате с помощью метода mapGetSiteObjectCount  я вижу, что объектов на пользовательской карте стало больше, следовательно я делаю вывод, что объект добавился на пользовательскую карту.

НО Я НЕ ВИЖУ ЕГО НА КАРТЕ.   Или чтобы его увидеть на карте нужно еще какое-то действие сделать? Объясните пожалуйста где я допускаю ошибку?
Изменено: Анастасия - 10.07.2018 13:37:21 (дополнение)
 
Цитата
Или чтобы его увидеть на карте нужно еще какое-то действие сделать?
Попробуйте напрямую отрисовать требуемый вам участок карты в картинку  (после того как добавили объект), и посмотрите что там (есть ли объект).  Если есть - тогда да.
Код
 // mapapi.h
 // Вывести изображение карты в XImage (массив)
 // Описание структуры XIMAGEDESC в maptype.h
 // hmap - идентификатор открытых данных
 // x,y - координаты левого верхнего угла внутри
 // битовой области XImage для размещения изображения
 // rect - выводимый фрагмент карты
 // При ошибке в параметрах возвращает ноль

_MAPIMP long int _MAPAPI mapPaintToXImage(HMAP hmap, XIMAGEDESC *imagedesc,
                                           long int x, long int y, RECT *rect)
Просто вы задаёте координаты объекта, и соответственно можете попросить ядро панорамы отрисовать некоторый кусок карты в буфер XIMAGEDESC*, а потом его можно преобразовать в QImage и сохранить куда-нибудь.

Пример инициализации структуры размером w x h пикселей в формате
Цитата
QImage::Format_RGB16
:
Код
    XIMAGEDESC m_image;
    m_image.Depth = 16;
    m_image.CellSize = 2;
    m_image.Width = w;
    m_image.Height = h;
    m_image.RowSize = m_image.Width * m_image.CellSize;
    m_image.Point = new char[w*h*m_image.CellSize];
    long len = m_image.Width * m_image.Height * m_image.CellSize;
    m_image.Point = static_cast<char*>(
                                    memset(static_cast<void*>(m_image.Point),
                                           0,
                                           static_cast<size_t>(len)
                                           )
                );


То есть вы можете после инициализации структуры вызвать метод mapPaintToXImage с требуемым вам куском (регионом) карты,
а потом сохранить его в файл как-нибудь так:
Код
    QImage img(m_image.Point, w, h,
               m_image.RowSize,
               QImage::Format_RGB16);
    if (!img.save(file.absoluteFilePath(), "PNG")){
        qDebug() <<__FUNCTION__ << "can not save image to file";
    };

Только помните, что rect в параметрах mapPainToXImage = это прямоугольник в пикселях (PP_PICTURE). То есть вы сначала должны перевести координаты (PP_PLANE, плоские прямоугольные в системе карты) в систему PP_PICTURE( пиксели), и потом уже вычислять прямоугольник rect, который нужно отрисовать.
 
Владимир Егоров, Добрый день!
По идее, да, как вариант. Попробую проверить. Спасибо Вам за пример!

Мне кажется, что тут какая-то мелкая ошибочка и скорее всего она на поверхности даже. Может дело в том, что какая-то из карт перекрывает другую?

Как я понимаю, что верно указываю hMap, идентификатор открытой основной карты я же не должна его получать отдельно для каждой пользовательской карты?

P.S для отображения карты использую компонент QDMapView
Изменено: Анастасия - 10.07.2018 13:46:22
 
При отображении желательно использовать формат RGB32, все же 16-битные картинки ушли в прошлое (вместе с ДОС).
 
Vladimir Letov, спасибо, ок, но меня больше интересует основной вопрос этой ветки форума)
Изменено: Анастасия - 10.07.2018 13:58:39
 
Цитата
Анастасия написал:
НО Я НЕ ВИЖУ ЕГО НА КАРТЕ.   Или чтобы его увидеть на карте нужно еще какое-то действие сделать? Объясните пожалуйста где я допускаю ошибку?
Здравствуйте!

Вы формируете внешний вид объекта из файла tmp3.bmp (см. рисунок ниже), а с картой лежит файл test.bmp
Из-за этого и нет внешнего вида на карте.
С уважением, Демиденко Р.А.
 
Да, у меня была опечатка. Просто я много экспериментировала при решении этой задачи и забыла поправить. Дело в том, что при добавлении изображения в классификатор в явном виде не написано какого размера должно быть изображение, поэтому пришлось это определять эмпирическим путем.

Спасибо всем участвующим за помощь!
Изменено: Анастасия - 10.07.2018 15:52:11
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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