Методы объекта
Самое важное и главное при работе с объектом – это умение создавать его. Данная операция очень просто, она состоит из следующих этапов:
- Создание пустого объекта, привязанного к определенному слою;
- Присвоение координат объекту;
- Присвоение атрибутивной информации;
- Присвоение идентификатора стиля, если стиль слоя не определен как единообразный;
Необходимо также учитывать, что координаты объекта должны быть переданы в формате WKT. Этот формат очень простой и был разработан для представления объектов векторной геометрии. Ниже в таблице представлены примеры объектов в данном формате.
Тип |
Примеры |
|
Point | POINT (30 10) | |
LineString | LINESTRING (30 10, 10 30, 40 40) | |
Polygon | POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10)) | |
POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10), (20 30, 35 35, 30 20, 20 30)) | ||
MultiPoint | MULTIPOINT ((10 40), (40 30), (20 20), (30 10)) | |
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)) | |
MultiPolygon | MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5))) | |
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))) |
В формате 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);
При разработке своего проекта необходимо будет учитывать, что во внешние слои загружаются только те данные, которые должны отображаться на карте. Соответственно те данные, которые вышли из области видимости, выгружаются.
Стили внешних слоев
В разделе «Стили» будут подробно рассмотрены создание и работа со стилями, но в них не будет затронута работа со стилями во внешних слоях. Основная часть действий сохраняется неизменной, а в случае если слой раскрашивается единообразно, то разницы в работе стилей нет.
Рассмотрим пример создания слоя, при котором необходимо раскрашивать объект в зависимости от значения атрибута в определенной колонке таблицы. В листинге ниже приводится пример создания слоя под названием «Киоски» и в зависимости от значения колонки «electricity» мы будет представлять объекты слоя в разных стилях.
ExternalSource source = mvMyMap.CreateExternalSource(mvExternalSourceTypes.mvPostGIS);
source.prepare("host =localhost port=5432 user=fail password=112233 dbname=kultura", 32639);
source.Connect();
mvLayer workLayer = source.addLayer("data.kiosks", "Киоски", "id", "the_geom", "name", "electricity", "", "", "");
int dot_style = 0;
#region Если electricity = 0
mvSymbolObject symbol = new mvSymbolObject();
symbol.shape = 0x21;
mvFontObject font = new mvFontObject();
font.fontname = "Map Symbols";
font.size = 15;
font.Color = 0xFFFFFF; // Белый цвет точки
font.framecolor = 0x000000;
dot_style = workLayer.CreateDotStyle(symbol, font);
workLayer.SetExtStyle(0, dot_style);
#endregion
#region Если electricity = 1
font = new mvFontObject();
font.fontname = "Map Symbols";
font.size = 15;
font.Color = 0x000000; // Черный цвет точки
font.framecolor = 0xFFFFFF;
dot_style = workLayer.CreateDotStyle(symbol, font);
workLayer.SetExtStyle(1, dot_style);
#endregion
Единственная разница в при создании стиля для таких слов только в том, что при создании объектов непосредственно в коде вам приходилось использовать свойство style объекта. Тут же этого делать не надо, но зато необходимо с помощью метода SetExtStyle слоя произвести сопоставление значение атрибута объекта с идентификатором стиля в слое.
Метод SetExtStyle не единственный метод, работающий со стилями в слоях, подгружаемых из внешних источников. Полный набор всех методов, необходимых для работы, представлены в таблице ниже:
Наименование | Возвращаемый тип | Описание |
GetExtStyle(int dbstyle) | int | Получение идентификатора стиля по связанному значению |
AddExtStyle(int dbstyle, int mvstyle) | void | Установка связи между значением внешнего источника и идентификатора стиля в слое |
ClearExtStyles() | void | Очистка таблицы соответствия |
RemoveExtStyle(int dbstyle) | bool | Удаление соответствия по связанному значению |
SetExtStyle(int dbstyle, int mvstyle) | bool | Переназначить соответствие |
Интерфейс компонента карты
Интерфейс карты представляет собой 3 рабочие области. Основная и первая рабочая область — это панель отображения графической информации. Вторая область — это панель инструментов для работы с областью отображения графической информации. Третья рабочая область — это панель статуса, отображающая текущее состояние компонента и его некоторые характеристики.
Панель отображения графической информации (карта)
На этой панели концентрируется вся информация, представленная в графическом исполнении. Большая часть операций с данными производится именно через эту рабочую область. Предназначение этой области — создание и отображение цифровой модели местности. Она позволяет перемещаться и изменять масштаб отображения местности, а так же добавлять, изменять или удалять объекты на карте. Внешний вид карты приведен на рисунке 1.
Панель управления (панель инструментов)
Панель управления представляет собой элемент графического интерфейса пользователя, предназначенный для размещения на нем набора инструментов для часто используемых функций и операций над картой. Панель управления размещена горизонтально над панелью карты. Внешний вид панели инструментов приведен на рисунке 2.
Панель информации
Панель располагается под панелью карты. Служит пользователю источником информации наиболее востребованных характеристик карты, таких как масштаб, текущий статус карты, названия выделенного объекта и т.д. Внешний вид панели приведен на рисунке 3.
Растровые слои
Растровым слоем называется слой, основу которого составляет некоторое изображение, например файл bmp, tif и т.д. Однако эти файлы должны обладать геопривязкой. Так же как и обычные слои, они имеют проекцию. И для корректной работы проекция карты и слоя должны быть одинаковыми.
Установка MapViewer ActiveX
Процедура установки компонента MapViewer ActiveX на рабочий компьютер довольно проста. Необходимо лишь запустить программу-установщик под правами администратора. Процесс состоит из шести диалоговых окон, эти окна представлены ниже.
На рисунке 1 представлено стартовое окно установки компонента. Оно содержит основную информацию о нем. Для продолжения установки необходимо нажать кнопку «Далее >».
В следующем окне (рисунок 2) необходимо указать место установки MapViewer ActiveX. По умолчанию в установщике уже выбрано расположение в папке «Program Files».
После нажатия на кнопку «Далее >» откроется окно «Выбора дополнительных задач» (рисунок 3). В этом окне поставить галочку «Добавить переменную окружения» и нажать на кнопку «Далее >». Если компонент устанавливается впервые на данный компьютер, то по умолчанию эта галочка будет включена.
После всех этих действий появится окно, содержащее сводную информацию об установке (рисунок 4). Нажав на кнопку «Установить», вы запустите сам процесс установки (рисунок 5).
По завершении процесса установки отобразится соответствующее сообщение.
На каждом этапе имеется возможность прерывания процесса установки компонента.
Свойства и методы слоя
Объекты типа 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;
В итоге мы должны получить нечто вроде этого:
Свойства и методы растровых слоев
Свойства и методы растровых слоев
Рассмотрим свойства и методы, специфичные для растровых слоев. Остальные свойства и методы описаны в разделе «Слои».
Свойство FileName – только для чтения. Строка, указывающая путь к файлу, где находится само изображение.
Чтобы удалить растровый слой и освободить занимаемую для него память, необходимо воспользоваться методом DeleteImageLayer() карты:
mvMapLib.mvImageLayer imLayer = axMapLIb1.getImageLayer("C:\\Image.bmp");
axMapLIb1.deleteImageLayer(imLayer);
axMapLIb1.mapRepaint();
Чтобы узнать количество загруженных на карту растровых слоев, можно использовать свойство для чтения ImageLayerCount карты:
int imageLayersCount = axMapLIb1.ImageLayerCount;
Также доступ к растровым слоям можно получить по индексу:
for (int i = 0; i < axMapLIb1.ImageLayerCount; i++)
{
mvMapLib.mvImageLayer imLayer = axMapLIb1.getImageLayerByNum(i);
}
Растровые слои всегда отображаются под всеми остальными типами слоев. Методы MoveDown() и MoveUp() растровых слоев перемещают их только относительно друг друга. Можно сделать так, чтобы один растровый слой отображался поверх другого растрового слоя. Но сделать так, чтобы, например, растровый слой оказался поверх слоя подложки, невозможно.
При использовании методов MoveDown() и MoveUp() растровых слоев, также меняется их порядковый номер, по которому можно получить доступ к растровым слоям, при использовании метода mvLayer.getImageLayerByNum(int).
Чтобы сделать растровый слой прозрачным, можно установить его цвет фона следующим образом:
mvMapLib.mvImageLayer imLayer = axMapLIb1.getImageLayer("C:\\Image.bmp");
imLayer.bgcolor = 0xFFFFFF;
Свойства и методы внешних растровых слоев
Доступ к внешнему растровому слою осуществляется также, как к обычному растровому слою, – через имя файла:
mvMapLib.mvExternalImageLayer extImLayer = axMapLIb1.GetExternalImageLayer("E:\\map_wmsc_roscos.xml");
Так как внешний растровый слой является для карты обычным растровым слоем, к нему можно также обращаться следующим образом:
mvMapLib.mvImageLayer extImLayer =
axMapLIb1.getImageLayer("E:\\map_wmsc_roscos.xml");
Либо по номеру:
mvMapLib.mvImageLayer extImLayer = axMapLIb1.getImageLayerByNum(i);
Внешние растровые слои помещаются в одну коллекцию с другими растровыми слоями, таким образом, к ним можно также обращаться по индексу, и перемещать вверх и вниз относительно других растровых слоев используя методы mvImageLayer.MoveDown() и mvImageLayer.MoveUp().
Для удаления слоя и освобождения памяти, можно использовать метод mvExternalImageLayer.Delete(). Кэш при этом не будет очищен.
mvMapLib.mvExternalImageLayer extImLayer =
axMapLIb1.GetExternalImageLayer("E:\\map_wmsc_roscos.xml");
extImLayer.Delete();
Свойство mvExternalImageLayer.IsConnected – указывает, есть ли на данный момент соединение с сервером.
У слоя mvExternalImageLayer есть метод getBbox(), который возвращает структуру mvMapLib.mvBbox, содержащий два поля – a и b типа mvMapLib.mvCenterGlobal. Тип mvMapLib.mvCenterGlobal является структурой, содержащей координаты x и y типа float. Таким образом, поле a – координаты нижнего левого угла, а поле b – координаты правого верхнего угла прямоугольника, который виден на данный момент на карте.
Также есть метод getBboxByRef, который во многом похож на метод getBbox(), но имеет несколько дополнительных возможностей. Метод возвращает объект типа интерфейса mvMapLib.mvBboxObject. Этот объект содержит свойства a и b, типа mvMapLib.mvPointObject, который предоставляет координаты x и y левого нижнего и правого верхнего углов того же прямоугольника, но более высокой точности – double. К тому же, тип mvMapLib.mvPointObject предоставляет несколько методов для работы с координатами.
Доступ к серверам с растровыми изображениями осуществляется указанием файла в формате WMS (Web Map Services). Это специальный xml файл, где описаны параметры подключения, а также другая дополнительная информация, которая необходима для загрузки растрового слоя из сервера. Необходимая информация о том, как составляется такой файл, описана здесь: http://www.gdal.org/frmt_wms.html.