Примеры использования библиотеки WfsLib

Примером использования библиотеки WfsLib является проект WFSRESTExampleProject. Также для отображения и работы с картой используется mvActiveX. Для его работы необходимо запустить установщик MVActiveX_setup.exe.
После установки mvActiveX необходимо обратить внимание на две библиотеки, на которые ссылается сам проект, — AxmvMapLib, mvMapLib (рисунок 1).

wfs_1

Рисунок 1

Указанные библиотеки автоматически создаются при подключении ActiveX к проекту. Подключить его можно, предварительно добавив новый элемент управления (рисунки 2-3).

wfs_2

Рисунок 2

wfs_3

Рисунок 3

Проект состоит из пяти форм: FormAuth, FormLog, FormShowObject, FormShowObjects и WfsRESTExample и класса MapClass, в котором собраны методы для работы с mvActiveX).

Форма  WFSRESTExample

Эта форма является основной при работе с проектом из данного примера.

Для работы проекта примера необходима карта, статично определенная в методе MapFilePath.

/// <summary>
/// путь к файлу карты
/// </summary>
private string MapFilePath { get { return "vmp/map_file.vmp"; } }

Для начала нужно добавить новый REST сервер и пройти авторизацию. Для этого нужно нажать кнопку со значком «Плюс» (рисунок 4).

wfs_4

Рисунок 4

Откроется окно FormAuth. В соответствующих полях необходимо ввести адрес сервера в виде http://some.site.net/, имя пользователя и пароль (рисунок 5).

wfs_5

Рисунок 5

После успешной авторизации на сервере адрес сервера с экземпляром класса WfsLib.Model.REST.User в TreeNode.Tag добавится в TreeView.Nodes (рисунок 6).

wfs_6

Рисунок 6

Затем при двойном клике по имени сервера (по верхнему уровню TreeView) подгрузятся доступные слои, распределенные по группам (рисунок 7).

wfs_7

Рисунок 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).

wfs_8

Рисунок 8

При двойном клике по имени слоя будет вызван метод DoubleClickToLayer, и отобразится форма со списком объектов FormShowObjects (рисунок 9).

wfs_9

Рисунок 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), в которой можно будет отредактировать данные. Поле геометрии не должно быть пустым.

wfs_10

Рисунок 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());