Несколько дополнительных моментов.
1.
Журнал транзакций не связан с операциями отрисовки.
Надо определиться, нужен ли он вам вообще, либо его отключить:
Скрытый текст |
---|
Цитата |
---|
// Запросить - ведется ли журнал транзакций // hMap - идентификатор открытой карты // hSite - идентификатор открытой пользовательской карты // 0 - не ведется, иначе - ведется _MAPIMP long int _MAPAPI mapGetLogAccess(HMAP hMap, HSITE hSite);
// Запретить/Разрешить ведение журнала транзакций (0/1) // После открытия карты ведение журнала разрешено. // Допускается использовать только при потоковой обработке // объектов, когда быстродействие важнее возможности // сохранить данные при сбое системы ! // Перед отключением журнала рекомендуется позаботиться о // резервной копии данных ! // hMap - идентификатор открытой карты // hSite - идентификатор открытой пользовательской карты // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapLogAccess(HMAP hMap, HSITE hSite,long int mode); |
|
Если журнал транзакций нужен, то при множественных операциях редактирования желательно самостоятельно открыть свою транзакцию и по окончании ее подтвердить.
В противном случае транзакция будет создаваться автоматически на каждый Commit каждого объекта.
2.
При относительно большом количестве объектов (несколько сотен и более) держать их все в памяти (в axMapObj) и самостоятельно выполнять их отрисовку не рационально. Лучше в этом случае все же сохранить их на карту и выполнять ее отрисовку штатными средствами ГИС-ядра.
Как вариант можно для этого использовать временную карту, размещенную в памяти (не будет дисковых операций):
Скрытый текст |
---|
Цитата |
---|
// Создать временную пользовательскую карту // Файлы карты размещаются в рабочей директории системы // и имеют уникальные имена, генерируемые автоматически // При закрытии карты все файлы данных удаляются // Если параметр inmemory не равен 0, то все данные хранятся только в оперативной памяти // и освобождаются при закрытии карты // rscname - полное имя файла ресурсов RSC // mapreg - параметры проекции создаваемой временной карты или 0 // Если mapreg не задан, то создается Цилиндрическая прямая равноугольная Меркатора на шаре EPSG:3857 // datum - параметры датума или 0 // ellipsoid - параметры эллипсоида или 0 // inmemory - признак создания карты в оперативной памяти или 0 // При ошибке возвращает ноль
_MAPIMP HMAP _MAPAPI mapCreateTempSitePro(const WCHAR *rscname, MAPREGISTEREX *mapreg, DATUMPARAM *datum, ELLIPSOIDPARAM *ellipsoid, long int inmemory);
// Создать временную пользовательскую карту с системой координат и классификатором, как у эталонной карты // hmap - идентификатор открытых данных // hSite - идентификатор пользовательской карты // inmemory - признак создания карты в оперативной памяти или 0 // При ошибке возвращает ноль
_MAPIMP HMAP _MAPAPI mapCreateTempSiteForMap(HMAP hmap, HSITE hsite, long int inmemory); |
|
Эту карту надо сделать в той же проекции и СК, что и основная карта, чтобы избежать пересчетов при их совместной отрисовке.
3.
Цитата |
---|
Александр Смагин написал: Функция mapCreateArc рисует дугу, а например окружность можно нарисовать с помощью нее же( сектор 360* )? или есть другая функция API? |
Да, этой же функцией создается и окружность.
Пример для С++ (окружность с радиусом r и центром в x-y):
Цитата |
---|
DOUBLEPOINT point1 = {x-r,y}; DOUBLEPOINT center = {x ,y}; mapCreateArc(hMap, obj, &point1, ¢er, &point1, r); |
4.
Метод CreateObjectByInCode (или SetObjectByIncode) работает быстрее, чем CreateObjectByExCode (SetObjectByExcode). Однако, следует иметь в виду, что при изменениях в классификаторе внутренние коды могут измениться.