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

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

Для работы со слоями необходимо использовать библиотеку 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);
}