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

Денис Вицко (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Денис Вицко
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 ... 95 96 97 98 99 100 101 102 103 104 105 ... 142 След.
Функции mapViewUserObject, mapViewMapObject, прикладная задача для ГИС Панорама12
 
[QUOTE]Дарья Лунченко написал:
Когда убрала все, что связано с функцией mapViewUserObject функция mapViewMapObject начала работать корректно. [/QUOTE]

Это говорит о том, что ошибка где-то до вызова mapViewUserObject. Возможно, как раз в подготовке параметров для ее вызова.

Пока по Вашему коду особых нареканий нет.

Кроме этого:
[CODE]ObjPoints = new DOUBLEPOINT[sizeof(DOUBLEPOINT)*nPoint];[/CODE]
Вы таким образом выделяете в 16 раз больше памяти, чем Вам надо. Это неправильно, но влиять ни на что не должно.
Должно быть так:
[CODE]DOUBLEPOINT *ObjPoints = new DOUBLEPOINT[nPoint];[/CODE]
- ObjPoints должна быть объявлена как типизированный указатель DOUBLEPOINT*, чтобы Вы могли работать с элементами массива по индексу точки (как это у Вас реализовано - &ObjPoints[p]).
Удаление объекта. Он не удаляется., удаляю всеми способами... все равно не удаляется.
 
Делать сортировку на каждое удаление объекта - это жестоко.
Сортировка выполняет физическую очистку объектов в файлах данных. При удалении объекта он физически не удаляется, а помечается как удаленный. Этого достаточно, далее система работает так, как если этого объекта нет вообще.
Сортировка - тяжелая операция по пересборке всей структуры карты. Периодически делать надо, но только периодически, а не на каждое удаление.

Далее. По коду ошибок не вижу.

У Вас mapView - это TMapView или TMapScreen?

У mapView случайно свойство Rendering не установлено в false?


Вот примерно такой код должен работать:

[CODE]procedure TMapPtPoint.deleteFromMap;
var
 mObj:TMapObj;
begin
 try
   if mapView = nil then exit;

   mObj := TMapObj.Create(nil);
   try
     mObj.MapView := mapView;
     if (mObj.SeekObject(mapView.MapName, objKey) = 1)
       then begin
         mObj.Delete;
         mapView.Repaint;
       end;
   finally
     FreeAndNil(mObj);
   end;

 except
   on e:Exception do AddErrInfo('TMapPtPoint.deleteFromMap: ', E);
 end;
end;[/CODE]

Не проверял на 11.9.0, но каких либо проблем при вызове перерисовки карты и в той версии быть не должно.

Repaint не отработает, если Rendering выключен.

Выполнять mObj.Repaint после удаления бесполезно - объекта уже нет, нет его габаритов, перерисовывать нечего.
Функции mapViewUserObject, mapViewMapObject, прикладная задача для ГИС Панорама12
 
на первый взгляд, по коду все правильно
а как у Вас объявлены прототипы функций? есть подозрение, что потерян где-то в описании стандарт вызова stdcall.
также вылет может происходить из-за ошибки по памяти где-то выше по коду, еще до вызова функций на которых происходит вылет.
Отображение точки относительно базовой, Отображение точки относительно базовой
 
А Ваши "относительные" координаты имеют какую-то свою систему? Оси не совпадают с СК для X,Y или единицы измерения другие, или масштабные коэффициенты по осям?
Если это такая же прямоугольная СК без поворота, то можно решить простым сложением.
На выходе должны получиться координаты в Вашей прямоугольной СК для той же зоны.
При расстоянии, укладывающемся в одну зону, погрешность будет минимальна.
Создание мультиполигонов, прикладная задача для ГИС Карта 12
 
Ситуация интересная. Проанализируем.

Рекомендую основному контуру также устанавливать признак внешнего полигона.
Проблема с закрытием диалога выбора семантики (selSemanticSelect)
 
[QUOTE]Дарья Лунченко написал:
Из названия которых не очень то понятно, где какую функцию искать?[/QUOTE]

Состав библиотек GIS Toolkit не совсем идентичен библиотекам ГИС Панорама 12.
В большинстве своем все описанные функции в заголовочных файлах находятся в соответствующих библиотеках в GIS Toolkit и в созвучных им библиотеках ГИС Панорама 12 (таким же образом и переопределяются константы). Но есть свои нюансы!
В GIS Toolkit, например, все диалоги собраны в библиотеках GISDLGS.DLL и GISFORMS.DLL (включая и selSemanticSelect).
Если Вы пишете прикладную задачу, лучше пользоваться примерами из [URL=http://gisinfo.ru/download?id=229]SDK12[/URL].

Вот, например, как описан вызов selSemanticSelect в SDK12 в проекте Recode:
[CODE]//--------------------------------------------------------------
//  Выбрать код из диалога "Выбор кода семантики"
//--------------------------------------------------------------
int TRecForm::SelectCodeSemant()
{
if(!Hmap || !tMap)   return 0;
if(!Hrsc || !tRsc)   return 0;

int codesem = 0;

HMAP  map;

if(sgSemant->Col == 0)
   map = Hmap;
else
   map = tMap;

HRSC hrsc = mapGetRscIdent(map, map);
if(!hrsc)   return 0;

// Загрузка библиотеки
HINSTANCE libInst;

// Вызов функции
typedef long int (WINAPI * selsemantic)(HRSC,TASKPARM *);

int  row = sgSemant->Row;

selsemantic lpfn_selsemantic = (selsemantic)mapLoadLibrary(MAPSELECLIB,&libInst,"selSemanticSelect");
if(lpfn_selsemantic)
 {
    HWND handle = TaskParm->Handle;
    TaskParm->Handle = Handle;

    TASKPARM  parm;
    memcpy(&parm, TaskParm, sizeof(TASKPARM));

    // Выбрать семантическую характеристику
    codesem = (*lpfn_selsemantic)(hrsc, &parm);

    TaskParm->Handle = handle;

    RSCSEMANTICEX  semtype;
    int column = 0;

    if(sgSemant->Col < 2)   column = 0;
    else  column = 2;

    while(1)
     {
       if(codesem)
        {
          if(!mapGetRscSemanticExByCode(hrsc, &semtype, codesem))  break;

          int line = sgSemant->Row;

          sgSemant->Cells[column][line] = codesem;
          sgSemant->Cells[column + 1][line] = (AnsiString)semtype.Name;
        }
       break;
      }
 }

// Отключить библиотеку
if(libInst)
// Выгрузка библиотеки
::FreeLibrary(libInst);
return codesem;
}[/CODE]
Проблема с закрытием диалога выбора семантики (selSemanticSelect)
 
[QUOTE]Дарья Лунченко написал:
Здравствуйте, подскажите пожалуйста вызываю данную функцию в прикладной задаче для ГИС Панорама 12, и получаю такую же ошибку: Access Violetion ... . Функцию вызываю из библиотеки MAPLIST64.DLL. Может надо из другой?[/QUOTE]

Функция [URL=http://help.gisinfo.ru/showresult.php?file=mapselec.htm&search=selSemanticSelect#2]selSemanticSelect [/URL]находится в библиотеке mapselec64.dll.
Вызвать функцию из библиотеки, в которой этой функции нет, нельзя. Поэтому непонятно, откуда берется AV.

Если вызов идет из правильной библиотеки, то для того, чтобы понять причину AV, надо больше информации: как описан прототип функции, библиотека линкуется статически или динамически, как получаются входные параметры, нет ли в них грязи?
В какой среде выполняется разработка?
Удаление объекта из серии
 
[QUOTE]Сергей Викторович написал:mapLogAccess (form_main.mvMap.MapHandle,0,0);
это особенно помогло. [/QUOTE]
А дополнительно открытие карты в монопольном доступе помогло бы еще лучше.

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

Все равно это долго, если у Вас не десятки миллионов объектов.
Вы можете провести эксперимент:
Сделайте копию Вашей карты, откройте ее в ГИС Карте, выделите те же объекты и выполните их удаление со снятой галкой "Запись транзакций".
[img]http://s019.radikal.ru/i637/1707/a5/f5bf984d46a2.png[/img]
Ваше приложение может выполнять удаление с такой же скоростью, если Вы не делаете лишних замедлений в виде вывода на форме семантических характеристик удаляемых объектов (их все равно никто прочитать не успеет), либо лишних перерисовок элементов формы и самой карты.
Удаление объекта из серии
 
[QUOTE]Сергей Викторович написал:
Неужели нельзя все объекты
form_main.MapFind1.MapSelect.Excode[10000013,OL_SQUARE] := true;
выбрать и сразу все удалить?[/QUOTE]

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

1.
Задержка происходит из-за того, что без явного управления транзакциями для каждой операции с каждым объектом открывается отдельная транзакция.
Если нет необходимости вести журнал транзакций, то его можно отключить (см. метод TMapView.WriteLogAccess или MAPAPI - [URL=http://help.gisinfo.ru/showresult.php?file=logapi.htm&search=mapLogAccess#1]mapLogAccess[/URL]).
Если журнал нужен, то для массовых операций следует открывать транзакцию и по завершении ее закрывать (тогда транзакция будет всего одна для всего пакета операций).
Функционал для работы с журналом транзакций описан [URL=http://help.gisinfo.ru/apilist3.htm#f27]тут[/URL].

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

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

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

Да, и MapObj.Commit после MapObj.Delete не нужен.
Удаление объекта из серии
 
Само понятие "серия" существует только в классификаторе карты. Для объектов карты есть только код условного знака в классификаторе (ссылка на объект классификатора).
Является ли серией условный знак объекта или нет, сам объект не знает.

Функция [URL=http://help.gisinfo.ru/maprscex.htm#mapSeriaDelete]mapSeriaDelete[/URL] - это функция работы с классификатором карты, а не с самой картой.
Ее вызовом Вы удалили описание серии в классификаторе карты, а не объекты с карты, имеющие такой код.
А поскольку условного знака для этих объектов больше не стало в классификаторе, они стали отображаться системными знаками.

Для удаления объекта карты выполняется функцией [URL=http://help.gisinfo.ru/mapapi1.htm#mapDeleteObject]mapDeleteObject[/URL].
Если требуется выполнить удаление множества, объединенных по какому либо критерию, то надо [URL=http://help.gisinfo.ru/apilist2.htm#f223]создать контекст выборки (поиска) объектов[/URL] по этому критерию (или нескольким критериям), а затем, перебирая полученную выборку, удалить каждый объект, попавший в нее той же функцией [URL=http://help.gisinfo.ru/mapapi1.htm#mapDeleteObject]mapDeleteObject[/URL].

Либо можно воспользоваться связкой компонент GIS ToolKit - TMapFind+TMapObj.
Страницы: Пред. 1 ... 95 96 97 98 99 100 101 102 103 104 105 ... 142 След.



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

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