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

автоматизация обновления карты после изменения геоданных

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 След.
RSS
автоматизация обновления карты после изменения геоданных
 
после обновления данных на карте (в основном семантика) запускается MapSort.
без нее изменения объектов карты не фиксируются.

это по утверждению тестеров.

может быть это связано с тем, что тестеры работают с удаленными картами, а я проверяю на локальных.

я такого не замечал и у меня карта меняется сразу.
к тому же, тестеры проверяют ПО в комплексе, т.е. на одном ПО открывают карту, на другом ПО эту же карту обновляют. при этом на первом карта не закрывается и чтобы обновления вступили в силу применяют сортировку.


в диалоге сортировки параметры не сохраняются.
можно ли добавить поля в структуру и скрыть диалог совсем ? либо добавить новую функцию со своей структурой.
сейчас в структуре нет полей, которые указываются в диалоге.
Изменено: mihalych72 - 18.01.2023 16:00:34
 
Добрый день!

Во-первых, применять сортировку для того, чтобы увидеть изменения карты, выполненные в другом ПО, - это жестоко.
Следует понимать, что карта, открываемая одновременно в двух или более программах, - это по сути многопользовательский доступ.
Для корректной работы с картами в многопользовательском доступе должен применяться ГИС Сервер, который единственный открывает карту в монопольном режиме, а все остальные обращаются к ГИС Серверу.
Когда Вы открываете карту в нескольких приложениях как файл (не используя ГИС Сервер), то разделение доступа будет на уровне файла и будет регулироваться операционной системой. Такой совместный доступ чреват разными сюрпризами.
Попробуйте, например, один и тот же файл Word или Excel одновременно открыть более одного раза.
Кроме того не все форматы карт поддерживают возможность такой работы. Например, карты формата SITX нельзя редактировать ни в одном приложении, кроме первого, в котором она была отрыта. Остальные смогут открыть эту карту только на чтение.


Для синхронизации данных в памяти и на диске предназначен метод TMapView.AdjustData.
В вашем случае одно приложение меняет данные и сохраняет их на диск, из-за чего данные, открытые во втором приложении становятся рассинхронизированными с данными на диске.
Вызов этого метода во втором приложении должен помочь.


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

Сортировка, выполняемая из одного приложения, приведет к рассинхронизации данных в других приложениях, если эта же карта там тоже была открыта. То есть в них придется также вызывать TMapView.AdjustData, так что принудительно синхронизировать данные всё равно придется.

Когда делать сортировку - решать Вам.
Ее надо периодически выполнять для карт, в которых помногу и часто изменяются данные, но точно не при каждом изменении.

Во-вторых, сортировка с вызовом диалога выполняется только методом TMapView.MapSortDialog. Остальные методы (MapSort и MapSortProcess) работают без диалога, внутри они вызывают MAPAPI фукнкцию
Цитата

//---------------------------------------------------------------------------
//  Сортировка всех карт, входящих в документ
// hmap   - идентификатор сортируемого документа
// handle - идентификатор окна диалога процесса обработки (HWND)
// mode   - комбинация флагов способа обработки карты:
//   0 - сортировать все листы,
//   1 - только несортированные;
//   2 - сохранять файлы отката;
//   4 - повысить точность хранения в метрах, число знаков максимальное;
//  16 - повысить точность хранения в метрах, формат - см  (2 знака);
//  32 - повысить точность хранения в метрах, формат - мм  (3 знака);
//  64 - повысить точность хранения в радианах, число знаков максимальное;
// При ошибке возвращает ноль
//---------------------------------------------------------------------------

function MapSortProcess(HMap : HMap;Handle : HMessage; mode : integer) : integer;
 stdcall external sGisVecex;

При необходимости можно воспользоваться более "продвинутыми" функциями:
Цитата
 // Сортировка отдельной карты документа                          
 // mapname - сортируемая карта
 // flags   - Флажки обработки карты :
 //   0 - сортировать все листы,
 //   1 - только несортированные,
 //   2 - сохранять файлы отката,
 //   4 - повысить точность хранения, формат - мкм
 //   8 - нормальная точность хранения (FLOAT).
 //  16 - повысить точность хранения, формат - см
 //  32 - повысить точность хранения, формат - мм
 //  64 - повысить точность хранения, формат - радианы
 // 128 - формировать мультиконтура для объектов с флагом мультиконтурный
 // handle     - идентификатор окна, которому посылаются сообщения WM_OBJECT и WM_ERROR,
 //              если не задан параметр hEvent
 // hEvent     - адрес функции обратного вызова для уведомления о проценте выполнения,
 //              если параметр не задан, то посылаются сообщения WM_OBJECT и WM_ERROR
 // eventparam - параметр, передаваемый функции обратного вызова
 // outpath    - буфер для записи пути к папке, куда сохранили отсортированную карту,
 //              если задан этот параметр, то исходная карта не обновляется,
 //              папка создается автоматически в программе сортировки
 // size       - длина буфера в байтах
 // format - управление форматом карты :                  
 //  0 -  не менять,
 //  1 -  установить формат SITX (на входе может быть SIT или MAP с одним листом),
 //  2 - упаковать карту в формат SITZ\MAPZ, точность - см,                        
 // -1 -  установить формат SIT (на входе может быть SITX или MAP с одним листом),
 // code - управление шифрованием карты :
 //  0 - не менять,
 //  1 - шифровать данные с помощью пароля из параметра password (формат SITX),
 // -1 - снять шифрование данных
 // password - пароль для шифрования данных, когда code = 1, или 0
 // Если карта отсортирована успешно - возвращает 1
 // Если карта уже отсортирована - возвращает 2
 // Если оператор прервал операцию - возвращает -1
 // Если карта не доступна на редактирование - возвращает -2
 // При ошибке возвращает ноль

function  MapSortingWithEventPro(const mapname : PWCHAR; flags : integer;
                                handle : HMESSAGE; hEvent : TEVENTCALL; eventparam : Pointer;
                                outpath : PWCHAR; size : integer;
                                format : integer; code : integer;
                                const password : PWCHAR) : integer;
stdcall external sGisAcces;
 

function  MapSortingSitePro(aMap : HMAP; aSite : HSITE; flags : integer;
                           handle : HMESSAGE; format : integer; code : integer;
                           const password : PWCHAR) : integer;
stdcall external sGisAcces;
 

function  MapSortingWithEventUn(const mapname : PWCHAR; flags : integer;
                               handle : HMESSAGE; hEvent : TEVENTCALL; eventparam : Pointer;
                               outpath : PWCHAR; size : integer) : integer;
stdcall external sGisAcces;
 
Спасибо, Денис.

описание флагов я в h файлах не видел. Ваше описание очень подробное. буду пробовать.

я вызываю MapSort. диалог появляется всегда !


сейчас тестеры делают так:
обновляют карту из ПО1. в конце обновления, в ПО1 выполняется sort. закрывают ПО1. потом открывают ПО2.
утверждают, что при открытии ПО2 карта не обновляется до тех пор, пока они из ПО2 не вызовут sort.
ПО1 может работать с локальной и удаленной картой. ПО2 только с удаленной.



вопрос такой:могу ли я работать параллельно с одной и той же картой, так: (?)
работа в ПО1 и ПО2 выполняется с удаленной карте (на одном геосервере).

работает основное ПО1 (чт,изм) - открывает карту и не закрывает ее до закрытия приложения ПО1.
из ПО1 вызывается ПО2 для отчета. ПО2 работает с удал. картой только на чт. причем в ПО2 нужно открыть карту, получить данные и закрыть. потом формируется отчет. в ПО2 сортировка не вызывается.
допустима ли такая работа ?
 
Что Вы подразумеваете под удаленной картой?
Речь про карту с ГИС Сервера?

Тогда что означает работа ПО1 с локальной картой?
Вы карту, опубликованную на ГИС Сервере, параллельно открываете в ПО1 как файл (минуя ГИС Сервер)?
Так делать категорически нельзя!


Доступ к картам, опубликованным на ГИС Сервере, должен осуществляться исключительно через обращение к ГИС Серверу.
Цитата
mihalych72 написал:
работает основное ПО1 (чт,изм) - открывает карту и не закрывает ее до закрытия приложения ПО1.из ПО1 вызывается ПО2 для отчета. ПО2 работает с удал. картой только на чт. причем в ПО2 нужно открыть карту, получить данные и закрыть. потом формируется отчет. в ПО2 сортировка не вызывается.допустима ли такая работа ?

Если ПО1 и ПО2 работают с картой через ГИС Сервер, то это нормально.
Однако, если ПО1 вносит изменения в самостоятельно открытой транзакции, то ПО2 не увидит этих изменений, пока ПО1 не закроет транзакцию, а ПО2 после этого не вызовет TMapView.AdjustData для синхронизации данных.
 
Цитата
mihalych72 написал:
я вызываю MapSort. диалог появляется всегда !

Покажите код, пожалуйста.

Вызов диалога выполняется только методом TMapView.MapSortDialog.
TMapView.MapSort и TMapView.MapSortProcess работают без диалога.
 
Денис, извините за задержку.


вызов кода, сразу после целевого кода обновления карты

...
         // если карта обновлена успешно и ошибок нет,
         // обновляем данные на карте сразу
         if NOT fImporter.MapChangeError
           then fMapControl.MapDataUpdate;



function TGTK_MapViewControlHelper.MapDataUpdate: boolean;
Var
 xTASKPARMEX: TTASKPARMEX;
begin
 DoLogAction( 'Выполняется обновление данных карты...');
 DoLogShift;
 try
   Result := Active;
   if NOT Result then begin
     DoLogWarning( 'Карта не указана.');
     EXIT;
   end;
   xTASKPARMEX.Language := 2;
   xTASKPARMEX.Resource := 1;
   xTASKPARMEX.HelpName := '';
   xTASKPARMEX.IniName :='';
   xTASKPARMEX.PathShell := '';
   xTASKPARMEX.ApplicationName :='';
   xTASKPARMEX.Handle := 0;
   xTASKPARMEX.DocHandle := 0;
   xTASKPARMEX.StayOnTop := 0;
   Result := ( MapSort( MapView.MapHandle, ADDR( xTASKPARMEX)) <> 0);
   if Result
     then DoLogExt( 'Данные карты обновлены')
     else DoLogError( 'Сбой MapSort - данные карты не обновлены.');
   finally
     DoLogShiftBack;
 end;
end;


диалог появляется всегда.
я попробую переделать с учетом того, что Вы написали.
сейчас срочность в этом отпала - все равно не работает как нужно.
нормальное обновление карты (после сортировки) выполняется в другом ПО, которое открывается после обновления карты. только там это норм. отрабатывает, а сразу после обновления код сортировки выполняется без ошибок, но карта не обновляется как нужно. точно такой же код сортировки выполняется в другом ПО.
попробую Ваше решение - может это сработает. но буду пробовать позже. сейчас не до этого.
 
Цитата
Денис Вицко написал:
Тогда что означает работа ПО1 с локальной картой? Вы карту, опубликованную на ГИС Сервере, параллельно открываете в ПО1 как файл (минуя ГИС Сервер)?
Денис, речь идет о комплексе.
основное ПО работает только с удаленной картой с ГИС сервером. часть ПО (отчеты) вызывается из основного. для отчетов карта используется только на чтение. отчеты могут работать как с локальной (явное указание файла карты), так и с удаленной картой (с гис сервером) - как укажут параметры при вызове отчетов.служебное ПО работает как с удаленной так и с локальной картой. локальная - это копия с гис сервера. карты копируют с гис сервера, обновляют на локальном компе и копируют обратно на гис сервер.
но могут обновить сразу удаленную карту. но это только в экстренных случаях. для больших карт обновление длится часами (пока алгоритмы не оптимизированы - сейчас задача чтобы они правильно работали, да и вообще обновление не быстро делается). поэтому, чтобы не было проблем с параллельной работой и проблемами сети, большие карты копируются на локальный комп. запускают обновление и после копируют обратно.
Изменено: mihalych72 - 21.01.2023 19:19:47
 
Цитата
mihalych72 написал:
вызов кода, сразу после целевого кода обновления карты

Теперь стало понятно, откуда диалог.
Вы вызываете MAPAPI функцию, которая работает с диалогом.

Я выше писал про одноименный штатный метод в TMapView - TMapView.MapSort, который работает без диалога.
Кроме того, я выше приводил функции MAPAPI, выполняющие сортировку без вызова диалогов.


Цитата
mihalych72 написал:
поэтому, чтобы не было проблем с параллельной работой и проблемами сети, большие карты копируются на локальный комп. запускают обновление и после копируют обратно.

Применение ГИС Сервера как раз призвано решать проблему параллельной работы.

Цитата
карты копируются на локальный комп. запускают обновление и после копируют обратно
Вот с этим давайте разберемся поподробнее.
Если для этого используются штатные методы ГИС Сервера и карта сохраняется в виртуальной папке ГИС Сервера (см. Документацию - Применение виртуальных папок), то проблем быть не должно.
Но если Вы мимо ГИС Сервера (не штатным функционалом ГИС Сервера) перезаписываете карты, которые на нем опубликованы, - это как раз и будет являться причиной того, что пользователи ГИС Сервера то видят, то не видят изменения данных, да и вообще - это может привести к разрушительному сбою.
 
Цитата
Денис Вицко написал:
Если для этого используются штатные методы ГИС Сервера
Денис, этого я не знаю.
мне дают карту для обработки, я ее обновляю и возвращаю результат.
я с картой работаю локально. как ее потом размещают на геосервере - не знаю.
могу только сказать, что обновление карты выполняю не только я. другие тоже могут обновлять, и работают прямо с удаленной картой.
обновление карты - это сложная операция. часть операций обновляет только карту, часть: карта+бд.
знаю только что в момент обновления карт либо блокируются пользователи, работающие с картами, либо это делается, когда минимальная активность пользователей.
перезапись карт на дисках, с которыми работают пользователи - это действительно фатально.
 
Цитата
Денис Вицко написал:
Я выше писал про одноименный штатный метод в TMapView - TMapView.MapSort, который работает без диалога.
Денис, извините. я даже внимание на это не обратил. методы одноименные.
Ваши описания флагов я в код внес, но саму функцию сортировки (вызов) еще не правил. это сейчас делаю.
по результатам отпишу.

не нашел флаг "удалять копии отредактированных объектов"
вот его нужно выставить, остальные сбросить.
это флаг 2 - сохранять файлы отката ?

использую MapSortingSitePro( mvmap.handle, 0, флаги, 0, 0, 0, nil);
у флагов нужно выставить только "удалять копии отредактированных объектов"
поскольку тут диалога нет, не могу проверить что выставляю.
Изменено: mihalych72 - 23.01.2023 13:15:16
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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