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

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

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 4 След.
RSS
Сохранение пользовательских слоев
 
Владимир Егоров,по идее так должно быть, с этим я благодаря Вам разобралась. Но пока у меня метод mapCreateAndAppendSiteForMap возращает 0. Причем идентификатор карты я получаю корректно, не равен 0.[TABLE][TR][TH][/TH][/TR][/TABLE]
Цитата
[TABLE][TR][TH]Цитата[/TH][/TR][TR][TD]Также пока не ясно, как сохранить пользовательскую карту с уже добавленными объектами?[/TD][/TR][/TABLE]Сохранить - в каком смысле? Скопировать куда-то ?
Я имею ввиду следующее. 1 шагом я физически создаю пользовательскую карту (по уже открытой карте), далее я на нее добавляю необходимые объекты и мне необходимо, чтобы потом другой пользователь мог открыть мою карту и наложить поверх своей и увидеть соответствующую обстановку (добавленные мной объекты).

Как я поняла, имея HSITE я могу добавить объекты на вновь созданную карту след. образом
Код
    HOBJ hObj = mapCreateSiteObject(hmap, hsite, IDDOUBLE2);   
    mapRegisterObject(hObj, 10097, LOCAL_POINT);
    mapAppendPointPlane(hObj, 6170267, 7411269, 0);                 
    mapCommitObject(hObj);                                                          
    mapFreeObject(hObj);                                                       
    ui->viewMap->Repaint();  

Верно? Мне необходимо, чтобы при закрытии ПО эти объекты остались на этой карте.

Цитата
Под сохранить Вы наверное имеете в виду закрыть (mapCloseSIteForMap),  потом физически его куда-то скопировать, и в другом месте другой  пользователь должен его открыть уже с помощью mapOpenSiteForMap. Только  главная карта должна быть такой-же. Ну или хотя бы в той же системе  координат и на тот же район, а то у вас этот Sit улетит куда-то в  тартарары наверное.

Да, Вы правильно меня поняли.  Спасибо за ответ!
Изменено: Анастаия - 09.07.2018 13:51:36
 
Цитата
Верно? Мне необходимо, чтобы при закрытии ПО эти объекты остались на этой карте.
Ну так они останутся.
Цитата
Но пока у меня метод mapCreateAndAppendSiteForMap возращает 0.
В первую очередь сделайте все пути без кириллицы. Если так заработает - разберитесь с Koi8R, у меня используется следующая функция:
Код
QByteArray gis::common::convertStringToKOI8_R(const QString &s)
{
    return QTextCodec::codecForName("KOI8-R")->fromUnicode(s);
}


//как используется:
// пример 1

    QByteArray sitName = gis::common::convertStringToKOI8_R(m_file.absoluteFilePath());
    m_site = panorama::mapOpenSiteForMap(m_parentMap->descriptor(), sitName.constData(),
                               OpenMode);
// пример 2
SiteDescriptor MapProjectAccess::createSit(const QFileInfo &rscFile,
                                           const UserLayer::Id layerId)
{
    QString sitFileName = gis::common::convertGUIDtoString(layerId);
    QByteArray rscFilePath = gis::common::convertStringToKOI8_R(
                rscFile.absoluteFilePath());
    QFileInfo mainFile = mainMap()->file();
    QDir mainDir = mainFile.dir();
    mainDir.mkdir(UserLayersDirName);
    QDir userLayersDir = mainDir;
    if (!userLayersDir.cd(UserLayersDirName)){
        qWarning() << __FUNCTION__ << "can't go to dir" << userLayersDir.filePath(UserLayersDirName);
        return {};
    }
    if (!userLayersDir.mkdir(sitFileName)){
        qWarning() << __FUNCTION__ << "can't create dir for sit" << sitFileName;
        return {};
    }
    QDir sitDir = userLayersDir;
    if (!sitDir.cd(sitFileName)){
        qWarning() << __FUNCTION__ << "can't go to dir" << sitDir.filePath(sitFileName);
        return {};
    }
    QByteArray sitFilePath = gis::common::convertStringToKOI8_R(sitDir.filePath(sitFileName + ".sit"));
    SiteDescriptor ret = panorama::mapCreateAndAppendSiteForMap(mainMap()->descriptor(),
                                                      sitFilePath.constData(),
                                                      rscFilePath.constData());
    if (!ret.isValid()){
        qWarning() << __FUNCTION__ << "mapCreateAndAppendSiteForMap call failed";
    }
    return ret;

}

 
Владимир Егоров,спасибо за помощь. От кириллицы в первую очередь избавилась, все равно пока 0 возвращает.


По идее и кодировку задаю, но все равно пока метод mapCreateAndAppendSiteForMap 0 возращает
Код
    QTextCodec *CodecKOI8R = QTextCodec::codecForName("KOI8-R");
    if (hmap == 0)
        return;

    char mpName[1024];
    char rName[1024];

    QString mapName = "/home/user/GIS/Projects/gisdesigner/examples/Data/testMap/Podolsk/layer/layer1.sit";
    std::strncpy(mpName, CodecKOI8R->fromUnicode(mapName).data(), sizeof(mpName));
    QString rscName = "/home/user/GIS/Projects/gisdesigner/examples/Data/testMap/Podolsk/layer/layersc.rsc";
    std::strncpy(rName, CodecKOI8R->fromUnicode(rscName).data(), sizeof(rName));

    HSITE st = mapCreateAndAppendSiteForMap(hmap, mpName, rName);
    std::cout<<"create map = "<<st<<std::endl;               // Возращает 0

    ui->viewMap->Repaint();
Изменено: Анастаия - 09.07.2018 14:24:39
 
Использовала Вашу функцию. Метод по прежнему возращает 0.
Код
    QString mapName = "/home/user/GIS/Projects/gisdesigner/examples/Data/testMap/Podolsk/layer/layer1.sit";
    QByteArray ba = QTextCodec::codecForName("KOI8-R")->fromUnicode(mapName);
    QString rscName = "/home/user/GIS/Projects/gisdesigner/examples/Data/testMap/Podolsk/layer/layersc.rsc";
    QByteArray ba1 = QTextCodec::codecForName("KOI8-R")->fromUnicode(rscName);
    std::cout<<"mpName = "<<ba.constData()<<" rName = "<<ba1.constData()<<std::endl;
    HSITE st = mapCreateAndAppendSiteForMap(hmap, ba.constData(), ba1.constData());
    std::cout<<"create map = "<<st<<std::endl;
    ui->viewMap->Repaint();
Может имена я как-то не корректно задаю  mapName и  rscName? Это ведь не созданные еще файлы и физически их нет на диске о момента отработки этого метода.
Кстати, такой вопрос, а файл ресурсов (*.rsc) в результате выполнения данного метода mapCreateAndAppendSiteForMap копируется целиком с базовой карты?  Т.е все коды объектов совпадают?
 
Цитата
/home/user/GIS/Projects/gisdesigner/examples/Data/testMap/Po­dolsk/layer/layersc.rsc
У Вас классификатор по этому пути лежит ? Классификатор, указываемый в mapCreateAndAppendSiteForMap используется для создания пользовательского слоя.

То есть:
1) Берётся главная карта, из неё берётся Система координат главной карты.
2) Берётся классификатор, указанный третьим параметром в mapCreateAndAppendSiteForMap
3) Если папка, указанная в пути к создаваемому слою существует, если существует классификатор, переданный третьим параметром, то внутри указанной папки создаётся пользоватеский слой (layer1.sit файл и сопутствующие ему файлы), туда копируется указанный классификатор.
При этом пользовательский слой будет безразмерным, с системой координат как в главной карте, а габариты слоя будут меняться при добавлении объектов на слой.
 
Ура!!!! Получилось! Владимир Егоров спасибо Вам за помощь!  :{}
С первым разобралась с Вашей помощью, теперь буду добавлять объекты на новую карту и проверять, как потом моя обстановка будет открываться. Надеюсь с этим вопросов не будет, хотя не уверенна(


Действительно, получается, я не верно задавала имя файла ресурсов. Изначально я думала, что я должна указать имя файла ресурсов, который должен быть создан (т.е я задавала имя файла которого еще нет), а сейчас я указала имя файла файла ресурсов уже который есть (т.е ресурсы основной карты).

Эх, в документации как-то не однозначно написано какие параметры задавать у данного метода.
// Создать пользовательскую карту по открытой карте
 // hmap -  идентификатор открытой векторной карты
 // mapname - полное имя файла карты
 // rscname - полное имя файла ресурсов
 // issitx  - признак создания карты типа SITX
 // При ошибке возвращает ноль

_MAPIMP HSITE _MAPAPI mapCreateAndAppendSiteForMap(HMAP hmap,
                                            const char * mapname,
                                            const char * rscname);
Изменено: Анастасия - 09.07.2018 14:56:56
 
Открыла сейчас созданную карту *.sit, в результате думала увижу карту, как основную, а вижу просто серый фон, как я понимаю, так и должно быть?
 
Sit карта после создания пустая - на неё нужно добавлять объекты из классификатора, указанного при создании.
Это пользовательская карта, слой, обстановка - часто используется для нанесения некоторых объектов из конкретного классификатора поверх основной карты.
Про копирование Вам уже писали ранее :  
Цитата
Александр Савелов:
Вы можете использовать функцию mapCopySite, чтобы скопировать карту именно физическим переносом файлов на диске.
Вероятно, Вам лучше подойдет следующий алгоритм:
- создать новую карту (описано ранее);
- скопировать объекты со старой карты на новую с помощью функции mapReadCopyObject (mapapi.h).

Пример  реализации копирования объектов можно посмотреть в п.3.6.27  "Копирование объектов на другую карту с изменением системы координат"  Руководства программиста (http://gistoolkit.ru/download/doc/gisdesigner_prog.pdf)
 
Ок, спасибо)

А можете еще скоординировать, как добавлять на пользовательскую карту объекты. Как я ранее делала не работает.
Как мне получить идентификатор созданной ранее пользовательской карты?
Код
    QString mapName = "/home/user/GIS/Projects/gisdesigner/examples/Data/testMap/layer/layer1.sit";
    QByteArray baMyHsite = QTextCodec::codecForName("KOI8-R")->fromUnicode(mapName);
    hsite = mapCreateAndAppendTempSite(hmap, baMyHsite.constData()););
    std::cout<<"hsite = "<<hsite<<std::endl;

Далее добавляю объект
Код
    HOBJ hObj = mapCreateSiteObject(hmap, hsite, IDDOUBLE2);   // создаём пустой объект на карте (контейнер)
    std::cout<<"hObj = "<<hObj<<std::endl;
    mapRegisterObject(hObj, 10092, LOCAL_POINT);
    mapAppendPointPlane(hObj, 6170267, 7411269, 0);                 
    mapCommitObject(hObj);                                                          // записываем на карту
    mapFreeObject(hObj);                                                         // освобождаем контейнер
    ui->viewMap->Repaint();  

Но на саму карту он не добавляется. Я этого не вижу. Хотя результат работы методов не равен 0.

В результате работы данного кода объекты добавляются на основную карту и сохраняются на ней, а мне необходимо, чтобы они на пользовательской карте сохранялись.

По идее в методе mapCreateSiteObject я указываю  hSite (идентификатор открытой пользовательской карты в которой будет расположен создаваемый объект), как раз-таки созданной карты.
Изменено: Анастасия - 09.07.2018 16:17:23
 
Код
  // Запросить количество объектов в пользовательской карте
  // hMap   - идентификатор открытой основной карты
  // hSite  - идентификатор открытой пользовательской карты
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetSiteObjectCount(HMAP hMap, HSITE hSite);

  // Запросить количество объектов в пользовательской карте, исключая удаленные
  // hMap   - идентификатор открытой основной карты
  // hSite  - идентификатор открытой пользовательской карты
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetSiteRealObjectCount(HMAP hMap, HSITE hSite);

 // Выбор объекта по номеру листа и последовательному номеру объекта
 // (прямой доступ к объекту без перебора)
 // hMap     - идентификатор открытой карты,
 // hSite    - идентификатор открытой пользовательской карты,
 // info     - идентификатор существующего объекта,
 //            в котором будет размещен результат поиска;
 // list     - номер листа (для пользовательской карты всегда 1);
 // object   - последовательный номер объекта в листе
 // (начиная с 1 до mapGetObjectCount(...) или mapGetSiteObjectCount(...)).
 // Если объект имеет признак "удален" - возвращает 1 !
 // При успешном выполнении возвращает значение info.
 // При ошибке возвращает ноль

_MAPIMP HOBJ _MAPAPI mapReadObjectByNumber(HMAP hMap, HSITE hSite, HOBJ info,
                                           long int list, long int object); 

Лучше так проверять сколько каких объектов у вас на пользовательской карте.
Почему он не виден - я не знаю. Может семантик не хватает или ещё чего. То что объект не виден ещё не означает что объекта нет на пользовательской карте.

И почему Вы решили что он на основной карте добавился ?
Изменено: Владимир Егоров - 09.07.2018 16:24:16
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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