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

Ошибка сегментации при удалении объекта карты

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Ошибка сегментации при удалении объекта карты
 
Версия Гис Конструктор для Qt Designer(MAPAPIVERSION = 0x111015, MAPACCESSVERSION = 20130912).

1. Создаю временную карту, не используя функцию MAPAPI mapCreateTempSite, т.к. она пытается делать записи в каталог приложения, что запрещено системой безопасности.
2. Создаю и рисую объект на созданной в п.1 временной карте по немного видоизмененному примеру, описанному тут, а затем пытаюсь его удалить с карты:
Код
    auto hobj = createObjectByKey(m_mapHandler, key, 1000); // код из примера, где объект сохраняется на карте путем вызова ф-и mapCommitObject
    if (hobj != 0) {
        mapSetRealShowScale(m_mapHandler, 1000000.);
        QImage img = paintMapObj(hobj); // код из примера, только функция в результате возвращает QImage
        auto fRes = mapDeleteObject(hobj); // при этом вызове происходит падение приложения
        if (fRes == 0) {
            qDebug() << Q_FUNC_INFO << mapGetAccessError();
        }   
        Q_ASSERT_X(fRes != 0, Q_FUNC_INFO, "mapDeleteObject");
        // освобождаем объект
        mapFreeObject(hobj);
    }

3. При вызове функции удаления созданного на карте объекта(mapDeleteObject(hobj)) происходит падение приложения.
 
Здравствуйте!

Мы подготовили небольшой автономный пример, чтобы мы имели общий код для тестирования. Проверьте, пожалуйста, его поведение:
Код
#include <assert.h> 
#include "mapapi.h"
 
int main()
{
// Создать временную карту
HMAP tempSiteHandle = mapCreateTempSite("/usr/Operator12/Data/Noginsk/topo200t.print.rsc");
assert(tempSiteHandle);
 
// Создать объект
HOBJ objectHandle = mapCreateObject(tempSiteHandle);
assert(objectHandle);
 
long isRegistered = mapRegisterObject(objectHandle, 1000000001, LOCAL_LINE);
assert(isRegistered);
 
mapAppendPointPlane(objectHandle, 6180000, 7450000);
mapAppendPointPlane(objectHandle, 6190000, 7465000);
 
// Нанести объект на карту
long isCommited = mapCommitObject(objectHandle);
assert(isCommited);
 
// Удалить объект с карты
long isDeleted = mapDeleteObject(objectHandle);
assert(isDeleted);
 
mapFreeObject(objectHandle);
mapCloseData(tempSiteHandle);
mapCloseMapAccess();
 
return 0;
}
 
Цитата
Александр Савелов написал:
Здравствуйте!

Мы подготовили небольшой автономный пример, чтобы мы имели общий код для тестирования.
Здравствуйте. Да, изменил только строчку
Цитата
/usr/Operator12
на
Цитата
/usr/Operator11
Этот пример отработал без вылетов.
Изменено: Сергей - 18.07.2019 16:01:52 (опечатка)
 
Здравствуйте!

Не могли бы Вы, пожалуйста, дополнить данный пример на основе Вашего кода, чтобы он приводил к некорректному поведению?

Спасибо!
 
Цитата
Александр Савелов написал:
Не могли бы Вы, пожалуйста, дополнить данный пример на основе Вашего кода, чтобы он приводил к некорректному поведению?
Здравствуйте, сейчас попробую. Спасибо.
 
Попробовал максимум приблизить код к моему без использования Qt. Но почему-то при вызове
Код
auto hmap = mapCreateSiteUn(wideStringSiteName, wideStringRscName, &cs); // происходит вылет

происходит вылет. Вот видоизменный пример, предыдущей версии:
Код
#include <assert.h>
#include "mapapi.h"

HOBJ createObjectByKey(HMAP hmap, const char * key) {
   HOBJ hobj = mapCreateObject(hmap, IDDOUBLE2, 0);
   assert(hobj);

   long isRegistered = mapRegisterObjectByKey(hobj, key);
   assert(isRegistered);

   long isAppended = mapAppendPointPlane(hobj, 5747005, 4356794);
   assert(isAppended);

   // Нанести объект на карту
   long isCommited = mapCommitObject(hobj);
   assert(isCommited);

   return hobj;
}

HMAP createMyTempMap(const char *rscFileName)
{

//    HMAP hmap = mapCreateTempSite(rscFileName); // так вылетов нет, хотелось бы понять, как делать правильно, создавая временную карту самостоятельно.
    CREATESITEUN cs;
    memset(&cs, 0, sizeof(cs));
    cs.Length = sizeof(CREATESITEUN);
    cs.EllipsoideKind = WGS_84;
    cs.MapType = 16;
    cs.Reserve = 0;

    const size_t MAX_PATH_LONG = 128;

    WCHAR wideStringSiteName[MAX_PATH_LONG];
    wideStringSiteName[0] = 0;
    // Из однобайтовой строки
    StringToUnicode("/tmp/delete_obj_test.sitx", wideStringSiteName, sizeof(wideStringSiteName));

    WCHAR wideStringRscName[MAX_PATH_LONG];
    wideStringRscName[0] = 0;
    // Из однобайтовой строки
    StringToUnicode(rscFileName, wideStringRscName, sizeof(wideStringRscName));

    auto hmap = mapCreateSiteUn(wideStringSiteName, wideStringRscName, &cs); // происходит вылет
    return hmap;
}

int main()
{
    // Создать временную карту
    HMAP tempSiteHandle = createMyTempMap("/usr/Operator11/Data/Noginsk/topo200t.print.rsc");
    assert(tempSiteHandle);

    HOBJ objectHandle = createObjectByKey(tempSiteHandle, "1000000001");
    assert(objectHandle);

    // Удалить объект с карты
    long isDeleted = mapDeleteObject(objectHandle);
    assert(isDeleted);

    mapFreeObject(objectHandle);
    mapCloseData(tempSiteHandle);
    mapCloseMapAccess();

    return 0;
}

 
Просьба подсказать, что я делаю не так в функции createMyTempMap, описанной в примере выше, чтобы можно было окончательно допроверить.
 
Доброе утро!
В дополнение к вышесказанному, под Windows с использованием GIS Toolkit Active Free вылетов при удалении элемента с карты нет. Поэтому хотелось бы разобраться, что я возможно делаю не так.
 
Здравствуйте!

Ваши действия по созданию/удалению объекта корректны - в данном случае имеет место ошибка в используемой Вами версии ГИС Конструктор.

Мы можем предложить Вам следующие варианты решения:
- обновление ГИС Конструктор версии 11 (бесплатно);
- обновление ГИС Конструктор до версии 12 (по стоимости обновления).

Для выполнения любого из данных действий напишите, пожалуйста, письмо на нашу почту (panorama@gisinfo.ru) с указанием организации и номера лицензионного ключа.

Спасибо!
 
Цитата
Александр Савелов написал:
Для выполнения любого из данных действий напишите, пожалуйста, письмо на нашу почту ( panorama@gisinfo.ru ) с указанием организации и номера лицензионного ключа.
Здравствуйте, Александр, выслал данные на указанную почту.
Спасибо.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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