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

Список доступных пользователю карт на ГИС-сервере

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Список доступных пользователю карт на ГИС-сервере
 
Пытаюсь получить полный список карт на ГИС Сервере

Подключение к серверу взял из документации, подключается нормально, карты по имени открываются.
TMCMAPLIST buffer[10];
mapGetMapListforUser(buffer, 5000);
При вызове функции mapGetMapListforUser всегда возвращается только 1 элемент.
Как программно получить полный список карт на сервере?
 
1. Просьба всегда указывать продукт, который Вы используете, его версию, среду разработки/компилятор и операционную систему.

2. Рекомендуется использовать mapGetMapListforUserEx вместо mapGetMapListforUser, так как последняя является устаревшей и будет работать только с первым соединением с ГИС Сервером (а их может быть несколько). Хотя и эта функция должна корректно вернуть список при корректно заданных входных параметрах.
Цитата
Евгений написал:
TMCMAPLIST buffer[10];
Зачем выделять 10 структур для списка?

Можно запросить необходимый размер в байтах (для всего списка - и заголовочной части, и массива элементов), вызвав эту же функцию с нулевым указателем:
Код
  // Запросить список доступных пользователю карт на ГИС-сервере
  // number - номер активного подключения к ГИС Серверу от 1 до mapActiveServerCount()
  // buffer - адрес памяти для размещения списка карт,
  //          структура TMCMAPLIST описана в maptype.h
  // Если buffer равно нулю, возвращает размер необходимой области памяти
  // length - длина выделенной области памяти
  // Возвращает общий размер считанной записи или 0

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

Затем, выделив необходимый буфер, установить на него указатель (типа TMCMAPLIST*) и перед вызовом mapGetMapListforUserEx проинициализировать заголовочную часть следующим образом (см. Init()):
Ident = 0x7F7F7F7F;
Length = sizeof(TMCMAPLIST);
Count = 0;
MaxLevel = 1;  
Код
typedef struct TMCMAPLIST   // СПИСОК ДОСТУПНЫХ КАРТ
{
  TMCMAPLIST() { Init(); }

  void Init() {  Ident = 0x7F7F7F7F;
                 Length = sizeof(TMCMAPLIST);
                 Count = 0; MaxLevel = 1; }

  int Ident;           // Идентификатор записи 0x7F7F7F7F                         
  int Length;          // Общая длина записи
  int Count;           // Число элементов в списке
  int MaxLevel;        // Максимальный уровень вложенности элементов (дерево)
  TMCMAPLISTITEM Item[1];   // Массив элементов списка доступных карт (в количестве Count)
}
  TMCMAPLIST;

Либо объявить переменную типа TMCMAPLIST и скопировать ее по адресу выделенного буфера (тогда инициализация произойдет автоматически).


Пример того, как получается список данных пользователя на Delphi можно в тексте класса TMapGisServerDataListReader, входящего в состав GIS ToolKit для Embarcadero (если Вы используете Embarcadero C++ Builder или Delphi, то можно воспользоваться этим классом):
Скрытый текст

3. Можно также воспользоваться штатным диалогом ГИС-ядра (MAPAPI-функция svOpenDataEx):
Код
 // Вызвать диалог выбора доступных пользователю данных на ГИС Сервере
 // parm    - параметры задачи (поле Handle должно содержать
 //           идентификатор главного окна)
 // name    - буфер для размещения выбранного алиаса данных
 //          (выделять не менее MAXPATH)
 // size    - размер выделенного буфера
 // Имя выбранного алиаса карты помещается в name
 // При ошибке возвращает ноль
 
 long int WINAPI svOpenDataEx(TASKPARM *parm,char * name,long int size);
 
Вопросы, связанные с разработкой ПО на базе GIS ToolKit или интерфейса MAPAPI, относятся к разделу GIS ToolKit.
Тема была перенесена из раздела "ГИС Сервер".
 
ПО ГИС Конструктор для Qt Designer x64 (версия 11, Qt 4, для платформы "x64", ОС Astra Linux Special Edition, релиз "Смоленск" версия 1.3)
ГИС Сервер последний скачанный с сайта.

Получается что функция записывает в память несколько TMCMAPLIST?
Код
long bufferSize = mapGetMapListforUserEx(connection, NULL, 0);

TMCMAPLIST* buffer = (TMCMAPLIST*)malloc(bufferSize);
buffer->Init();

mapGetMapListforUserEx(connection, buffer, (int)bufferSize);

TMCMAPLIST* buffer2 = buffer+1;

В buffer2 уже не корректные данные  
 
Цитата
Евгений написал:
Получается что функция записывает в память несколько TMCMAPLIST?
...
В buffer2 уже не корректные данные
Нет.
Поэтому и данные некорректные.

Буфер, который Вы отдаете на вход, - это один единственный TMCMAPLIST.
Получив его обратно после выполнения mapGetMapListforUserEx, перебираете элементы массива Item от 0 до Count-1
(Item и Count - поля структуры TMCMAPLIST, Item - это TMCMAPLISTITEM , - см. мое предыдущее сообщение).
 
Ага, хорошо, спасибо.

Еще вопрос, что б не создавать тему,
у ПО ГИС Сервер есть возможность поиска по семантике в карте из MAPAPI?
 
Цитата
Евгений написал:
у ПО ГИС Сервер есть возможность поиска по семантике в карте из MAPAPI?
Работа с картой, открытой с ГИС Сервера, в части MAPAPI-функционала ничем не отличается от работы с картой открытой локально с диска.
Отдельные действия могут блокироваться ГИС Сервером, если будет попытка выполнения неразрешенной на уровне политики безопасности операции (например, изменить объект, если на ГИС Сервере карта запрещена для редактирования).
Сами же функции вызываются точно также, как если бы карта была отрыта не с ГИС Сервера.

Отличие при работе с ГИС Сервером заключается лишь в необходимости перед открытием карты выполнить подключение и вход на ГИС Сервер и затем открыть карту штатными средствами, но указав не имя файла, а алиас карты на ГИС Сервере.
А после закрытия карты (всех карт, открытых с ГИС Сервера) - зарыть соединение с ГИС Сервером.
 
Получается что для того что бы найти объект на одной из карт на ГИС Сервере нужно перебрать их все.
Это получается достаточно долго, даже при количестве карт около 300.
А задача такая:
Есть несколько компьютеров в локальной сети, без доступа к интернету, на одном из них будет стоять ГИС Сервер с заранее подготовленными данными. Нужно сделать поиск у клиентов по объектам всех карт и получить список карт на которых есть объекты для последующего их открытия.

Можете посоветовать более оптимальное решение?
 
Цитата
Евгений написал:
Можете посоветовать более оптимальное решение?
Более оптимальное решение может быть только в более оптимальном подходе к решению вопроса.

Вы хотите выполнить поиск по картам, а затем их открыть. Но, чтобы выполнить поиск, уже придется открыть.
Проведу аналогию с базами данных. Чтобы выполнить запрос, к БД необходимо подключиться к серверу и открыть базу данных. СУБД распарсит Ваш запрос, произведет поиск по всем входящим в него таблицам и затем даст ответ.
Так и в отношении карт.
Рассматривайте карту как БД.
Самостоятельно перебирать объекты Вам не требуется. Для поиска есть все необходимые инструменты в ГИС-ядре, которые в любом случае будут более оптимально осуществлять выборку информации, чем реализованный вне ГИС-ядра простой перебор объектов.
На уровне ГИС-ядра (или также на уровне СУБД) - выборка информации - это операция перебора и сравнения, пусть даже оптимизированная и проиндексированная.
Но физику процесса никто не отменял - чудес не бывает: надо открыть и выполнить поиск.

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

Есть специальные решения для этого.
Например, Банк данных цифровых карт и данных ДЗЗ
Пример работы - http://spatialdb.net/geodbse/
Это не совсем "Ваше" решение, так как это Банк данных (хранение, выдача, контроль и т.д.), но специфика, я думаю, ясна.

Все остальное - это доступ к каждой карте, ее открытие и поиск.
Страницы: 1
Читают тему (гостей: 1)



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

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