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

Использование mapSelectSampleByNumber

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Использование mapSelectSampleByNumber, Как подсветить объекты на добавленных картах
 
Доброго времени суток.

Дано:
1. Основная карта + подгружаемые к ней методом mapAppendDataEx дополнительные.
2. Требуется произвести поиск и подсветку объектов.

Использование: mapSelectSampleByNumber( hselX, mapIndex, number),
где mapIndex - номер листа соответствующий порядковому номеру из общего числа листов mapGetSiteCount;
а number - номер объекта mapGetObjectNumber полученный по результатам поиска mapSeekSiteSelectObject

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

Спасибо.
С уважением,
Лазарев Александр.

ЗЫ: пробовал разные варианты, ниже временный код после кучи экспериментов
Код
        HSELECT hsel = mapCreateMapSelectContext( m_hMap);
        mapSelectObject( hsel, -1, 0);
        foreach( SelObj obj, m_selObjects)
        {
            if( obj.m_mapIndex == 0)
            {
                mapSelectSampleByNumber( hsel, 1, obj.m_number);
            }
            else
            {
                HSITE hSit = mapGetSiteIdent( m_hMap, obj.m_mapIndex);
                if( hSit != 0)
                {
                    HOBJ hob = mapCreateObject( m_hMap);
                    if( hob != 0)
                    {
                        if( mapReadObjectByNumber( m_hMap, hSit, hob, obj.m_mapIndex, obj.m_number) != 0)
                        {
                            long listNumber = mapGetListNumber( hob);
                            mapSelectSampleByNumber( hsel, listNumber, obj.m_number);

//                            long objCode = mapObjectCode( hob);
//                            if( objCode > 0)
//                            {
//                                mapSelectOrSelect()
//                                if( mapSelectSampleByObject( hsel, objCode) == 0)
//                                {
//                                    qDebug() << "XXX";
//                                }
//                            }
                        }
                        mapFreeObject( hob);
                    }



//                    HSELECT hselX = mapCreateSiteSelectContext( m_hMap, hSit);
//                    mapClearSelectContextEx( hselX, m_hMap, hSit);
//                    if( mapSelectSampleByNumber( hselX, obj.m_mapIndex, obj.m_number) != 0)
//                    {
//                        if( mapCopySelectContextEx( hsel, hselX) == 0)
//                        {
//                            qDebug() << "mapCopySelectContextEx";
//                        }
//                    }
//                    mapDeleteSelectContext( hselX);
                }
            }
        }

 
Здравствуйте!

Привожу пример кода для включения в контекст поиска одного объекта по порядковому номеру на листе:
Код
  HSELECT selectHandle = mapCreateSiteSelectContext(basicMapHandle, siteHandle);
  // Исключить из выбора все объекты
  mapSelectObject(selectHandle, -1, 0);
  // Выбрать объект по номеру листа и порядковому номеру объекта в листе
  int listNumber = 1;
  int objectNumber = 8;
  mapSelectSampleByNumber(selectHandle, 1, objectNumber);
  std::cout << "object count: " << mapSeekSiteSelectCount(basicMapHandle, siteHandle, selectHandle);
Каким образом Вы потом проверяете состав сформированного контекста поиска?
Примечание: дополнительно о работе с контекстом поиска можно посмотреть в разделе "3.6.11 Управление составом отображения объектов электронной карты" Руководства программиста (http://gistoolkit.ru/download/doc/gisdesigner_prog.pdf).
 
Доброго времени суток.
Проверяю через mapPaintAndSelectToXImage, так как мне нужно подсвечивать выбранные объекты из одного набора.
Я могу объединять контексты для отображения объектов из разных листов или возможно подсвечивать только в пределах выбранного листа?
Имеет ли значение тот факт, что подгружаемые карты могут иметь разные классификаторы?
Изменено: Александр Лазарев - 02.07.2018 16:27:11
 
Доброго времени суток.

Какая-нибудь дополнительная информация сегодня будет?
Мне бы хотелось разобраться с причиной этого побыстрее.
На ваших тестах при загрузке основной карты и подгрузке к ней дополнительной с последующим поиском по обеим всё нормально подсвечивается?
Если да, то, если можно, я хотел бы увидеть код занесения в селектор и вызов рендера.
На всякий случай свой действующий код выкладываю:
Код
    if( drawRect.isEmpty() || ( m_hMap == 0))
        return;
    RECT   RectDraw;      // Область отрисовки карты
    RectDraw.left    = drawRect.left();
    RectDraw.top     = drawRect.top();
    RectDraw.right  = drawRect.right();
    RectDraw.bottom = drawRect.bottom();

    XIMAGEDESC xImageDesc;
    xImageDesc.Point     = (char *)imgOut.bits();                  // Адрес начала области пикселов
    xImageDesc.Width     = imgOut.width();                     // Ширина строки в пикселах
    xImageDesc.Height    = imgOut.height();                     // Число строк
    xImageDesc.Depth     = imgOut.depth();                  // Размер элемента в битах (8,15,16,24,32)
    xImageDesc.CellSize  = imgOut.depth() / 8;               // Размер элемента(пиксела) в байтах
    xImageDesc.RowSize   = imgOut.width() * xImageDesc.CellSize;      // Ширина строки в байтах
    int ret = 0;
    if( m_selObjects.empty() && m_selObstacles.isEmpty())
    {
        ret = mapPaintToXImage(m_hMap, &xImageDesc, 0, 0, &RectDraw);
    }
    else
    {
        HSELECT hsel = mapCreateMapSelectContext( m_hMap);
        mapSelectObject( hsel, -1, 0);
        foreach( SelObj obj, m_selObjects)
        {
..Либо этот вариант
//            if( obj.m_mapIndex == 0)
//            {
//                mapSelectSampleByNumber( hsel, 1, obj.m_number);
//            }
//            else
//            {
//                mapSelectSampleByNumber( hsel, obj.m_mapIndex + 1, obj.m_number);
//            }
..Либо этот
            if( obj.m_mapIndex == 0)
            {
                mapSelectSampleByNumber( hsel, 1, obj.m_number);
            }
            else
            {
                HSELECT xSel = mapCreateSiteSelectContext( m_hMap, mapGetSiteIdent( m_hMap, obj.m_mapIndex));
                mapSelectSampleByNumber( xSel, obj.m_mapIndex, obj.m_number);
                //mapCopySelectContextEx( hsel, xSel);
                mapSelectOrSelect( hsel, xSel);
                mapDeleteSelectContext( xSel);
            }
        }
        foreach( SelObj obj, m_selObstacles)
        {
            mapSelectSampleByNumber( hsel, obj.m_mapIndex, obj.m_number);
        }
        //mapSelectObject( hsel, obj, 1);
        ret = mapPaintAndSelectToXImage( m_hMap, &xImageDesc,0, 0, &RectDraw, hsel, RGB( 255, 0, 0));
        mapDeleteSelectContext( hsel);
        if (ret == 0)
        {
            qDebug() << "Render error in MapController::renderMap(QImage &imgOut, const QRect &drawRect)";
        }
    }
 
Здравствуйте!

Контекст поиска связывается с конкретной картой, поэтому, если у Вас к базовой карте прикреплено несколько карт, то для каждой карты нужно создавать собственный контекст (функция mapCreateSiteSelectContext) и указывать в нем объекты этой карты (в частности, с помощью функции mapSelectSampleByNumber).
В целях экономии памяти можно хранить только один контекст и выполнять его перепривязку к другой карте с помощью функции mapClearSelectContextEx (seekapi.h).
 
Цитата
Александр Савелов написал:
Здравствуйте!

Контекст поиска связывается с конкретной картой, поэтому, если у Вас к базовой карте прикреплено несколько карт, то для каждой карты нужно создавать собственный контекст (функция mapCreateSiteSelectContext) и указывать в нем объекты этой карты (в частности, с помощью функции mapSelectSampleByNumber).
В целях экономии памяти можно хранить только один контекст и выполнять его перепривязку к другой карте с помощью функции mapClearSelectContextEx (seekapi.h).
Спасибо!
Подсветка заработала.

ЗЫ: Но название, конечно, говорящее, да. ;)
Изменено: Александр Лазарев - 04.07.2018 12:36:52
 
Всё было почти хорошо, однако обнаружилось, что этот подход подсвечивает иногда сразу лист со всеми объектами.

Вопрос: как снять доступ ко всем объектам для листа, на котором находится искомый объект?

ЗЫ: удалось решить проблему:
Код
        HSELECT hsel = mapCreateMapSelectContext( m_hMap);
        mapSelectObject( hsel, -1, 0);
        foreach( SelObj obj, m_selObjects)
        {
            if( obj.m_mapIndex == 0)
            {
                mapSelectSampleByNumber( hsel, 1, obj.m_number);
            }
            else
            {
                HSITE hSit = mapGetSiteIdent( m_hMap, obj.m_mapIndex);
                if( hSit != 0)
                {
                    if( mapClearSelectContextEx( hsel, m_hMap, hSit) != 0)
                    {
                        mapSelectSampleByNumber( hsel, 1, obj.m_number);
                    }
                }
            }
        }
        foreach( SelObj obj, m_selObstacles)
        {
            mapSelectSampleByNumber( hsel, obj.m_mapIndex, obj.m_number);
        }
        ret = mapPaintAndSelectToXImage( m_hMap, &xImageDesc,0, 0, &RectDraw, hsel, RGB( 255, 0, 0));
        mapDeleteSelectContext( hsel);

Но, знаете ли... такие финты оччччень неочевидные.
Я хоть и программист, но советы оставлю при себе, вам там виднее.

Спасибо за посильную помощь.
Изменено: Александр Лазарев - 04.07.2018 14:27:58
Страницы: 1
Читают тему (гостей: 1)



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

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