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

[MAPAPI] Автоматическая генерация GUID для объектов на карте.

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
[MAPAPI] Автоматическая генерация GUID для объектов на карте., Настройка карты для автоматической генерации GUID для объекта на карте.
 
Здравствуйте.
Какие действия нужно выполнить чтобы для объектов начали генерироваться GUID?

Пример:

Создаю карту:
Скрытый текст

Добавляю на неё объект и пытаюсь получить GUID:
Код
bool panorama::TestGuid::run() const
{
    QFileInfo tmpSit = createTmpSit(m_rscPath);
    QByteArray tmpSitPath = gis::common::convertStringToKOI8_R(tmpSit.absoluteFilePath());
    HMAP sit = mapOpenData(tmpSitPath.constData(), GENERIC_WRITE);
    if (sit == 0){
        qWarning() << "can't open tmp sit:" << tmpSit.absoluteFilePath();
        return false;
    }
    long guidFlag = mapGetAutoObjectGUID(sit, sit);
    if (guidFlag == 0){
        qWarning() << "auto generate guid for objects do not turned on";
        mapCloseData(sit);
        return false;
    }
    HOBJ obj = mapCreateObject(sit);
    if (obj == 0){
        qWarning() << "can't create object on sit";
        mapCloseData(sit);
        return false;
    }
    long rc = mapRegisterObjectByKey(obj, "009995006203069101");
    if (rc == 0){
        qWarning() << "can't register obj by key 009995006203069101";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    rc = mapAppendPointGeo(obj, 60.0/180.0*M_PI, 30.1/180.0*M_PI);
    if (rc == 0){
        qWarning() << "can't append point to obj";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    rc = mapCommitObject(obj);
    if (rc == 0){
        qWarning() << "can't commit obj";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    char guidBuf[37]; guidBuf[0] = '\0';
    rc = mapObjectGUID(obj, guidBuf, 37);
    if (rc == 0){
        qWarning() << "can't get GUID from obj";
        mapDeleteObject(obj);
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }else{
        qInfo() << "GUID:" << gis::common::parseStringFromKOI8_R(guidBuf);
    }
    mapDeleteObject(obj);
    mapFreeObject(obj);
    mapCloseData(sit);
    return true;
}

На выходе:
Код
can't get GUID from obj
"Test get guid for map objects" : fail

То есть объект создался, зарегистрировался, commit отработал, а вот GUID не появился. После какой операции над объектом появится GUID? Нужно семантики заполнить перед коммитом ?
 
Вроде разобрался.
Код
  // Установить признак ведения уникального идентификатора GUID для объектов карты
  // hMap  - идентификатор открытой карты
  // hSite - идентификатор открытой пользовательской карты
  // flag  - признак ведения GUID для объектов карты
  // Признак устанавливается после создания карты до записи объектов
  // Если признак установлен, то каждому объекту карты при создании автоматически
  // присваивается семантика с кодом 31799, содержащая уникальную комбинацию
  // из 32 шестнадцатеричных символов от 0 до F (GUID)
  // Если открытых данных нет возвращает ноль

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

Несмотря на описание функции, автоматическая генерация GUID не происходит.
Но никто не мешает самостоятельно сгенерировать GUID и записать его в объект.
Код
static QString createGUID(){
    QUuid guid = QUuid::createUuid();
    QString ret;
    for (const auto& b: guid.toRfc4122()){
        QString s = QString::number((uint8_t)b, 16);
        if (s.length() == 1){
            s = QString("0") + s;
        }
        ret += s;
    }
    return ret;
}

Код
bool panorama::TestGuid::run() const
{
    QFileInfo tmpSit = createTmpSit(m_rscPath);
    QByteArray tmpSitPath = gis::common::convertStringToKOI8_R(tmpSit.absoluteFilePath());
    HMAP sit = mapOpenData(tmpSitPath.constData(), GENERIC_WRITE);
    if (sit == 0){
        qWarning() << "can't open tmp sit:" << tmpSit.absoluteFilePath();
        return false;
    }
    long guidFlag = mapGetAutoObjectGUID(sit, sit);
    if (guidFlag == 0){
        qWarning() << "auto generate guid for objects do not turned on";
        mapCloseData(sit);
        return false;
    }
    char guidBuf[37]; guidBuf[0] = '\0';
    HOBJ obj = mapCreateObject(sit);
    if (obj == 0){
        qWarning() << "can't create object on sit";
        mapCloseData(sit);
        return false;
    }
    guidBuf[0] = '\0';
    long rc = mapObjectGUID(obj, guidBuf, 37);
    if (rc == 0){
        qWarning() << "can't get GUID from obj";
    }else{
        qInfo() << "GUID:" << gis::common::parseStringFromKOI8_R(guidBuf);
    }
    rc = mapRegisterObjectByKey(obj, "009995006203069101");
    if (rc == 0){
        qWarning() << "can't register obj by key 009995006203069101";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    guidBuf[0] = '\0';
    rc = mapObjectGUID(obj, guidBuf, 30);
    if (rc == 0){
        qWarning() << "can't get GUID from obj";
    }else{
        qInfo() << "GUID:" << gis::common::parseStringFromKOI8_R(guidBuf);
    }
    rc = mapAppendPointGeo(obj, 60.0/180.0*M_PI, 30.1/180.0*M_PI);
    if (rc == 0){
        qWarning() << "can't append point to obj";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    rc = mapAppendPointGeo(obj, 60.0/180.0*M_PI, 30.105/180.0*M_PI);
    if (rc == 0){
        qWarning() << "can't append point to obj";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    rc = mapAppendPointGeo(obj, 60.1/180.0*M_PI, 30.105/180.0*M_PI);
    if (rc == 0){
        qWarning() << "can't append point to obj";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    rc = mapAppendPointGeo(obj, 60.0/180.0*M_PI, 30.1/180.0*M_PI);
    if (rc == 0){
        qWarning() << "can't append point to obj";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    QString objGUID = createGUID();
    QByteArray guidKoi8r = gis::common::convertStringToKOI8_R(objGUID);
    rc = mapAppendSemantic(obj, OBJECTGUID, guidKoi8r.constData(), guidKoi8r.size());
    if (rc == 0){
        qWarning() << "can't add guid";
    }
    rc = mapCommitObject(obj);
    if (rc == 0){
        qWarning() << "can't commit obj";
        mapFreeObject(obj);
        mapCloseData(sit);
        return false;
    }
    guidBuf[0] = '\0';
    rc = mapObjectGUID(obj, guidBuf, 37);
    if (rc == 0){
        qWarning() << "can't get GUID from obj";
    }else{
        qInfo() << "GUID:" << gis::common::parseStringFromKOI8_R(guidBuf);
    }
//    mapDeleteObject(obj);
    mapFreeObject(obj);
    mapCloseData(sit);
    sit = mapOpenData(tmpSitPath.constData(), GENERIC_READ);
    long objCount = mapGetSiteObjectCount(sit, sit);
    qInfo() << "Object count:" << objCount;
    obj = mapCreateObject(sit);
    HOBJ rcobj = mapReadObjectByNumber(sit, sit, obj, 1, 1);
    if (rcobj != 0 && rcobj != 1){
        guidBuf[0] = '\0';
        rc = mapObjectGUID(rcobj, guidBuf, 37);
        if (rc == 0){
            qWarning() << "can't get GUID from obj";
            mapFreeObject(obj);
            mapCloseData(sit);
            return false;
        }else{
            qInfo() << "GUID:" << gis::common::parseStringFromKOI8_R(guidBuf);
        }
    }
    mapFreeObject(obj);
    mapCloseData(sit);
    return true;
}

Вывод:
Код
can't get GUID from obj
can't get GUID from obj
GUID: "b51d52955cd540b4847c3fca1729f786"
Object count: 1
GUID: "b51d52955cd540b4847c3fca1729f786"
"Test get guid for map objects" : success

В описании к функции mapSetAutoObjectGUID опечатка, там указан код семантики 31799, а в макросах он определён как 32799:
Код
#define OBJECTGUID          32799
Изменено: Владимир Егоров - 23.04.2018 16:53:59
 
Здравствуйте!

Ошибку воспроизвели и исправили, также откорректируем описание функции.
Спасибо!
Исправления войдут в следующую версию ГИС Конструктор.
 
Кстати, функция mapSeekObjectByStringGUID тоже не работает, несмотря на то что я добавил семантику OBJGUID.
Я немного дописал тот пример что был выше:
Код
    sit = mapOpenData(tmpSitPath.constData(), GENERIC_READ);
    long objCount = mapGetSiteObjectCount(sit, sit);
    qInfo() << "Object count:" << objCount;
    obj = mapCreateObject(sit);
    long objNumber = mapSeekObjectByStringGUID(sit, sit, obj, 1, guidKoi8r.constData());
    if (objNumber == 0){
        qWarning() << "can't seek obj by guid" << objGUID;
        objNumber = 1;
    }
    HOBJ rcobj = mapReadObjectByNumber(sit, sit, obj, 1, objNumber);
    if (rcobj != 0 && rcobj != 1){
        guidBuf[0] = '\0';
        rc = mapObjectGUID(rcobj, guidBuf, 37);
        if (rc == 0){
            qWarning() << "can't get GUID from obj";
            mapFreeObject(obj);
            mapCloseData(sit);
            return false;
        }else{
            qInfo() << "GUID:" << gis::common::parseStringFromKOI8_R(guidBuf);
        }
    }

Вывод:
Код
Object count: 1
can't seek obj by guid "c396ed81efba4d2f8b058ec081818d8a"
GUID: "c396ed81efba4d2f8b058ec081818d8a"

То есть функция  mapObjectGUID может прочитать значение семантики OBJGUID, а вот поиск по нему осуществляться не может
(я мог что-то забыть, если не все манипуляции выполнил для работы с функциями семейства mapSeek*, поправьте меня).

Пока напишу свою реализацию поиска, потом перейду на исправленную версию ядра.

Можете отписаться в этой теме когда выложите на сайт обновлённую версию ГИС Конструктор под Linux?
 
ГИС Конструктор версия 12.3.1, mapSeekObjectByStringGUID заработал, но генерация GUID автоматически по прежнему не происходит, пока генерирую вручную и добавляю вызовом mapAppendSemantic после регистрации объекта.
Код
rc = mapAppendSemantic(obj, OBJECTGUID, guidKoi8r.constData(), guidKoi8r.size());
 
Немного странно, потому что и генерация GUID у нас тоже происходит.
Код
  char rscName[MAX_PATH_LONG];  rscName[0] = 0;
  StrCopy(rscName, testDataPath, sizeof(rscName));
  StrCat(rscName, "/rsc/operator.rsc", sizeof(rscName));

  HMAP tempSiteHandle = mapCreateTempSite(rscName);
  ASSERT_TRUE(tempSiteHandle);

  long isAutoObjectGUIDSet = mapSetAutoObjectGUID(tempSiteHandle, tempSiteHandle, 1);
  ASSERT_TRUE(isAutoObjectGUIDSet);

  HOBJ tempObjectHandle = mapCreateObject(tempSiteHandle);
  ASSERT_TRUE(tempObjectHandle);
  long isObjectRegistered = mapRegisterObjectByKey(tempObjectHandle, "111015000321");
  ASSERT_TRUE(isObjectRegistered);
  long isPointAppended = mapAppendPointPlane(tempObjectHandle, 6000000, 7000000);
  ASSERT_TRUE(isPointAppended);
  long isObjectCommited = mapCommitObject(tempObjectHandle);
  ASSERT_TRUE(isObjectCommited);

  char objectGUID[64];  objectGUID[0] = 0;
  long isGUIDGet = mapObjectGUID(tempObjectHandle, objectGUID, sizeof(objectGUID));
  ASSERT_TRUE(isGUIDGet);
  ASSERT_TRUE(objectGUID[0]);

  char semanticValue[MAX_PATH];  semanticValue[0] = 0;
  mapSemanticCodeValue(tempObjectHandle, 32799, semanticValue, sizeof(semanticValue), 1);
  ASSERT_TRUE(objectGUID[0] == semanticValue[0]);

  mapFreeObject(tempObjectHandle);
  mapCloseData(tempSiteHandle);
 
Я коммит не делал после добавления точек, а генерация по mapCommitObject происходит видимо, проверю отпишусь.
 
Да, добавил коммит после заполнения метрики, и GUID появился.

Его кстати затереть можно вызовом mapAppendSemantic:
Код
can't get GUID from obj
can't get GUID from obj
GUID: "3A6C7CF078416DE3B691BBBDFB41B0A9"      <--- GUID, сгенерированный автоматически после mapCommitObject
GUID: "0d5772d9777e4b75b8ebe66f29d1cc0f"      <--- GUID, добавленный вручную через mapAppendSemantic
Object count: 1
GUID: "0d5772d9777e4b75b8ebe66f29d1cc0f"
"Test get guid for map objects" : success
Страницы: 1
Читают тему (гостей: 1)



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

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