GIS PANORAMA - Инструмент за разработка на ГИС приложения GIS Toolkit - Връзка към ГИС сървър

GIS Server 2008 е програма, предназначена да осигури отдалечен достъп до картографски данни за потребителите на GIS Map 2008, Panorama-Editor, GIS Navigator 2008, GIS viewer и други програми, разработени в среда GIS ToolKit версия 10 и по-нова.

Сървърът осигурява отдалечен достъп до векторни карти, растери и матрици. Връзката със сървъра се осъществява по TCP\IP протокола чрез сокет механизъм. Сървърът е реализиран за платформи Windows, Linux, Solaris (Sparc).

Поставянето на данни на сървъра осигурява защита от неправомерен достъп и повишава надеждността и скоростта на операциите за редактиране на данни от няколко потребители едновременно.

За да се ускори работата с данни в мрежата, буферът за данни на клиента (кеш) е значително увеличен и част от операциите за редактиране на обекти и записване на транзакции се извършват на сървъра, което намалява количеството на прехвърляните данни в сравнение с достъпа в режим на файлов сървър. В същото време скоростта на редактиране на данни през ГИС сървъра е 3-5 пъти по-висока в сравнение с директното отваряне на картата през мрежата (http://www.gisinfo.ru/products/gisserver.htm).

За дасинхронизира работата на няколко потребителя (за всеки метод за достъп до данни), приложението трябва периодично да извиква функцията mapAdjustData, която ще актуализира буфера за данни, ако е необходимо.

_MAPIMP long int _MAPAPI mapSetConnectParameters(const char * name, long int port, long int ishost);

Тези действия могат да се извършват и чрезстандартния диалогов прозорец, извикан от библиотеката gisdlgs.dll:

// Изискване на параметри за връзка от ГИС сървъра // Връща нула при грешка long int WINAPI svGetConnectParameters(TASKPARM *parm);

Резултатът от работата на потребителячрез стандартния диалог, можете да разберете, като потърсите GIS ядрото за текущите настройки, като използвате функциите на интерфейса MAPAPI:

// Изискване на текущия номер на порт за комуникация с GIS сървъра // Номер на порт от 1024 до 65536, по подразбиране - 2047

_MAPIMP long int _MAPAPI mapGetConnectPort();

_MAPIMP long int _MAPAPI mapGetConnectHost(char * име, long int size);

В края на приложението текущите настройки могат да бъдат запазени в INI файл и след това да бъдат възстановени, когато приложението стартира с функцията mapSetConnectParameters.

Преди достъп до картите на ГИС сървъра, потребителят (клиентската програма) трябва дасе регистрира. За това се използва функцията mapRegisterUser.

// Регистриране на потребител // Ако връзката със сървъра не е установена - // опитва се да се свърже с предварително зададени параметри // Структурата на USERPARM е описана в maptype.h // Връща нула при грешка

_MAPIMP long int _MAPAPI mapRegisterUser(TMCUSERPARM * parm);

В структурата на TMCUSERPARM се предават две полета - Име (потребителско име в кодиране ANSI) и Парола (парола, въведена в ANSI и кодирана с помощта на алгоритъма MD5). Функциите за конвертиране на низ с помощта на алгоритъма MD5 са налични в различни инструменти за програмиране и се поддържат на ниво Windows OS (cryptdll.dll). Тези действия могат да се извършват и чрезстандартния диалогов прозорец, извикан от библиотеката gisdlgs.dll:

// Регистриране на потребител (въведете потребителско име и парола) // Връща нула при грешка long int WINAPI svGetUserData(TASKPARM *parm);

За даискате името на текущо регистриранияпотребител, използвайте функцията mapGetCurrentUserName:

// Поискайте името на потребителя, свързан към GIS сървъра //Връща празен низ при грешка

_MAPIMP const char * _MAPAPI mapGetCurrentUserName();

За отваряне на карта на ГИС сървъра се използват същите функции като за отваряне на локално разположена карта (mapOpenData). Разлики във формата на името на картата. Името на картата на GIS сървъра изглежда като "ALIAS#условно_име_на_карта". Низът "ALIAS#" е ключова дума за достъп до ГИС сървъра.

Списъкът с конвенционални имена накарта (псевдоними), достъпни за регистриран потребител, може да бъде поискан чрез функциите на интерфейса MAPAPI:

_MAPIMP long int _MAPAPI mapGetMapListforUser(TMCMAPLIST * буфер, int дължина);

_MAPIMP long int _MAPAPI mapGetMtwListforUser(TMCMAPLIST * буфер, int дължина);

_MAPIMP long int _MAPAPI mapGetRswListforUser(TMCMAPLIST * буфер, int дължина);

Могат да бъдат заявени три списъка - векторни карти, растери и матрици. Списъците могат да бъдат представени като дърво. За да направите това, в структурата TMCMAPLIST всеки елемент има ниво на влагане Level и атрибут тип данни Type (за междинни нива е равен на 0).

Отворете данни или добавете към вече отворени данни с помощта настандартни диалогови прозорци, извикани от библиотеката gisdlgs.dll:

// Отваряне на карта на GIS сървър // Връща нула при грешка long int WINAPI _export svOpenData(TASKPARM *parm);

При избор на карта за отваряне в стандартния диалог се изпраща съобщение до главния прозорец на приложението (чийто идентификатор е посочен в TASKPARM) - AW_OPENDOC (0x655):

::SendMessage(Parm->Handle, AW_OPENDOC, (WPARAM)name, 0);

В параметъра WPARAM се предава указател към низ във формата: „ALIAS#условно_име_на_карта". Ако бутонът Добавяне е натиснат в диалоговия прозорец за отваряне на данни, диалоговият прозорец се опитва да определи текущата карта чрез изпращанезаявка под формата на съобщение AW_GETCURRENTDOC (0x673):

::SendMessage(Parm->Handle, AW_GETCURRENTDOC, (long)&hWnd, (long)&hMap);

В отговор трябва да върнете указател към идентификатора на данните (HMAP) и идентификатора на прозореца с отворена карта, за да го информирате за необходимостта от преначертаване на прозореца след отваряне на данните:

::InvalidateRect(hWnd, 0, false);

Ако идентификаторът на данните (HMAP) не е зададен в отговор на съобщението AW_GETCURRENTDOC, тогава бутонът Добавяне в диалоговия прозорец не е активен, ако идентификаторът на прозореца (HWND) не е зададен, тогава функцията InvalidateRect не се изпълнява.

Само задобавяне на данни към предварително отворени данни,стандартният диалогов прозорец от библиотеката gisdlgs.dll може да бъде извикан:

// Добавяне на данни от GIS сървъра към текущата карта // Връща нула при грешка long int WINAPI _export svAppendData(HMAP hmap, TASKPARM *parm)

В този случай идентификаторът на картата, към която се добавят данните, се предава като функционален параметър. В списъка с данни векторните карти от типа MAP няма да бъдат налични за добавяне, тъй като могат да се добавят само персонализирани карти (SIT).

За да определите даликъде е отворена текущата карта - на ГИС сървъра или локално, използвайте интерфейсната функция MAPAPI:

// Заявка дали картата е отворена на сървъра или локално // hmap - идентификатор на отворени данни // hSite - идентификатор на отворена потребителска карта // (за фоновата (основна) карта hSite = hMap) // Ако картата е отворена на сървъра, тогава връща ненулева стойност

_MAPIMP long int _MAPAPI mapIsMapFromServer(HMAP hMap, HSITE hSite);

// Попитайте дали обектите на картата могат да бъдат копирани в други карти или експортирани // hMap - отворен идентификатор на карта // hSite- идентификатор на отворена потребителска карта // Ако не, връща нула

_MAPIMP long int _MAPAPI mapGetSiteCopyFlag(HMAP hMap,HSITE hSite);

Ако функцията е върнала нулева стойност, тогава приложението не трябва да извършва действия за запазване на данни или копирането им извън ГИС сървъра. За повишаване на надеждността на съхранението на данни се предлага да се въведе процедура за регистриране на приложения на ГИС сървъра.