Archives by date

You are browsing the site archives by date.

Методические материалы с описанием последовательности создания плагинов на 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 имеется два способа создания стиля объекта. В первом случае стиль назначается на весь слой в целом, и все объекты данного слоя выглядят одинаково. При втором варианте каждый объект может иметь свой собственный стиль. Оба этих варианта широко используется для решения необходимых задач.

Методы объекта

Методы объекта

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

  1. Создание пустого объекта, привязанного к определенному слою;
  2. Присвоение координат объекту;
  3. Присвоение атрибутивной информации;
  4. Присвоение идентификатора стиля, если стиль слоя не определен как единообразный;

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

Тип

Примеры

Point POINT (30 10)  ob_1
LineString LINESTRING (30 10, 10 30, 40 40)  ob_2
Polygon POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))  ob_3
POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10), (20 30, 35 35, 30 20, 20 30))  ob_4
MultiPoint MULTIPOINT ((10 40), (40 30), (20 20), (30 10))  ob_5
MULTIPOINT (10 40, 40 30, 20 20, 30 10)
MultiLineString MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10))  ob_6
MultiPolygon MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5)))  ob_7
MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 45 20, 30 5, 10 10, 10 30, 20 35), (30 20, 20 25, 20 15, 30 20)))  ob_8

В формате WKT все очень просто. А значит, мы можем приступить непосредственно к созданию объектов на карте. В листинге, представленном ниже, создается объект в слое с наименованием Киоски:

private void CreateObj()
{
    workLayer = mvMyMap.getLayer("Киоски");
    if (workLayer == null)
        return;
    mvVectorObject cObj = workLayer.CreateObject();        
    string wkt = "POINT(45 73)";
    cObj.setWKT(wkt);
    mvStringArray attrs = new mvStringArray();
    attrs.count = 3;
    attrs.setElem(0, "1");
    attrs.setElem(1, "Бытовая химия");
    attrs.setElem(2, "ул. Восстание д.18");
    cObj.SetAttributes(attrs);
    cObj.style = CreateStyle();
}
private int CreateStyle()
{
    mvSymbolObject symbol = new mvSymbolObject();
    symbol.shape = 0x21;
    mvFontObject font = new mvFontObject();
    font.fontname = "Map Symbols";
    font.size = 15;
    font.Color = 0xFFFFFF;
    font.framecolor = 0x000000;
    return workLayer.CreateDotStyle(symbol, font);
}

В этом примере два метода: CreateObj() и CreateStyle(). В первом происходить создание объекта, как вы наверно заметили, перед созданием стоит проверка на существование слоя. Если со слоем у нас все хорошо, то с помощью метода CreateObject() мы создаем в слое пустой объект, в котором еще нет ни координат, ни атрибутики. Однако у объекта есть метод setWKT(String) в который мы передаем координаты в формате WKT. После выполнения этого метода наш объект уже должен оказаться на том месте карты, на которое указывают координаты.

Следующим этапом при создании объекта, является, заполнение объекта атрибутивной информацией. Для этого необходимо использовать метод SetAttributes(mvStringArray) объекта. Атрибуты предварительно заполняются в mvStringArray. И на последнем этапе создаем и присваиваем стиль новому объекту.

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

mvVectorObject cObj = workLayer.getObject(1);
if (cObj == null)
    return;
mvStringArray attrs = cObj.getAttributes();
string name = attrs.getElem(1);
string address = (string)cObj.fieldValue("address");
MessageBox.Show("Киоск с названием \""+name+"\" находится по адресу: " + address); 

В этом примере получение атрибутивной информации происходит двумя способами. В первом случае информацию о наименовании киоска получаем, используя метод getAttributes(), который возвращает экземпляр класса mvStringArray, а из него по индексу элемента получаем значение атрибута. Во втором случае, информацию об адресе киоска получаем, используя метод fieldValue, у которого  аргументом является наименование нужного нам атрибута.

В таблице ниже приведены все методы класса mvVectorObject.

Наименование Тип Описание
AttributeWindow() void Открытие окна атрибутивной информации
Delete() void Удаление объекта
Duplicate() mvVectorObject Создание копии объекта
fieldValue(string name) object Получение значение атрибута по наименованию
getAttributes() mvStringArray Получение атрибутов
getWKT() string Получение координат объекта в формате WKT
Move(mvCenterGlobal coor) void Перемещение объекта указанием координат
SetAttribute(string FieldName, string fieldValue) bool Установка значения атрибута объекта
SetAttributes(mvStringArray @params) bool Установка значений атрибутов объекта
setWKT(string wkt) bool Задание координат объекта в формате WKT

 

Стиль слоя

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

mvPenObject pen = new mvPenObject();
pen.Color = 0x333333;
pen.ctype = 2;
pen.width = 2;
mvBrushObject brush = new mvBrushObject();
brush.bgcolor = 0xffff00;
brush.fgcolor = 0x00ffff;
brush.style = 0;
brush.hatch = 2;
mvFontObject font = new mvFontObject();
font.Color = 0x00ff00;
font.fontname = "Map Symbols";
font.framecolor = 0xff0000;
font.size = 8;
mvSymbolObject symbol = new mvSymbolObject();
symbol.shape = 35;
workLayer.uniform = true;
workLayer.SetUniformStyle(pen, brush, symbol, font); 

В данном листинге рассматривается пример, в котором слою workLayer присваивается единообразный стиль. Задание стиля происходить с помощью метода SetUniformStyle, и в качестве аргумента этому методу передаются параметры карандаша, кисти и шрифта. Для этого используются классы mvPenObject, mvBrushObject, mvFontObject, mvSymbolObject. В таблице ниже будут перечислены свойства этих классов.

Наименование Тип Описание
mvPenObject
Color uint Цвет линии
Ctype ushort Идентификатор стиля линии
Width Uint Ширина линии
mvBrushObject
Bgcolor uint Цвет фона
Fgcolor uint Цвет кисти
hatch ushort
style ushort Стиль кисти
mvFontObject
angle int Угол на который будут повернуты символы
Color uint Цвет символа
fontname string Наименование шрифта
framecolor uint Цвет каймы символа
graphicUnits bool Признак отображения символа в единицах проекции
italic bool Применение курсива к символу
size int Размер шрифта
strikeout bool Применение зачеркивания
underline bool Применение подчеркивания
weight int Ширина сивола
mvSymbolObject
shape uint Код символа

Однако если даже выполнить метод SetUniformStyle слоя, то стили объектов не поменяются, пока вы не присвоите значение true свойству uniform. Именно это свойство отвечает за то, какой режим оформления будет применяться.

При оформлении слоя можно также воспользоваться такими свойствами, как отображение объектов на определенном масштабе. Реализация данной возможности представлена в листинге ниже:

workLayer.usebounds = true;
workLayer.MinScale = 2000;
workLayer.MaxScale = 15000;

В данном примере объекты слоя будут видны только при масштабе от 2000 до 15000.

Также есть очень похожее по эффекту свойство MinObjectSize. Это свойства устанавливает минимальный размер объекта в пикселях, который будет виден. Если при навигации по карте вы отдалились от объекта, и он стал меньше, чем указано в данном свойстве, то он просто не будет отображаться.

Стиль объекта

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

#region Создание стиля для линейного объекта
mvPenObject pen_line = new mvPenObject();
pen_line.Color = 0x333333;
pen_line.ctype = 2;
pen_line.width = 2;
line_style = workLayer.CreateLineStyle(pen_line);
#endregion
#region Создание стиля для полигонального объекта
mvPenObject pen_polygon = new mvPenObject();
pen_polygon.Color = 0x00FF00;
pen_polygon.ctype = 1;
pen_polygon.width = 2;
mvBrushObject brush = new mvBrushObject();
brush.bgcolor = 0xffff00;
brush.fgcolor = 0x00ffff;
brush.style = 0;
brush.hatch = 2;
polygon_style = workLayer.CreatePolygonStyle(pen_polygon, brush);
#endregion 

В данном примере мы создаем объекты «карандаш» и «кисть» (mvPenObject и mvBrushObject), каждый из этих объектов отвечает за свою часть стиля. Для создания стиля линейного объекта нам необходим только mvPenObject. Его в качестве аргумента и нужно передать методу CreateLineStyle слоя, который в свою очередь, так же как и с точкой, возвращает идентификатор стиля в слое.

При создании стиля для полигонального объекта кроме mvPenObject нужен еще mvBrushObject, которые является кистью. Эти два объекта передаются методу CreatePolygonStyle, который также возвращается идентификатор стиля в слое.

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

В компоненте так же предусмотрен доступ к установке стиля объекта через слой. Иногда это бывает намного удобнее, нежели изменять стиль у каждого объекта. Для таких манипуляций существуют два метода: SetObjectStyle(int style, int ID) и SetObjectsStyle(int style, mvIntArray ids).

Разница между двумя этими методами в том, что первый позволяет установить стиль только для одного объекта, у которого значение атрибута идентификатора равно ID. Второй же метод может изменить стиль для множества объектов, правда перед этим вам необходимо будет сформировать объект класса mvIntArray.

Подключение внешних слоев

В компоненте MapViewer ActiveX есть возможность в качестве источника данных использовать различные хранилища данных. Такими ресурсами могут быть:
• СУБД PostgreSQL;
• СУБД MySQL;
• СУБД SqLite;
• Ресурсы OGR.
В качестве работы с внешним источником данных мы будем рассматривать работу с СУБД PostgreSQL.
Для загрузки слоев из базы данных PostgreSQL сначала необходимо создать специальный объект типа ExternalSource из пространства имен mvMapLib. Посредством этого объекта будет осуществляться соединение с базой и загрузка слоев:

ExternalSource postgres; postgres = 
axMapLib1 .CreateExternalSource(mvExternalSourceTypes.mvPostGIS);

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

int srid = 32639; postgres.prepare(“host =hostname port=portnumber user=
username password=pass dbname=databasename”, srid); postgres.Connect();

Можно проверить, было ли уже установлено соединение, используя следующую функцию:

 if(!postgres.isConnected())
 {
 postgres.Connect();
 }

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

String nameScheme = “sys_scheme”;
 String nameTable = “table”;
 String newLayerName = “Layer name”;
 String tablePkFieldName = “id”;
 String tableGeomFieldName = “geom”;
 String labelFieldName = “labelfield”;
 String imageFieldName = “imagefield”;
 String imageXFieldName = “imagexfield”;
 mvLayer layer = postgres.addLayer(nameSheme + "." +nameTable,
 newLayerName , tablePkFieldName, tableGeomFieldName ,
 labelFieldName, "", "", imageFieldName, imageXFieldName);

При разработке своего проекта необходимо будет учитывать, что во внешние слои загружаются только те данные, которые должны отображаться на карте. Соответственно те данные, которые вышли из области видимости, выгружаются.