www.gisinfo.ru     |    panorama@gisinfo.ru   |    рус | eng | блг | esp   

Подключение к ГИС Серверу


Подключение к ГИС Серверу

ГИС Сервер 2008 – программа, предназначенная для обеспечения удаленного доступа к картографическим данным пользователей программ ГИС Карта 2008, Панорама-Редактор, ГИС Навигатор 2008, ГИС-вьюер и других программ, разработанных в среде GIS ToolKit версии 10 и новее.

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

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

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

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

Для передачи данных по протоколу TCP\IP программа должна знать параметры соединения - IP-адрес сервера и номер порта. Вместо IP-адреса может быть указано имя компьютера в локальной сети (хост).

// Установить параметры соединения с ГИС-сервером
// Вызывается до открытия карт на сервере
// name - имя хоста (до 256 символов), если ishost не равен 0
// или строка адреса "XXX.XXX.XXX.XXX"
// Если параметр равен нулю - сервер ищется на локальном хосте "localhost".
// port - номер порта от 1024 до 65536, по умолчанию - 2047 (если port = 0)
// При ошибке возвращает ноль

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

Эти действия можно выполнить и через стандартный диалог, вызываемый из библиотеки gisdlgs.dll:

// Запрос параметров соединения с ГИС - сервером
// При ошибке возвращает ноль
long int WINAPI svGetConnectParameters(TASKPARM *parm);

Результат работы пользователя через стандартный диалог можно узнать, запросив в ГИС ядре текущие установки функциями MAPAPI-интерфейса:

// Запросить текущий номер порта для связи с ГИС-сервером
// Номер порта от 1024 до 65536, по умолчанию - 2047

_MAPIMP long int _MAPAPI mapGetConnectPort();

// Запросить имя\адрес хоста
// Если было установлен адрес хоста - возвращаемое значение 1,
// если имя хоста - возвращаемое значение 2.
// Если установлено оба значения - возвращается адрес хоста
// name - адрес строки для размещения результата
// size - размер строки (для имени хоста не менее 256)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetConnectHost(char * name, long int size);

По окончании работы приложения текущие установки могут быть сохранены в INI-файле, а затем при старте приложения восстановлены функцией mapSetConnectParameters.

Прежде, чем получить доступ к картам на ГИС Сервере, пользователь (клиентская программа) должен зарегистрироваться. Для этого применяется функция mapRegisterUser.

// Зарегистрировать пользователя
// Если соединение с сервером не было установлено -
// пытается соединиться с установленными ранее параметрами
// Структура USERPARM описана в maptype.h
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapRegisterUser(TMCUSERPARM * parm);

В структуре TMCUSERPARM передаются два поля – Name (имя пользователя в кодировке ANSI) и Password (пароль, введенный в ANSI, и закодированный по алгоритму MD5). Функции для преобразования строки по алгоритму MD5 имеются в различных средствах программирования и поддерживаются на уровне ОС Windows (cryptdll.dll).
Эти действия можно выполнить и через стандартный диалог, вызываемый из библиотеки gisdlgs.dll:

// Зарегистрировать пользователя (ввести имя пользователя и пароль)
// При ошибке возвращает ноль
long int WINAPI svGetUserData(TASKPARM *parm);

Чтобы запросить имя текущего зарегистрированного пользователя применяется функция mapGetCurrentUserName:

// Запросить имя пользователя, подключившегося к ГИС-серверу
// При ошибке возвращает пустую строку

_MAPIMP const char * _MAPAPI mapGetCurrentUserName();

Для открытия карты на ГИС Сервере используются те же, функции, что и для открытия локально расположенной карты (mapOpenData). Отличия в формате имени карты. Имя карты на ГИС Сервере имеет вид "ALIAS#условное_имя_карты". Строка "ALIAS#" является ключевым словом для обращения к ГИС-серверу.

Список условных имен карт (алиасов), доступных для зарегистрированного пользователя, можно запросить функциями MAPAPI-интерфейса:

// Запросить список доступных пользователю карт на ГИС-сервере
// buffer - адрес памяти для размещения списка карт,
// структура TMCMAPLIST описана в maptype.h
// length - длина выделенной области памяти
// Для открытия выбранной карты функциями MAPAPI к ее
// имени должен быть добавлен префикс "ALIAS#"
// Возвращает общий размер считанной записи или 0

_MAPIMP long int _MAPAPI mapGetMapListforUser(TMCMAPLIST * buffer, int length);

// Запросить список доступных пользователю матриц на ГИС-сервере
// buffer - адрес памяти для размещения списка карт,
// структура TMCMAPLIST описана в maptype.h
// length - длина выделенной области памяти
// Для открытия выбранной матрицы функциями MAPAPI к ее
// имени должен быть добавлен префикс "ALIAS#"
// Возвращает общий размер считанной записи или 0

_MAPIMP long int _MAPAPI mapGetMtwListforUser(TMCMAPLIST * buffer, int length);

// Запросить список доступных пользователю растров на ГИС-сервере
// buffer - адрес памяти для размещения списка карт,
// структура TMCMAPLIST описана в maptype.h
// length - длина выделенной области памяти
// Для открытия выбранного растра функциями MAPAPI к ее
// имени должен быть добавлен префикс "ALIAS#"
// Возвращает общий размер считанной записи или 0

_MAPIMP long int _MAPAPI mapGetRswListforUser(TMCMAPLIST * buffer, int length);

Можно запросить три списка – векторных карт, растров и матриц. Списки могут быть представлены в виде дерева. Для этого в структуре TMCMAPLIST каждый элемент имеет уровень вложенности Level и признак типа данных Type (для промежуточных уровней равен 0).

Открыть данные или добавить к данным, открытым ранее, можно с помощью стандартных диалогов, вызываемых из библиотеки gisdlgs.dll:

// Открыть карту на ГИС Сервере
// При ошибке возвращает ноль
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);

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

Чтобы выполнить только добавление данных к данным, открытым ранее, может быть вызван стандартный диалог из библиотеки gisdlgs.dll:

// Добавить к текущей карте данные с ГИС Сервера
// При ошибке возвращает ноль
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);

Приложение само должно учитывать имеет ли пользователь право на копирование данных (конвертирование, перенос объектов на другую карту и т.п.). Поскольку операции чтения данных из приложения не могут быть блокированы ГИС ядром из-за необходимости выполнения различных расчетных и графических задач. Права пользователя на чтение данных и редактирование контролируются автоматически. Для запроса прав пользователя на копирование данных вызывается функция mapGetSiteCopyFlag:

// Запросить - могут ли объекты карты копироваться на другие карты или экспортироваться
// hMap - идентификатор открытой карты
// hSite - идентификатор открытой пользовательской карты
// Если нет - возвращает ноль

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

Если функция вернула нулевое значение, то приложение не должно выполнять действия по сохранению данных или их копированию вне ГИС Сервера.
Для повышения надежности хранения данных предполагается введение процедуры регистрации приложений на ГИС Сервере.

 

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



Warning: include(../includes/counter.ssi) [function.include]: failed to open stream: No such file or directory in /pub/home/gisinfo/htdocs/products/gistool_gs2008.htm on line 147

Warning: include(../includes/counter.ssi) [function.include]: failed to open stream: No such file or directory in /pub/home/gisinfo/htdocs/products/gistool_gs2008.htm on line 147

Warning: include(../includes/counter.ssi) [function.include]: failed to open stream: No such file or directory in /pub/home/gisinfo/htdocs/products/gistool_gs2008.htm on line 147

Warning: include() [function.include]: Failed opening '../includes/counter.ssi' for inclusion (include_path='.:/usr/local/php5.2/share/pear') in /pub/home/gisinfo/htdocs/products/gistool_gs2008.htm on line 147