Объекты типа 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();
В итоге у нас должно получиться что-то вроде этого:
Как видно из рисунка, для отображения точечного объекта, используется рисунок, который указан в атрибуте объекта “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();
Теперь объект будет отображаться с подписью:
Также для указания подписей можно также использовать другой подход. Для всего слоя, можно установить выражение, которое будет определенным образом комбинировать атрибуты объекта, использовать текстовые константы и арифметические выражения, для создания подписей. Например:
layer.labelexpression = "\"Id объекта: \" + id + \". Комментарий: \" + label";
При этом надо установить свойство LabelField в 1001, и showlabels в true:
layer.showlabels = true;
layer.LabelField = 1001;
В итоге мы должны получить нечто вроде этого:
Comments are closed, but trackbacks and pingbacks are open.