Домой C# Работа с картами в Windows Form с использованием GMap.NET. Часть 5.: Справочник...

Работа с картами в Windows Form с использованием GMap.NET. Часть 5.: Справочник по C#

1039
0


      Данная инструкция является продолжением обзора компонента по работе с картами — «GMap.NET». По завершению работы с данной инструкцией в вашем проекте будет реализован функционал загрузки карты по определенным координатам, а так же замена стандартного маркера, который предоставляет компонент, на любое другое из списка. Данный список маркеров будет формироваться путем сканирования директории «Markers», расположенной возле исполняемого файла проекта. В данной директории расположены папки содержащие маркеры различных типов. Имена данных директорий, будут загружены в элемент управления «ComboBox» и использоваться в качестве категорий (а также адресом директории) для загрузки изображений маркеров, в элемент управления «ListView» в формате «*.png».
      Для данной инструкции будет использован пример из четвертой части (Работа с картами в Windows Form с использованием GMap.NET. Часть 4) обзора данного компонента. Вы можете воспользоваться как тестовым примером или полностью выполнить инструкцию самостоятельно и плавно перейти к выполнению этой. Если вы воспользовались исходником из четвертой части обзора компонента «GMap.NET», то метод загрузки главной формы «Form1_Load» будет содержать код установки маркера с определенным изображением, по координатам Красной площади в Москве, удалите данный код. У вас останется только часть инициализации карты по заданным координатам и класс для замены стандартного маркера на изображение из определенной директории. Добавьте на форму два элемента управления:

  • ComboBox – Элемент управления для вывода имен директорий содержащих изображения маркеров;
  • ListView – Элемент управления для вывода изображений маркеров, по выбранной категории.

У вас получится приведенный ниже пример.

      Добавьте в начало метода загрузки главной формы «Form1_Load», приведенный ниже код, реализующий сканирование папки «Markers» с получением имен папок расположенных в ней и занесением их в элемент управления «ComboBox», а так же выбором первого элемента из списка.

//Включаем визуальные стили для приложения.
Application.EnableVisualStyles();

//Получаем список директорий в папке Markers
//расположенной возле исполняемого файла проекта
//и заносим их заголовки в элемент управления
//comboBox1.
System.IO.DirectoryInfo dirM =
new System.IO.DirectoryInfo(Application.StartupPath + @"Markers");
foreach (var item in dirM.GetDirectories())
{
//Добавление имени Директории с маркерами
comboBox1.Items.Add(item.Name);
}
//Выбираем первый каталог.
comboBox1.SelectedIndex = 0;

//Указываем, что каждый элемент отображается в виде
//полноразмерного значка с расположенной
//под ним меткой.
this.listView1.View = View.LargeIcon;

      Так же добавьте в конец данного метода, приведенный ниже код, устанавливающий в элементе управления «gMapControl1», на событие «MouseClick», срабатывающее при клике любой клавишей мыши, событие «map_MouseClick».

//Устанавливаем свой метод на
//событие клика мышки.
gMapControl1.MouseClick += new MouseEventHandler(map_MouseClick);

      Добавьте после данного метода приведенный ниже код события «map_MouseClick». Данный метод инициализирует новый список маркеров, выполняет проверку, была ли нажата правая клавиша мыши и в случае если данная проверка выполнена успешно, в переменные «lat» и «lng», заносятся координаты, где был выполнен клик правой клавишей мыши. Далее выполняется замена стандартного маркера элемента управления «gMapControl1», на изображение, выбранное в элементе управления «ListView» и установки координат в качестве подсказки.

//Список маркеров.
GMap.NET.WindowsForms.GMapOverlay overlayOne;

private void map_MouseClick(object sender, MouseEventArgs e)
{
//Инициализируем новый список маркеров.
overlayOne =
new GMap.NET.WindowsForms.GMapOverlay(gMapControl1, "OverlayOne");

//Очищаем список маркеров.
overlayOne.Markers.Clear();

//Переменные для хранения
//координат устанавливаемого маркера.
double lat = 0.0;
double lng = 0.0;

//Проверяем, что нажата правая клавиша мыши.
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
//Получаем координаты, где устанавливается новый маркер.
lat = gMapControl1.FromLocalToLatLng(e.X, e.Y).Lat;
lng = gMapControl1.FromLocalToLatLng(e.X, e.Y).Lng;

try
{
//Получаем изображение выбранного маркера из списка.
Image bitmap =
Image.FromFile(
PathImage[listView1.SelectedIndices[0]].ToString());

//Создаем новый маркер с изображением.
GMapMarkerImage marker =
new GMapMarkerImage(new GMap.NET.PointLatLng(lat, lng), bitmap);

//Создаем подсказку.
marker.ToolTip =
new GMap.NET.WindowsForms.ToolTips.GMapRoundedToolTip(marker);

//Указываем в качестве текста подсказки,
//координаты где установлен маркер.
marker.ToolTipText = lat.ToString() + ";"+
//Делаем перевод строки.
Environment.NewLine +
lng.ToString() + ";";

//Добавляем новый маркер, в список маркеров.
overlayOne.Markers.Add(marker);

//Указываем элементу управления
//gMapControl1, список маркеров.
gMapControl1.Overlays.Add(overlayOne);
}
catch
{
//Если изображение маркера не выбрано, то выводим сообщение
//об ошибке.
MessageBox.Show(
"Пожалуйста выберете маркер из предложенного списка!",
"www.CSharpCoderR.com & Gmap.NET",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}
}

      Перейдите в Конструктор главной формы вашего проекта и сделайте клик правой клавишей мыши по элементу управления «comboBox1». В открывшемся контекстном меню, выберите пункт «Свойства».

      В открывшемся окне свойств данного элемента управления, перейдите во вкладку «События» (значок молнии в верхней части) и найдите событие «SelectedIndexChanged». Данное событие срабатывает каждый раз при выборе нового элемента из списка.

      Сделайте по нему двойной клик левой клавишей мыши. Вы перейдете в автоматически созданный метод «comboBox1_SelectedIndexChanged». Добавьте приведенный ниже код в тело данного метода.

//Очищаем список изображений маркеров.
listView1.Items.Clear();
//Передаем в метод Images, индекс выбранной директории
//с изображениями маркеров.
Images(comboBox1.SelectedIndex);
//
this.listView1.LargeImageList = this.ImageList1;
//Задаем фокус ввода элементу управления.
this.listView1.Focus();
//Задаем значение, указывающее,
//что выбран первый элемент.
this.listView1.Items[0].Selected = true;

      А так же добавьте приведенный ниже код в класс «public partial class Form1 : Form», главной формы. Данный код реализует загрузку изображений маркеров в элемент управления «ListView», по индексу выбранной категории в элементе управления «comboBox1».

//переменная для изображений маркеров.
public ImageList ImageList1;

//Список для хранения пути к изображению.
public List PathImage;

//Класс для загрузки изображений
//из выбранного каталога.
public void Images(int IndexCategory)
{
//Инициализируем новый список
//изображений маркеров.
ImageList1 = new ImageList();

//Задаем белый цвет, обрабатываемый как прозрачный.
ImageList1.TransparentColor = Color.White;

//Задаем глубину цвета для изображений в списке.
ImageList1.ColorDepth = ColorDepth.Depth32Bit;

//Задаем размер изображений в списке изображений.
ImageList1.ImageSize = new Size(32, 32);

//Инициализируем новый список
//путей к изображениям маркеров.
PathImage = new List();

//Инициализируем новую переменную
//для работы с выбранным каталогом изображений
//маркеров.
System.IO.DirectoryInfo dirK =
new System.IO.DirectoryInfo(
Application.StartupPath +
@"Markers" +
comboBox1.Items[IndexCategory].ToString());

//Счетчик добавленных
//изображений.
int indexImage = 0;

//Цикл добавления изображений маркеров в список, из
//выбранной директории.
foreach (var item in dirK.GetFiles())
{
//Заносим в переменную путь к файлу.
object path = Application.StartupPath +
@"Markers" +
comboBox1.Items[IndexCategory].ToString()
+ "\" + item.Name;

//Добавляем новое изображение маркера.
ImageList1.Images.Add(Image.FromFile(path.ToString()));

//Не работает, по неизвестным причинам.
//ImageList1.Images[indexImage].Tag = @path;

//Добавляем новый путь к изображению маркера,
//в список.
PathImage.Add(path.ToString());

//Увеличиваем счетчик изображений.
indexImage++;
}

//Цикл создания элементов в элементе управления
//listView1.
for (int j = 0; j < ImageList1.Images.Count; j++)
{
ListViewItem item = new ListViewItem();
item.ImageIndex = j;
listView1.Items.Add(item);
}

//Задаем список ImageList1, используемый
//при отображении элементов в элементе
//управления в виде крупных значков.
listView1.LargeImageList = ImageList1;

//Задаем список ImageList1, используемый
//при отображении элементов в элементе
//управления в виде маленьких значков.
listView1.SmallImageList = ImageList1;
}

      Перейдите в директорию, в которой расположен ваш исполняемый файл, в Microsoft Visual Studio это папка «Debug». Создайте в данной директории, папку «Markers». А в ней несколько папок с изображениями маркеров в формате «*.png», которые будут загружаться в элемент управления «ListView».

      Запустите ваш проект, нажав на клавиатуре клавишу «F5», если вы все выполнили по инструкции, то у вас после запуска главной формы, в элементе управления «comboBox1» появится список имен директорий, расположенных в папке «Markers». По умолчанию, автоматически будет выбран первый элемент из списка и если в директории есть изображения маркеров, они будут загружены в элемент управления «ListView». Выберете любое изображение маркера и сделайте в любом месте на карте, клик правой клавишей мыши. У вас должен появиться маркер с выбранным изображением и координатами где установлен маркер, в качестве подсказки. Ниже представлен пример работы программы с различными изображениями для маркера, из разных директорий.

Ссылка для скачивания примера: Яндекс.Диск

Работа с картами в Windows Form с использованием GMap.NET. Часть 5.: Справочник по C#

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Использование веб-службы для определения страны происхождения IP-адреса.: Справочник по C#

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь