Документация-вспомогательные

Возможности панелей компонента карты

Возможности панелей компонента карты

Панель инструментов

Панель инструментов содержит в себе множество кнопок — это инструменты для работы с картой. Ниже приведено описание основных инструментов и возможности каждого из них

1 Инструмент «рука» позволяет производить операции по перемещению карты
 2 Инструмент «уменьшить» уменьшает масштаб отображения карты
 map_3 Инструмент «увеличить» увеличивает масштаб отображения карты
 4 Инструмент «геолинк» открывает файл, связанный с объектом на карте
 5 Инструмент «информация» открывает окно информации по объектам, имеющимся под курсором
 6 Инструмент «выделение» выделяет объект на карте
 7 Инструмент «групповое выделение» выделяет объекты на карте, попавшие в ограничивающий прямоугольник
 8 Инструмент «расстояние» позволяет определить расстояние от выбранной точки А до точки Б
 9 Инструмент «линейка» позволяет посчитать расстояние для вводимого пути
 11 Инструмент «управление слоями» открывает окно управления слоями
 10 Инструмент «печать» позволяет распечатать фрагмент карты, отображаемый в данный момент
 12 Инструмент «Легенда» открывает окно легенды, через которое пользователь может задать стиль отображения и подписей объектов карты

Инструмент «Управление слоями»

Для отображения графической информации на карте используется группировка объектов. Каждая группа объектов представляет собой некоторую структуру-слой. Слои  накладываются друг на друга и отображаются пользователю. Слой имеет позицию. Сделано это для возможности регулировать отображением данных, в случае, если на одном участке пространства располагаются несколько объектов и некоторые из них перекрывают другие. Инструмент «управление слоями» позволяет выставить определенный слой на нужную позицию, а так же просматривать информацию о слое,  изменять атрибуты слоя, удалять слои.

Если от данного функционала вы хотите ограничить пользователей, то можно отключить и убрать инструмент из панели инструментов следующим кодом:

axMapLIb1.options = false;

Ниже приведен внешний вид окна:

comp_1

Рисунок 1

Инструмент «Легенда»

Инструмент предназначен для управления стилем оформления информации на карте, позволяет менять стиль подписи объектов, их цвета закрашивания и заливки, стили закрашивания предопределенными шаблонами, менять типы линий для объектов линий, изменять их размеры.

comp_2

Рисунок 2

Панель карты

Для отображения данных карта тратит некоторое количество вычислительных ресурсов ПК, и  при перемещении по карте или изменении масштаба требуется перерисовать карту, что тоже затрачивает значительные ресурсы ПК. С целью снизить вычислительную нагрузку на ПК, у компонента карты есть два режима  работы (отображения данных): «полная перерисовка» и «перерисовка по требованию».

Полная перерисовка -это режим, который при малейшем изменении  положения карты или масштаба заново перерисовывает карту, то есть использует много вычислительных ресурсов ПК. Это режим fastmode=on. Но такое поведение карты может негативно сказаться на производительности системы в целом.

Для снижения нагрузки  на ПК, рекомендуется использовать режим работы карты «перерисовка по требованию». Это режим fastmode=off. Работает это следующим образом. При перемещении карты новые данные не подгружаются до тех пор, пока не будет прекращена операция перемещения (т.е. пока не отпустите клавишу мыши). После окончания операции перемещения будет осуществлена перерисовка карты, что позволяет снизить нагрузку на ПК.

По умолчанию, карта работает в режиме «полная перерисовка», для её отключения вы можете  воспользоваться следующим кодом:

axMapLIb1.FastMode = false;

Так же есть возможность отобразить информацию об объекте, над которым располагается курсор в виде всплывающей подсказки. Данную функцию модно включить или отключить, как показано в примере:

axMapLIb1.ShowTips = true;

Панель информации

Используя панель информации можно отобразить некоторое сообщение используя свойство «Статус карты»:

axMapLIb1.StatusInfo = “Статус карты”;

Если есть необходимость в панели информации скрыть панель масштаба, то воспользуйтесь следующим свойством:

axMapLIb1.StatusInfo = false;
 

События

События позволяют компоненту карты уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Ниже рассмотрены наиболее важные события.

MouseDownEvent

Происходит при нажатии на клавишу мыши


if (e.button == TxMouseButton.mvMouseRight)
{
    //ваш код
}

ObjectAfterCreate

Происходит после создания объекта в базе данных

int id_new = 0;
try
{
   id_new = Convert.ToInt32(e.obj.fieldValue("id").ToString());
    axMapLIb1.StatusInfo = "Идентификатор объекта получен (id=" + id_new + ")";
}
catch
{
    writeLogFile("Ошибка получения идентификатора объекта!");
   return;
}

Здесь в строку состояния карты записывается идентификатор ранее созданного объекта.

ObjectEdited
Событие, срабатывающее при редактировании информации объекта на слое


if (axMapLIb1.getLayer(e.layer.NAME) != null)
{
    if (axMapLIb1.getLayer(e.layer.NAME).External == true)
    {
       axMapLIb1.getLayer(e.layer.NAME).ExternalFullReload(
            axMapLIb1.getLayer(e.layer.NAME).getBbox());
        axMapLIb1.mapRepaint();
       axMapLIb1.mapUpdate();
       axMapLIb1.StatusInfo = "У Вас недостаточно прав на редактирование таблицы";
    }
}

В примерах выше были рассмотрены наиболее важные события. Полный список приведен в таблице ниже:

Delete Событие, срабатывающее при удалении объекта со слоя
LayerChanged Событие, срабатывающее при изменении параметров слоя (видимость, редактируемость, выделяемость, отображание подписей).
MouseMoveEvent Происходит при перемещении указателя мыши. Событие возвращает координаты и тип курсора
ObjectBeforeCreate Происходит перед созданием объекта в бд
ObjectCreated Происходит при завершении создания нового объекта
OnActivate Событие, срабатывающее при активации окна компонента карты
OnClick Событие, срабатывающее при клике по карте
OnCreate Событие, срабатывающее при создании компонента
OnDblClick Событие, срабатывающее при двойном клике по карте
OnDeactivate Происходит при деактивации окна компонента карты
OnDestroy Событие, срабатывающее при уничтожении компонента
OnKeyPress Событие, срабатывающее при нажатии на любую клавишу
OnPaint Событие, срабатывающее при перерисовке окна компонента
Selected Событие, срабатывающее при выделении объекта на слое.
ToolButtonClick Событие, срабатывающее при нажатии n-ного элемента в панели инструментов (только для добавленных)
Unselected Происходит при снятии выделения с объекта

SRID (Идентификатор пространственных ссылок)

Система идентификации пространственных ссылок определена стандартом Европейской группы Petroleum Survey (EPSG), представляющим собой набор стандартов, разработанных для картографии, геодезии и хранилищ геодезических данных.

Идентификатор SRID соответствует системе пространственных ссылок, основанной на конкретном эллипсоиде, используемом для плоского или сферического сопоставления. Пространственный столбец может содержать объекты с различными идентификаторами SRID. Однако, при выполнении операций над данными, могут использоваться только пространственные экземпляры с одним и тем же индексом пространственной ссылки SRID.

Если идентификаторы SRID двух пространственных экземпляров различаются, в результате применения к этим экземплярам методов работы с типами данных geometry будет возвращено значение NULL.

Стиль подписей объектов слоя

Для подписей объектов можно указать шрифт, цвет, размер, минимальный и максимальный масштаб, при котором будут отображаться подписи, привязку к графическим единицам (то есть будет ли подпись увеличиваться и уменьшаться пропорционально объектам слоя при изменении масштаба), а также некоторые другие параметры. Для указания всех этих параметров, используется специальный объект mvMapLib.mvFontObject:

mvLayer layer = axMapLIb1.getLayer(“Name of layer”); //получение слоя, для которого будем устанавливать стиль подписей
mvFontObject mvfontObject = axMapLIb1.createFontObject(); //создание объекта mvFontObject
mvfontObject.Color = 0xFFFFFFFF; //устанавливаем цвет подписей
mvfontObject.fontname = “MapFontName”; //указываем название семейства шрифтов
mvfontObject.size = 33; //размер шрифта
mvfontObject.strikeout = false; //будет ли текст выводиться зачеркнутым
mvfontObject.italic = true; //делаем шрифт курсивным
mvfontObject.underline = true; //будет ли текст подчеркнутым
mvfontObject.graphicUnits = true; //будет ли привязка к графическим единицам
vfontObject.framecolor =  true;// цвет каймы вокруг текста
vfontObject.framecolor =  true; //цвет каймы вокруг текста
layer.labelBounds = true; //будет ли подпись выводиться в определенном диапазоне масштаба
layer.labelMinScale  = 5000; //минимальный масштаб при котором будет отображаться подпись
layer.labelMaxScale = 200000; //максимальный масштаб при котором будет отображаться подпись
layer.labelParallel =  true; //будет ли подпись выводиться параллельно объекту ( в случае если это линейный объект)
layer.labelOverlap = false; //могут ли подписи перекрываться
layer.labelOffset =  30; //отступ при выводе подписи
layer.SetLabelstyle(mvfontObject); //устанавливаем только что созданный стиль

Методические материалы с описанием последовательности создания плагинов на C#, их исходники в виде полного проекта

Ниже приведены исходные коды всего проекта.

Файл AssemblyInfo.cs


using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Управление общими сведениями о сборке осуществляется с помощью набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, 
// связанные со сборкой.
[assembly: AssemblyTitle("Наш новый плагин")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NewPlugin")]
[assembly: AssemblyCopyright("Copyright ©  2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми 
// для COM-компонентов.  Если требуется обратиться к типу в этой сборке через 
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
[assembly: ComVisible(false)]
// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
[assembly: Guid("2247ac22-69f8-46f4-99af-650eea2187b3")]
// Сведения о версии сборки состоят из следующих четырех значений:
//      Основной номер версии
//      Дополнительный номер версии 
//      Номер построения
//      Редакция
// Можно задать все значения или принять номер построения и номер редакции по умолчанию, 
// используя «*», как показано ниже:
// [assembly: AssemblyVersion(«1.0.*»)]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Файл MainClass.cs


using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using Interfaces;
using System.Xml.Linq;
using System.Reflection;
namespace NewPlugin
{
    public class MainClass : Interfaces.IMainPlugin
    {
        protected internal static IMainApp App;
        protected internal static IWorkClass Work;
        #region Члены IMainPlugin
        string Interfaces.IMainPlugin.Name
        {
            get { return AssemblyClass.GetName(Assembly.GetExecutingAssembly()); }
        }
        string Interfaces.IMainPlugin.GUID
        {
            get { return AssemblyClass.GetGuid(Assembly.GetExecutingAssembly()); }
        }
        public void StartPlugin(XElement XSettings, IMainApp app, IWorkClass work)
        {
            App = app;
            Work = work;
            // Код Плагина
        }
        private Interfaces.Forms.IControlSettings _controlSettings;
        public Interfaces.Forms.IControlSettings SettingsForm
        {
            get
            {
                if (_controlSettings == null)
                    _controlSettings = new UCSettings();
                return _controlSettings;
            }
        }
        #endregion
    }
} 

Файл UCSettings.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
namespace NewPlugin
{
    public partial class UCSettings : UserControl, Interfaces.Forms.IControlSettings
    {
        private XElement _data;
        public UCSettings()
        {
            InitializeComponent();
        }
        private string keyProc;
        public bool LoadSettings(XElement data)
        {
            _data = data;
            var xElement = _data.Element("number");
            if (xElement != null)
                txtNumber.Text = xElement.Value;
            keyProc = MainClass.Work.OpenForm.ProcOpen();
            return true;
        }
        public bool SaveSettings()
        {
            MainClass.Work.OpenForm.ProcClose(keyProc);
            int value;
            if (int.TryParse(txtNumber.Text, out value))
            {
                // если преобразование прошло успешно
                XElement number = _data.Element("number");
                if (number == null)
                {
                    number = new XElement("number");
                    _data.Add(number);
                }
                number.Value = txtNumber.Text;
                return true;
            }
            else
            {
                MessageBox.Show("Ввведите число.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }
    }
} 

Файл UCSettings.Designer.cs


namespace NewPlugin
{
    partial class UCSettings
    {
        /// <summary> 
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary> 
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #region Код, автоматически созданный конструктором компонентов
        /// <summary> 
        /// Обязательный метод для поддержки конструктора - не изменяйте 
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.txtNumber = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // txtNumber
            this.txtNumber.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.txtNumber.Location = new System.Drawing.Point(22, 42);
            this.txtNumber.Name = «txtNumber»;
            this.txtNumber.Size = new System.Drawing.Size(330, 20);
            this.txtNumber.TabIndex = 0;
            // label1
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(19, 13);
            this.label1.Name = «label1»;
            this.label1.Size = new System.Drawing.Size(257, 26);
            this.label1.TabIndex = 1;
            this.label1.Text = «Введите число, \r\nесли введено не число плагин не даст сохранить»;
            // UCSettings
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.label1);
            this.Controls.Add(this.txtNumber);
            this.Name = «UCSettings»;
            this.Size = new System.Drawing.Size(369, 285);
            this.ResumeLayout(false);
            this.PerformLayout();
        }
        #endregion
        private System.Windows.Forms.TextBox txtNumber;
        private System.Windows.Forms.Label label1;
    }
}

Слои

Слои бывают нескольких типов. В основном используются слои, созданные вручную, слои подложки, и слои, загруженные из базы данных. В данном разделе подробно будут рассмотрены варианты работы с каждым из этих типов слоев – создание, изменение, их основные свойства. Здесь и далее в этом разделе используется ActiveX компонент карты, расположенный на форме, объявленный следующим образом:

public AxmvMapLib.AxMapLIb axMapLIb1;

Для того, чтобы увидеть все слои на карте, загруженные на данный момент, непосредственно внутри компонента карты можно нажать клавишу «L» (layers). Откроется панель слева, на которой можно увидеть все слои загруженные на карту, а также выполнить некоторые операции со слоями. Чтобы скрыть панель нужно повторно нажать на клавишу «L».

layer_1

На этой панели напротив каждого слоя представлены 4 его основных свойства – видимость, редактируемость, выбираемость, отображение подписи объектов слоя. Слева от некоторых слоев есть пиктограмма с замком, что означает, что объекты этого слоя нельзя редактировать. В основном это слои подложки.

Создание и использование слоев

Создание и использование слоев

 Создание слоя вручную

Для работы со слоями необходимо использовать библиотеку mvMapLib, добавив в список используемых пространств имен:

using mvMapLib;

Для создания слоя необходимо создать специальный объект mvMapLib.mvStringArray для указания списка атрибутов, которыми будут обладать все объекты слоя (такие как идентификатор, название, описание и т.д.):

mvStringArray attributesArray = new mvStringArray(); //создание объекта mvStringArray
attributesArray.count = 1; //количество атрибутов объекта
attributesArray.setElem(0, "id"); //установка названия атрибута в нулевой позиции
mvLayer layer = axMapLIb1.CreateLayer(«Название слоя», attributesArray);//создание слоя с именем «Название слоя» и списком атрибутов attributesArray 

После создания слоя можно указать, как будут отображаться объекты на карте: как будут отрисовываться края (mvPenObject), как будут заполняться (mvBrushObject), какой шрифт и какой символ из этого шрифта будут использоваться для обозначения объекта на карте: 

 mvPenObject pen = new mvPenObject();
 mvBrushObject brush = new mvBrushObject();
 mvFontObject font = new mvFontObject();
 mvSymbolObject symbol = new mvSymbolObject();
 pen.Color = 0x333333;
 pen.ctype = 2;
 pen.width = 2;
 brush.bgcolor = 0xffff00;
 brush.fgcolor = 0x00ffff;
 brush.style = 0;
 brush.hatch = 2;
 font.Color = 0x00ff00;
 font.fontname = "Map Symbols";
 font.framecolor = 0xff0000;
 font.size = 8;
 symbol.shape = 35;
 layer.uniform = true; //все объекты на карте будут показываться единообразно
 layer.SetUniformStyle(pen, brush, symbol, font); //установить стиль единообразного отображения объектов 

Ссылку на созданный слой можно получить, используя имя слоя следующим образом:

mvLayer layer = axMapLIb1.getLayer("Название слоя"); 

Теперь слой создан, и можно создавать на нем объекты, изменять их координаты, удалять объекты и т.д. Покажем, как можно создать объект на слое. Для начала нужно указать wkt объекта, то есть текстовое определение того, какой тип у объекта, а также координаты объекта. Например:

 String wkt = "POLYGON((386327.172604717 6183258.75528863,386076.005705584 6184428.33104838,388495.228600778 6184530.78991765,391199.501380878 
6183964.91481094,389843.070097997 6181312.55634965,386688.123113193 6181789.60787037,386327.172604717 6183258.75528863))"; 

Здесь указано, что создаваемый объект будет являться полигоном, и в скобках указаны координаты каждого угла полигонального объекта.

Затем необходимо создать объект mvMapLib.mvStringArray для указания атрибутов создаваемого объекта. Например:

mvStringArray objectAttributes = new mvStringArray();
objectAttributes.count = 1; objectAttributes.setElem(0, "1");

Так как при создании слоя мы указали, что у каждого объекта будет один атрибут – «id», соответственно у создаваемого сейчас объекта будет один атрибут – «id», со значение «1». Так как объект создается не где-нибудь, а на конкретном слое, нам нужна ссылка на слой, где мы хотим разместить объект:

mvLayer layer = axMapLIb1.getLayer("Название слоя");

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

mvLayer layer = axMapLIb1.getLayerByNum(1);

Номера слоев назначаются картой в порядке добавления слоев в нее. Создаем объект на слое:

mvVectorObject newObjectInLayer = ll.CreateObject();

При создании нового объекта на слое, мы сразу же получаем ссылку на нее, таким образом, можем установить соответствующие атрибуты и координаты:

newObjectInLayer.setWKT(wkt);
newObjectInLayer.SetAttributes(objectAttributes);

На всякий случай, для того, чтобы созданный объект действительно отобразился на слое, можно обновить визуализацию карты:

axMapLIb1.mapRepaint();

Вот что мы примерно должны увидеть, если все сделали правильно:

layer_2

Здесь новый созданный объект обозначен желтым цветом с черной каймой.

Если слой нам больше не нужен, его можно выгрузить из карты, то есть удалить. Память на него больше затрачиваться не будет:

layer.deleteLayer();

Слои подложки

Слои подложки – слои, которые загружаются из файлов с расширением vmp. Для загрузки этих слоев, необходимо указать путь к файлу, а также имя атрибута идентификатора для объектов слоев.

String  filePath = "C:somemap.vmp";
axMapLIb1.LoadMap(filePath, “id”);

Доступ к слоям подложки осуществляется также, как и к остальным слоям, – через название слоя либо по индексу:

for (int i = 0; i < axMapLIb1.LayersCount; i++)
{
     mvLayer ll =axMapLIb1.getLayerByNum(i);
} 

Объекты

Работа с объектами заключена в классе mvVectorObject. Манипулируя свойствами и методами данного класса вы сможете изменять внешний вид объекта, добавлять и удалять узлы, изменять пространственное положение и многое другое.

Свойства объекта

В первую очередь мы рассмотрим свойства нашего класса, акцентируя внимание на те свойства, которые являются наиболее важными и часто используемыми.
Основной обязанностью объекта на карте, является показывать пользователю свое положение и сообщить какую-то информацию. Понятно, что положение на карте определяется картографическими координатами. А информационную составляющую пользователю можно предоставить с помощью атрибутивной информации и стилей отображение объекта на карте.
Необходимо еще сказать, что объекты привязаны к определенному слою и некоторые свойства зависят от него. Например, если значение свойства mvLayer.uniform имеет значение true, то стиль отображения объектов будет единообразным для всех объектов внутри данного слоя. А вот если значение рано false, то каждый объект может иметь свой собственный стиль. Простой пример создание стиля отображения и присвоение его объекту приведен ниже:

mvSymbolObject symbol = new mvSymbolObject();
 symbol.shape = 0x21;
 mvFontObject font = new mvFontObject();
 font.fontname = "Map Symbols";
 font.size = 15;
 font.Color = 0xFFFFFF;
 font.framecolor = 0x000000;
 cObj.style = workLayer.CreateDotStyle(symbol, font);

Рассмотрим этот пример. В этом примере создается стиль для точечного объекта с помощью вызова метода CreateDotStyle у экземпляра класса mvLayer. Аргументами этого метода является шрифт и символ. После создания стиля этот метод возвращает идентификатор стиля, что является целым числом, именно это число и надо присвоить свойству style объекта.
При работе с классом mvVectorObject необходимо учитывать, что при удалении объекта физически он не удаляется, а всего лишь помечается, что удален, и перестает отображаться на карте. Данную пометку можно получить из свойства deleted.
В таблице ниже приведены все свойства класса mvVectorObject.

Наименование Тип Описание
bbox mvBbox Прямоугольник, в который вписан объект. Образован указанием нижнего левого угла и правого верхнего.
bboxByRef mvBboxObject Прямоугольник, в который вписан объект. Образован указанием нижнего левого угла и правого верхнего.
CenterGlobal mvCenterGlobal Координаты центра объекта в географических координатах.
CenterWindow mvCenterWindow Координаты центра объекта в системе координат текущего зума
deleted bool Признак удаление
layer mvLayer Слой к которому привязан объект
points mvPointArray Коллекция узлов объекта
Selected bool Признак выбора объекта
style Int32 Идентификатор стиля объекта
VectorType mvVecTypes Тип геометрического объекта

В следующем разделе мы рассмотрим методы класса mvVectorObject, с помощью которых происходит основное управление объектом.

Стили

При создании объектов на карте особое внимание занимает стиль его отображения. Так как эта информация может о многом сказать пользователю. В компоненте MapViewer ActiveX имеется два способа создания стиля объекта. В первом случае стиль назначается на весь слой в целом, и все объекты данного слоя выглядят одинаково. При втором варианте каждый объект может иметь свой собственный стиль. Оба этих варианта широко используется для решения необходимых задач.