mapSurfer — javascript-интерфейс — CometSocket
Сокеты
класс GP.CometSocket
Класс управления сокетом.
var socket = new GP.CometSocket(url)
Методы
Метод | Возвращает | Параметры | Описание |
---|---|---|---|
isOpened() | true или false | — | открыт или нет |
onOpen(callback, ctx) | — | callback — функция ctx — контекст |
при открытии сокета будет выполнена функция callback в контексте ctx |
send(command, data) | — | command — string data — object |
отправить комманду по сокету |
destroy() | — | — | разорвать соединение |
Команды для отправки по сокету
Команда | Отправляемый объект | Параметры | Описание |
---|---|---|---|
GET_REPORT |
|
— | открыт или нет |
Пример использования события
myCommet.on(
"open",
function(data){
console.log(data);
},
cotext
)
// событие
// функция, которая будет выполнена при срабатывании события
// пример использования параметров
// контекст выполнения фнкции
События
Событие | Описание |
---|---|
«open» | открыто соединение |
название отправленной комманды | При отправке команды происходит событие с этой коммандой. |
Примеры использования библиотеки WfsLib
Примером использования библиотеки WfsLib является проект WFSRESTExampleProject. Также для отображения и работы с картой используется mvActiveX. Для его работы необходимо запустить установщик MVActiveX_setup.exe.
После установки mvActiveX необходимо обратить внимание на две библиотеки, на которые ссылается сам проект, — AxmvMapLib, mvMapLib (рисунок 1).
Указанные библиотеки автоматически создаются при подключении ActiveX к проекту. Подключить его можно, предварительно добавив новый элемент управления (рисунки 2-3).
Проект состоит из пяти форм: FormAuth, FormLog, FormShowObject, FormShowObjects и WfsRESTExample и класса MapClass, в котором собраны методы для работы с mvActiveX).
Форма WFSRESTExample
Эта форма является основной при работе с проектом из данного примера.
Для работы проекта примера необходима карта, статично определенная в методе MapFilePath.
/// <summary>
/// путь к файлу карты
/// </summary>
private string MapFilePath { get { return "vmp/map_file.vmp"; } }
Для начала нужно добавить новый REST сервер и пройти авторизацию. Для этого нужно нажать кнопку со значком «Плюс» (рисунок 4).
Откроется окно FormAuth. В соответствующих полях необходимо ввести адрес сервера в виде http://some.site.net/, имя пользователя и пароль (рисунок 5).
После успешной авторизации на сервере адрес сервера с экземпляром класса WfsLib.Model.REST.User в TreeNode.Tag добавится в TreeView.Nodes (рисунок 6).
Затем при двойном клике по имени сервера (по верхнему уровню TreeView) подгрузятся доступные слои, распределенные по группам (рисунок 7).
/// <summary>
/// Двойной клик по серверу
/// </summary>
/// <param name="e"></param>
private void DoubleClickToConnect(TreeNodeMouseClickEventArgs e)
{
//подгрузить данные, если еще не подгружены
if (e.Node.Nodes.Count == 0)
{
var client = e.Node.Tag as Layers;
if (client == null)
throw new Exception("Настройки сервера не определены, обратитесь к разработчику");
//получение слоев
var leyars = client.GetLayers();
var groups =
leyars
//.Where(o1=> o1.Service == "WFS")
.Select(o1 => o1.Group_name).Distinct();
//добавление групп, распределение слоев по группам
foreach (var group in groups)
{
var grNode = e.Node.Nodes.Add(group);
var ls = leyars.Where(o1 => o1.Group_name == group).ToArray();
foreach (var item in ls)
{
grNode.Nodes.Add(item.Name).Tag = item;
}
}
}
}
Если выбрать в списке один из слоев, отметив его галочкой, объекты слоя будут получены с сервера и отображены на карте (Рисунок 8).
При двойном клике по имени слоя будет вызван метод DoubleClickToLayer, и отобразится форма со списком объектов FormShowObjects (рисунок 9).
private void DoubleClickToLayer(TreeNodeMouseClickEventArgs e)
{
//определяю выбранный слой
var layer =
e.Node.Tag as Layer;
if (layer == null) throw new Exception("Тег не является слоем, обратитесь к разработчику");
//ищу родителя, у которого есть данные о соединении
var client = GetClient(e.Node);
//передаю данные о соединении родителя
try
{
var features = client.GetFeature(layer);
var attributes = layer.Attributes;
FormShowObjects objs = new FormShowObjects(features, attributes, layer);
objs.Show();
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
Форма FormShowObjects
Эта форма отображает список полученных объектов через WFS. При двойном клике по имени объекта откроется форма FormShowObject (рисунок 10), в которой можно будет отредактировать данные. Поле геометрии не должно быть пустым.
Удаление объекта из списка:
/// <summary>
/// Удаление выделенного в списке объекта слоя
/// </summary>
private void DeleteObject()
{
try
{
if (dataGridView_objects.CurrentRow == null) return;
//получение экземпляра WfsClient через слой
Layers client = Layer.GetRestClientLayers();
//получение выделенного объекта слоя
var cur = GetCurrentFeature();
//удаление
client.DeleteObject(cur);
//убираю из списка отображения
this.Features.Remove(cur);
//отображение отредактированного списка
dataGridView_objects.DataSource = GetTable(this.Features);
MessageBox.Show("Объект удален "+cur.Id);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Форма FormShowObject
Эта форма редактирует объекты, полученные через Wfs, и позволяет сохранять изменения через интерфейс геосервера.
При нажатии кнопки «Сохранить» вызывается функция button_save_Click.
private void button_save_Click(object sender, EventArgs e)
{
try
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
Layers client = Layer.GetRestClientLayers();
if (this.IsNewObject)
{
CreateFeature();
client.InsertObject(this.Feature);
MessageBox.Show("Объект добавлен");
}
else
{
SaveFeature();
client.UpdateObject(this.Feature);
MessageBox.Show("Объект изменен");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Сохранение данных с интерфейса пользователя в объекте Feature:
private void SaveFeature()
{
foreach (DataRow item in this.ViewTable.Rows)
{
if (this.Layer.GetGeomName() == item[0].ToString()) continue;
this.Feature.Properties[item[0].ToString()] = item[1];
}
this.Feature.Geometry.WellKnownText = textBox1.Text;
}
Создание нового объекта Feature:
private void CreateFeature()
{
this.Feature = new WfsLib.Model.Feature() { Geometry = null, Layer = Layer };
Feature.Properties = new Dictionary();
foreach (DataRow item in ViewTable.Rows)
{
Feature.Properties.Add(item[0].ToString(), item[1]);
}
Feature.Geometry = new WfsLib.Model.Geometry(textBox1.Text,this.Layer.GetGeomName());
Фильтры
Фильтры OGC реализованы в классе Filter, участвуют в таких операциях, как Update (обновление объектов слоя).
Пример использования фильтров OGC:
Filter f = new Filter(Logic.And);
f.Functions.Add(new FunctionBetween("Номер",new FunctionExpression(Function.Literal,"10"),
new FunctionExpression(Function.Literal,"40"));
f.Functions.Add(
new FunctionLogic(
Logic.PropertyIsLike,
new FunctionExpression(Function.PropertyName,"Название улицы"),
new FunctionExpression(Function.Literal,"новая")
)
);
Методы
WFS – это протокол для работы с векторными слоями геосервера.
GetDescribe — метод, который предоставляет данные о структуре объекта слоя (названия и типы атрибутов, имя геометрии, тип объекта).
DescribeFeature GetDescribe(Layer layer);
public List GetFeature(Model.Layer layer,
int maxFeatures = 0,
string featureId = null,
double[] bbox = null,
string srs = null,
string sortBy = null,
string[] propertyName = null)
string[] Layer layer | экземпляр слоя |
GetCapabilities — метод, который возвращает список всех возможностей текущего геосервера данного слоя (список слоев, список поддерживаемых функций и логических операций).
GetCapabilitiesType GetCapabilities(int layserId);
int layserId | идентификатор слоя |
GetFeature — метод, который возвращает список объектов слоя.
public List GetFeature(Model.Layer layer,
int maxFeatures = 0,
string featureId = null,
double[] bbox = null,
string srs = null,
string sortBy = null,
string[] propertyName = null)
string[] propertyName | имена полей в выборке |
Layer layer | экземпляр слоя |
int maxFeatures | количество объектов в выборке |
string featureId | координаты описывающего прямоугольника |
string srs | идентификатор srs, например srs = «4326» |
string sortBy | имя поля для сортировки |
WFS-T — это протокол редактирования объектов слоя геосервера через post-запросы.
Insert — метод для добавления нового объекта.
InsertObject(Feature feature)
Feature feature | объект слоя; feature.Layer не должен быть null |
Update — метод для обновления объекта слоя.
UpdateObject(Feature feature)
Feature feature | объект слоя; feature.Layer не должен быть null |
Delete — метод для удаления объекта.
DeleteObject(Feature feature)
Feature feature | объект слоя; feature.Layer не должен быть null |
Transaction — транзакция; в данном случае это список операций в формате XML/GML.
Имеется класс Transaction, который может содержать от 0 до n элементов транзакции (с операциями обновления, удаления, добавления). Все операции, представленные выше, работают через класс Transaction с одним элементом внутри.
Transaction(Layer layer) | конструктор |
Transaction.Elements.Add(ITransactionElement el) | заполнение транзакции |
Transaction.Execute() | выполнение транзакции |
REST API помимо авторизации также поддерживает несколько методов, расширяющих интерфейс геосервера.
GetLayers — метод для возвращения списка слоев.
List< WfsLib.Model.Layer> GetLayers()
GetLayer — метод для возвращения экземпляра класса Layer.
Model.Layer GetLayer(int id))
GetAttributes — метод для получения атрибутов слоя и их сохранения в свойстве Layer.Attributes.
List GetLayerAttributes(Model.Layer layer)
Схема классов
На рисунках ниже приведены схемы классов Layer, Geometry, REST, LayerAttribute, Transaction, ITransactionElements, Feature, WFSClient:
Что такое token
Token – это ключ сессии, уникальный идентификатор, который передается в каждом запросе REST; имеет тип string.
Авторизация
Авторизация
Для авторизации в системе REST необходимо передать имя пользователя, пароль и адрес сервера REST в конструктор WfsClient:
WFSClient (Uri address, string username, string password, int defaultSrs)
В конструкторе будет вызван метод REST.GetToken(), результат которого будет сохранен в объекте WfsClient:
WFSClient (Uri address, string username, string password, int defaultSrs, string token)
Также можно самостоятельно пройти авторизацию и передать вместе с данными пользователя полученный токен. В этом случае данные пользователя будут нужны для обновления просроченного токена в ходе работы.
Что такое REST
REST – это прослойка между интерфейсом геосервера и программным интерфейсом. Основные задачи REST – это авторизация пользователя, разграничение прав и безопасность. Также REST упрощает работу с некоторыми функциями геосервера и объединяет несколько геосерверов под одним общим интерфейсом.