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

Чтение семантики объекта

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Чтение семантики объекта
 
Здравствуйте,
Возникла такая проблема. Нужно прочитать семантику объекта на карте.
Для тестирования была взята лесная область на карте "Подольск" с номером 16799367 и кодом 71111110
Код
int res = 0;
    HOBJ id = -10; //= 71111110; //=16799367;
    id = mapReadObjectByKey(hmap,hsite,id,1,16799367);
    //id = mapReadObjectByNumber(hmap,hsite,id,1,71111110);
    //res = mapReadObjectByKeyEx(hmap,hsite,id,1,71111110);
    //res = mapReadObjectByNumberEx(hmap,hsite,id,1,16799367);
    te->append(QString("Result: ") + QString::number(res) + QString("  Id: ") + QString::number(id));
    te->append(QString(mapSemanticName(id,1)));
Результатом функции mapReadObjectByKey является 0, следовательно произошла ошибка и данная область не нашлась.
Также при попытке использовать любую другую строку, кроме не закоментированной приводит к Segmentation Fault

Нужно чтобы QString(mapSemanticName(id,1)) выдавал не пустую строку.
Инициализация hmap и hsite:
Код
viewMap->SetMapFileName("/usr/share/qt4/examples/gisdesigner/Data/Podolsk/Podolsk.map");
    viewMap->SetMapActive(true);
    viewMap->SetMapVisible(true);
    hmap=viewMap->GetMapHandle();
    mapAppendDataEx(hmap, "/usr/share/qt4/examples/gisdesigner/Data/Podolsk/Podolsk.mtw", 0, 0);

    //load temp map
    hsite=mapCreateAndAppendTempSite(hmap, "/usr/share/qt4/examples/gisdesigner/Data/Podolsk/Topo100t.rsc");
    if(hsite == 0) te->append("Didn't create temp map");
    else te->append("temp map created....");
 
HOBJ, который используется при вызове функции mapReadObjectByKey, - это не просто некий идентификатор.
Это указатель на экземпляр класса работы с объектом карты в ГИС-ядре.
Его надо создать, а затем, по завершению работы с ним, освободить.
Ошибка по памяти как раз и есть следствие того, что Вы пытаетесь подать "вымышленный" HOBJ.
 
Цитата
Нужно прочитать семантику объекта на карте.
Для тестирования была взята лесная область на карте "Подольск" с номером 16799367 и кодом 71111110
во первых, номера объекта вполне достаточно, это некий уникальный ID на карте... а далее по такой схеме
Код
int res = 0;
    char buff[256] = {0};
    HOBJ id = mapCreateSiteObject(hmap,hsite);
    if (mapSeekSiteObject(hmap, hsite, id, 16799367) != 0)
       mapSemanticValueByCode(id, КОД_СЕМАНТИКИ, buff, sizeof(buff));
    mapFreeObject(id);

if (buff[0] != 0)
   te->append(QString("Код: %1  Значение:%2").arg(КОД_СЕМАНТИКИ, buff));
и в Вашем TE будет то, что Вам нужно
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Объект по-прежнему не находится. В te (TextEdit) ничего не выводится.
Я посмотрел один из примеров кодов работы с mapSeekSiteObject и там объект создавался в одной функции запоминался в глобальной переменной и использовался в другой. Величина указатель на объект (id в нашем случае) было не что-то большое вроде 16799367 а мальнеькое на уровне 2, 3 и так далее. Мне кажется что для поиска нужна не эта функция.

И по поводу mapSemanticValueByCode...
Qt его не видит в подключённых библиотеках. Поиск по всем имеющимся у меня библиотекам тоже ничего не дал.
 
Запрос семантик:
mapSemanticValue - нераскодированное значение ( т.е. не будут добавлены единицы измерения и значения семантик типа классификатор не будут подставлены)
mapSemanticValueName - раскодированное значение

Для запроса семантики необходим объект типа HOBJ.
Получить с карты объект нельзя, только его копию (в данном случае возможно использовать mapReadObjectByKey)
Для получения копии необходимо создать объект HOBJ, в который будет выполнена копия.
Для этого применяется функция mapCreateSiteObject.
Просто так назначать в объект типа HOBJ значения не с помощью функций ядра - неопределенное поведение (от утечек памяти до полной неработоспособности).

В ответе приведенном пользователем KFF необходимо заменить вызов функции mapSemanticValueByCode на mapSemanticValueName.

И если в textEdit ничего не выводится, то работает ли он вообще? Если попробовать вывести в него статический текст.
 
Цитата
Владислав Костылев написал:
Объект по-прежнему не находится. В te (TextEdit) ничего не выводится.Я посмотрел один из примеров кодов работы с mapSeekSiteObject и там объект создавался в одной функции запоминался в глобальной переменной и использовался в другой. Величина указатель на объект (id в нашем случае) было не что-то большое вроде 16799367 а мальнеькое на уровне 2, 3 и так далее. Мне кажется что для поиска нужна не эта функция.
Владислав, если не нашло объект значит на Вашей карте нет объекта с номером 16799367
Каждая карта имеет свою нумерацию которая может совпадать а может и нет. Если Вы подключили к основной карте вторую карту, то на неё у объектов другие номера и там вы не найдёте объект с номером 16799367

Прежде чем писать код, нужно привести в порядок (на бумаге) исходные данные. То есть
определиться что у вас основная карта, что у вас рабочая карта где ищете где наносите и откуда читаете
Программирование оно любит математическую точность а не "ищу где-то там, что то приблизительно такое"

Цитата
В ответе приведенном пользователем KFF необходимо заменить вызов функции mapSemanticValueByCode на mapSemanticValueName.
По большому счёту, я читаю семантики вот так (пример из рабочего проекта)
Код
// выгрузка семантик объекта

  char b[1024];

  for (int i = 1; i <= semcount; i++)
  {
    code = mapSemanticCode(obj, i);
    // берём описание семантики
    mapSemanticDescribeEx(obj, &desc, code);
    // служебную игнорирую.
    if (desc.Service)
       continue;
    b[0] = 0;
    switch (desc.Type)
    {
      // Значение не установлено
      case TUNDEFINED:
           break;

      case TREFER:   // Ссылка на произвольный объект карты  (уникальный номер объекта)
      case TCOLOR:   // Числовое значение цвета в RGB
           ivalue = mapSemanticLongValue(obj, i);
           sprintf(b, "%d", ivalue);
           break;

      // Числовое значение
      case TNUMBER:
           if (desc.Decimal)
           {
              fvalue = mapSemanticDoubleValue(obj, i);
              sprintf(b, "%.*f",desc.Decimal, fvalue);
           }
           else
           {
              ivalue = mapSemanticLongValue(obj, i);
              sprintf(b, "%d", ivalue);
           }
           break;
      // Значение в виде числового кода из классификатора значений
      case TCODE:
            ivalue = mapSemanticLongValue(obj, i);
            ref = (char*) mapGetRscClsKey(hRsc, code, ivalue);
            if (ref)
              strcpy(b, ref);
            else
            {
              //недопустимая перечислимая
              continue;
            }
           break;
      // Угловая величина в радианах
      case TANGLE:
           fvalue = mapSemanticDoubleValue(obj, i);
           sprintf(b, "%.8f", fvalue);
           break;
      default:
         // TSTRING    = 0   Символьная строка
         // TANYFILE   = 9,     // Имя файла зарегистрированного типа
         // TBMPFILE   = 10,    // Имя файла BMP
         // TOLEFILE   = 11,    // Имя файла,обрабатываемого OLE-сервером
         // TMAPFILE   = 13,    // Имя файла-паспорта района
         // TTXTFILE   = 14,    // Имя текстового файла
         // TPCXFILE   = 15,    // Имя файла PCX
         // TFONT      = 20,    // Имя шрифта ("Arial", "Courier"...)
         // TDATE      = 17,    // Значение даты в числовом виде (ГГГГММДД)
         // TTIME      = 19,    // Значение времени в числовом виде (ЧЧММСС)
         mapSemanticValue(obj, i, b, sizebuff);
     }
     // значение семантики в текстовом виде в b
     
   }
Изменено: KFF - 14.02.2018 17:28:56
Не тот глуп кто не знает, а тот, кто не знает где искать.
Страницы: 1
Читают тему (гостей: 1)



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

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