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

Удаление объекта из серии

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2
RSS
Удаление объекта из серии
 
Серия представляет собой совокупность пяти связанных таблиц, поэтому обнулять или удалять что-нибудь нельзя. Рекомендуем пользоваться уже несколько раз указанными api-функциями удаления и создания серии, иначе результат непредсказуем.
 
Цитата
Елена Кружкова написал:
Серия представляет собой совокупность пяти связанных таблиц, поэтому обнулять или удалять что-нибудь нельзя. Рекомендуем пользоваться уже несколько раз указанными api-функциями удаления и создания серии, иначе результат непредсказуем
У меня вопрос как раз по функции mapSeriaDelete (HRSC hRsc, long int code, long int local)
Именно так и происходит объекты не удаляются из карты, а становятся системными.
Мне нужно именно удалить эту серию из карты совсем. Как это сделать?
 
Само понятие "серия" существует только в классификаторе карты. Для объектов карты есть только код условного знака в классификаторе (ссылка на объект классификатора).
Является ли серией условный знак объекта или нет, сам объект не знает.

Функция mapSeriaDelete - это функция работы с классификатором карты, а не с самой картой.
Ее вызовом Вы удалили описание серии в классификаторе карты, а не объекты с карты, имеющие такой код.
А поскольку условного знака для этих объектов больше не стало в классификаторе, они стали отображаться системными знаками.

Для удаления объекта карты выполняется функцией mapDeleteObject.
Если требуется выполнить удаление множества, объединенных по какому либо критерию, то надо создать контекст выборки (поиска) объектов по этому критерию (или нескольким критериям), а затем, перебирая полученную выборку, удалить каждый объект, попавший в нее той же функцией mapDeleteObject.

Либо можно воспользоваться связкой компонент GIS ToolKit - TMapFind+TMapObj.
 
Спасибо за ответ. Я так и думал.

Но проблема осталась.
Создать контекст поиска выборки объектов я создаю

orm_main.MapFind1.Active := false;
form_main.MapFind1.FindPoint := false;
form_main.MapFind1.MapSelect.Clear;
form_main.MapFind1.MapObj.Style := OS_NORMAL;
form_main.MapFind1.MapSelect.ClearSemantic;
form_main.MapFind1.MapSelect.Excode[-1,OL_SQUARE] := false;
form_main.MapFind1.MapSelect.Excode[10000013,OL_SQUARE] := true;
form_main.MapFind1.Active := true;
form_main.MapFind1.First;

Да и удаление тоже, как вы рекомендовали

While not form_main.MapFind1.Eof do
begin
form_main.sbStatus.Panels.Items[1].Text := form_main.MapFind1.MapObj.Semantic.SemanticValue[1];
form_main.sbStatus.Repaint;
form_main.MapFind1.MapObj.Delete;
form_main.MapFind1.MapObj.Commit;
form_main.MapFind1.Next;
end;

Ну оооочень долго. Объектов на карте таких много,
и приходится ждать 10-15 минут (

Неужели нельзя все объекты
form_main.MapFind1.MapSelect.Excode[10000013,OL_SQUARE] := true;
выбрать и сразу все удалить?
 
Цитата
Сергей Викторович написал:
Неужели нельзя все объекты
form_main.MapFind1.MapSelect.Excode[10000013,OL_SQUARE] := true;
выбрать и сразу все удалить?

Если бы у Вас была карта, содержащая только те объекты, которые надо удалить, тогда можно было бы не разбираться и почистить всю карту.
А поскольку Вам нужна для удаления выборка объектов по определенным условиям, то без операций поиска и перебора результатов этого поиска не обойтись.

1.
Задержка происходит из-за того, что без явного управления транзакциями для каждой операции с каждым объектом открывается отдельная транзакция.
Если нет необходимости вести журнал транзакций, то его можно отключить (см. метод TMapView.WriteLogAccess или MAPAPI - mapLogAccess).
Если журнал нужен, то для массовых операций следует открывать транзакцию и по завершении ее закрывать (тогда транзакция будет всего одна для всего пакета операций).
Функционал для работы с журналом транзакций описан тут.

2.
Также рекомендуется отключать отрисовку карты на время выполнения потоковых операций (см. свойство TMapView.Rendering).

3.
Кроме того потоковые операции сильно замедляются интерфейсными излишествами типа
Код
form_main.sbStatus.Panels.Items[1].Text := form_main.MapFind1.MapObj.Semantic.SemanticValue[1]; 
form_main.sbStatus.Repaint; 


Но основная причина замедления - отдельные транзакции на каждое удаление объекта.

Да, и MapObj.Commit после MapObj.Delete не нужен.
 
понятно, буду пробовать
 
Скорость редактирования зависит от вида доступа к наборам данных (разделенный или монопольный):
Код
 // Установить монопольный доступ ко всем открываемым векторным картам
 // Ускоряет все операции редактирования карт за счет буферизации
 // операций записи на диск при значении access не равном 0
 // При монопольном доступе другие приложения не смогут
 // редактировать карту
 // Если какая-либо карта не может быть открыта в монопольном
 // доступе - признак автоматически сбрасывается
 // Возвращает новое значение признака монопольного доступа

_MAPIMP long int _MAPAPI mapSetExclusiveAccess(long int access);

 // Запросить значение признака монопольного доступа к открываемым векторным картам

_MAPIMP long int _MAPAPI mapGetExclusiveAccess(void);

Общая транзакция при групповом удалении объектов нужна для удобства отмены всей групповой операции одной командой.
При монопольном доступе транзакции несущественно влияют на скорость работы.
 
Цитата
Денис Вицко написал:
Задержка происходит из-за того, что без явного управления транзакциями для каждой операции с каждым объектом открывается отдельная транзакция.
Если нет необходимости вести журнал транзакций, то его можно отключить (см. метод TMapView.WriteLogAccess или MAPAPI -  mapLogAccess ).
Да,
mapLogAccess (form_main.mvMap.MapHandle,0,0);
это особенно помогло.
Время удаления объектов из карты уменьшилось с 10 минут, до 1 минуты.
Спасибо.
 
Цитата
Сергей Викторович написал:mapLogAccess (form_main.mvMap.MapHandle,0,0);
это особенно помогло.
А дополнительно открытие карты в монопольном доступе помогло бы еще лучше.

Цитата
Сергей Викторович написал:
Время удаления объектов из карты уменьшилось с 10 минут, до 1 минуты.

Все равно это долго, если у Вас не десятки миллионов объектов.
Вы можете провести эксперимент:
Сделайте копию Вашей карты, откройте ее в ГИС Карте, выделите те же объекты и выполните их удаление со снятой галкой "Запись транзакций".

Ваше приложение может выполнять удаление с такой же скоростью, если Вы не делаете лишних замедлений в виде вывода на форме семантических характеристик удаляемых объектов (их все равно никто прочитать не успеет), либо лишних перерисовок элементов формы и самой карты.
Страницы: Пред. 1 2
Читают тему (гостей: 1)



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

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