Свойства и методы слоя

Объекты типа mvLayer имеют следующие основные свойства:

Название Тип Описание
Name

String

Получает или задает название слоя
Usebounds

Boolean

Указывает на необходимость включения видимости слоя исключительно в заданном диапазоне увеличения
Visible

Boolean

Получает или задает свойство видимости слоя на карте
Editable

Boolean

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

Boolean

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

Boolean

Получает или задает свойство указывающее на необходимость показывать надписи объектов
SelectedCount

Int32

Получает количество выделенных объектов слоя
MinScale

UInt32

Получает или задает минимальный масштаб, при котором виден слой
MaxScale

UInt32

Получает или задает максимальный масштаб, при котором виден слой
ObjectsCount

Int32

Получает количество объектов на слое
FieldsCount

Int32

Получает количество атрибутов объектов слоя
LabelOffset

Int32

Получает или задает отступ подписи
LabelMinScale

UInt32

Получает или задает минимальный масштаб при котором видна подпись слоя
LabelMaxScale

UInt32

Получает или задает максимальный масштаб при котором видна подпись слоя
LabelField

Int32

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

String

Получает или задает выражение, которое будет использоваться для отображения подписей
GeoLinkField

Int32

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

Int32

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

Int32

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

Также слои имеют следующие методы:

Название Возвращает Описание
GetVisible()

mvIntArray

Возвращает массив ID всех видимых объектов на слое
GetSelected()

mvIntArray

Возвращает массив ID всех выделенных объектов на слое
MoveTo(Int32 id,  Boolean select)

Boolean

Переходит к объекту ID которого передается функции. Если параметр select установлен в true, объект также выделяется.
SelectAll()

void

Выделяет все объекты слоя
SelectArray(mvIntArray ids)

Boolean

Выделяет объекты, ID которых указаны в массиве
SelectId(Int32 id)

Boolean

Выделяет объект, ID которой указан в параметре
MoveUp()

Boolean

Переместить слой вверх
MoveDown()

Boolean

Переместить слой вниз


 
Использование свойств и методов слоя

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

В дальнейшем доступ  к слою можно будет получить по его новому названию. Использование границ видимости при масштабировании:

layer.usebounds = true;
layer.MinScale = 1000;
layer.MaxScale = 500000;

Теперь слой будет видимым, если только масштаб карты находится  в пределах от 1000 до 500000. Чтобы включить или выключить видимость загруженного на карту слоя:

layer.Visible = true;

При этом, если установить это свойство в false, слой не будет отображаться, однако останется загруженным на карту. Для того чтобы можно было выбирать объекты на карте, нужно использовать свойство Selectable, и установить его в true:

layer.Selectable = true;

Доступ к выделенным объектам можно получить через метод mvLayer.GetSelected(). Для того, чтобы выбранный объект можно было также редактировать, используется свойство Editable, установленный в true:

layer.Editable = true;

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

mvLayer.MoveDown()
mvLayer.MoveUp()

Для того, чтобы определить, какой слой на какой позиции находится, можно использовать примерно такой код (рассматриваются два слоя с названиями «Слой №1» и «Слой №2»):

int? position1 = null;
int? position2 = null;
for (int i = 0; i < axMapLIb1.LayersCount; i++)
{
    if (axMapLIb1.getLayerByNum(i).NAME == "Слой №1")
    {
        position1 = i; 
    }
    else if (axMapLIb1.getLayerByNum(i).NAME == "Слой №2")
    {
        position2 = i; 
    }
}

Теперь в переменных position1 и position2 мы имеем порядковые номера первого и второго слоя соответственно.

Геолинк

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

mvStringArray attributesList = new mvStringArray();
attributesList.count = 2;
attributesList.setElem(0, "id");
attributesList.setElem(1, "filepath");
mvLayer layer = axMapLIb1.CreateLayer("Слой с геолинком", attributesList);
layer.GeoLinkField = 1;

Мы создали слой, у которого будут два атрибута – “id”, “filepath”. Мы указали, что второй атрибут – “filepath”  будет являться геолинком. Теперь создадим объект слоя:

String wkt = "POINT(386327.172604717 6183258.75528863)"; 
mvStringArray objectAttributes = new mvStringArray();
objectAttributes.count = 2;
objectAttributes.setElem(0, "1");
objectAttributes.setElem(1, "E:\\somefile.txt"); 
mvVectorObject newObjectInLayer = layer.CreateObject();
newObjectInLayer.setWKT(wkt);
newObjectInLayer.SetAttributes(objectAttributes);
axMapLIb1.mapRepaint(); 

Мы создали объект, поле геолинка которого ссылается на файл по пути “E:\\somefile.txt”. Теперь мы программно сможем в любой момент получить доступ к связанному с объектом файлу. Также можно открыть файл связанный с объектом, используя специальный курсор:

axMapLIb1.CtlCursor = mvMapLib.Cursors.mlGeoLink;

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

 Подключение картинок как значков

Если нужно для указания точечных объектов слоя использовать некоторую картинку, можно использовать свойство слоя “ImageField”, который указывает атрибут, где будет храниться ссылка на рисунок. Однако, в отличие от геолинка, здесь хранится только название рисунка. Все рисунки должны находится в папке “images”, которая должна находится в одной директории с исполняемой программой. Также можно указать атрибут, который содержит угол поворота изображения. Пример:

mvStringArray attributesList = new mvStringArray();
attributesList.count = 3;
attributesList.setElem(0, "id");
attributesList.setElem(1, "image");
attributesList.setElem(2, "imagerotate");
mvLayer layer = axMapLIb1.CreateLayer("Слой с рисунком", attributesList);
layer.imageField = 1;
layer.imageRotateField = 2; 

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

String wkt = "POINT(386327.172604717 6183258.75528863)"; 
mvStringArray objectAttributes = new mvStringArray();
objectAttributes.count = 3;
objectAttributes.setElem(0, "1");
objectAttributes.setElem(1, "building.gif");
objectAttributes.setElem(2, "90"); 
mvVectorObject newObjectInLayer = layer.CreateObject();
newObjectInLayer.setWKT(wkt);
newObjectInLayer.SetAttributes(objectAttributes);
axMapLIb1.mapRepaint(); 

В итоге у нас должно получиться что-то вроде этого:

sv_1

Рисунок 1

Как видно из рисунка, для отображения точечного объекта, используется рисунок, который указан в атрибуте объекта “image”, к которому также применен поворот в 90 градусов, указанный в атрибуте “imagerotate”.

 Подписи

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

mvStringArray attributesList = new mvStringArray();
attributesList.count = 2;
attributesList.setElem(0, "id");
attributesList.setElem(1, "label");
mvLayer layer = axMapLIb1.CreateLayer("Слой с подписями", attributesList);
layer.showlabels = true; 
layer.LabelField = 1;  

Теперь создадим объект с подписью:

String wkt = "POINT(386327.172604717 6183258.75528863)"; 
mvStringArray objectAttributes = new mvStringArray();
objectAttributes.count = 2;
objectAttributes.setElem(0, "1");
objectAttributes.setElem(1, "Подпись этого объекта");
mvVectorObject newObjectInLayer = layer.CreateObject();
newObjectInLayer.setWKT(wkt);
newObjectInLayer.SetAttributes(objectAttributes);
axMapLIb1.mapRepaint(); 

Теперь объект будет отображаться с подписью:

sv_2

Рисунок 2

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

layer.labelexpression = "\"Id объекта: \" + id + \". Комментарий: \" + label";

При этом надо установить свойство LabelField в 1001, и showlabels в true:

layer.showlabels = true;
layer.LabelField = 1001;

В итоге мы должны получить нечто вроде этого:

sv_3

Рисунок 3

 

Comments are closed, but trackbacks and pingbacks are open.