Добрый день. Использую axcMapView. Задача нанести на карту много (порядка мульона) точечных объектов. Как делаю: создаю axMapObject, добавляю ему семантику и метрику. Делаю коммит объекту. Перехожу на следующий. После коммита я так понимаю что перерисовывается карта. Можно их как-то группой коммитить или включать/отключать автоматическую перерисовку карты на время добавления?
Проверял на паре сотен объектов.. приложение замирает порядка секунд 10-15.. т.е. прогнозируемое время отрисовки 1 млн точек порядка 13 часов
Добрый день. Перед нанесением объектов необходимо выставить свойство Rendering в false, а после обратно в true.
Дополнительно для ускорения нанесение объектов можете воспользоваться API функций ядра mapSetLoadState
Код
// Установить/запросить для карты режим потоковой загрузки данных
// Применяется для ускорения загрузки данных из обменных форматов при создании карты
// В процессе загрузки данных другие потоки или процессы не должны выполнять редактирование карты
// hMap - идентификатор открытых данных
// hSite - идентификатор открытой пользовательской карты
// state - режим потоковой загрузки данных (1 - включен, 0 - выключен)
// В режиме потоковой загрузки данных отключается журналирование операций
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSetLoadState(HMAP hMap, HSITE hSite, long int state);
_MAPIMP long int _MAPAPI mapGetLoadState(HMAP hMap, HSITE hSite);
Отключение рендеринга не сильно помогло. Осталась надежда на отключение журналирования операций через MapApi. Что нужно включить в проект /положить рядом с экзешником и т.п. чтобы заработали функции mapapi? Т.е. чтобы помпонент и mapapi как-то синхронизировались.. у меня ощущение что для для работы через mapapi требуется чтобы и карта открывалась через него. Среда разработки QT .. набор компонентов из состава ToolKit Active Free
И второй вопрос. При создании объекта на карте через CreateObjectByKey я получаю HOBJ. После работы MapFind в свойстве mapObjec.ObjHandle немного другой идентификатор получаю.. подскажите, пожалуйста, как их свести в 1 к 1 т.е. сопоставить?
Добрый день. Функция находится в библиотеке gisacces.dll.
Цитата
для для работы через mapapi требуется чтобы и карта открывалась через него
Нет, не надо. Компоненты - это, грубо говоря, надстройка над mapapi. Вам надо взять MapHandle от MapView и его передать в api функцию в качестве hMap. Если у открыта одна карта, то передаете hSite = MapHandle.
Цитата
При создании объекта на карте через CreateObjectByKey я получаю HOBJ. После работы MapFind в свойстве mapObjec.ObjHandle немного другой идентификатор получаю.. подскажите, пожалуйста, как их свести в 1 к 1 т.е. сопоставить?
MapFind - компонент для поиска объектов по заданным условиям. В MapFind Вы задаете условие на выборку объектов и переходите по записям, попавшим в нее. Переходом по записям в MapFind управляете Вы. CreateObjectByKey возвращает указатель на новый объект. После создания объекта (после commit) Вы можете запросить номер объекта и задать его в качестве параметра поиска в MapFind.
Крайне не рекомендуется использовать один и тот же компонент на форме MapObject для создания/редактирования объектов и поиска. Используйте 2 отдельных компонента, чтобы избежать путаницы: один связанный с MapFind для получения информации об объекте в результате поиска, а второй для создания/редактирования объектов карты.
Кроме этого, учитывая то, что Вы хотите ускорить нанесение объектов на карту, то не выполняйте после каждого создания объекта поиск.
Роман Твердов написал: После создания объекта (после commit) Вы можете запросить номер объекта и задать его в качестве параметра поиска в MapFind.
Подскажите, пожалуйста, в какое свойство aiMapSelect подать handle объекта после коммита, чтобы он по нему отфильтровал? Пересмотрел руководство программиста 2 раза - не нашел куда его пристроить(
Ерунда какая-то в QT с выключением логов и нанесением объектов на карту. Делаю так: Включаю режим потоковой загрузки данных и/или отключаю логи: так ::mapSetLoadState( axсMapView->property("MapHandle").toInt(), SIT->property("SiteHandle").value<int>(), true ); или так SIT->dynamicCall("WriteLogAccess(bool)", false );
наношу объекты на карту.. (время выполнения теперь адекватное)
выключаю потоковую загрузку и/или включаю обратно логи.
Поиск по объектам работает. Закрываю/Открываю свое приложение. Открываю СИТ объекты отображаются - поиск не работает. При этом если ситовские файлы открыть панарамой мини - то на карте объектов не видно, но по поиску они все находятся с метриками и симантиками.
Если проделываю все тоже самое без включенного ускорения - после переоткрытия моего приложения - поиск работает и панарама мини отображает объекты на карте.
У себя в коде комментирую и раскоментирую только указанные выше строки - больше ничего не трогаю при этом (это на всякий случай)