Данная инструкция является продолжением обзора компонента по работе с картами - «GMap.NET». По завершению работы с данной инструкцией в вашем проекте будет реализован функционал загрузки карты по определенным координатам, а так же замена стандартного маркера, который предоставляет компонент, на любое другое из списка. Данный список маркеров будет формироваться путем сканирования директории «Markers», расположенной возле исполняемого файла проекта. В данной директории расположены папки содержащие маркеры различных типов. Имена данных директорий, будут загружены в элемент управления «ComboBox» и использоваться в качестве категорий (а также адресом директории) для загрузки изображений маркеров, в элемент управления «ListView» в формате «*.png».
Для данной инструкции будет использован пример из четвертой части (Работа с картами в Windows Form с использованием GMap.NET. Часть 4) обзора данного компонента. Вы можете воспользоваться как тестовым примером или полностью выполнить инструкцию самостоятельно и плавно перейти к выполнению этой. Если вы воспользовались исходником из четвертой части обзора компонента «GMap.NET», то метод загрузки главной формы «Form1_Load» будет содержать код установки маркера с определенным изображением, по координатам Красной площади в Москве, удалите данный код. У вас останется только часть инициализации карты по заданным координатам и класс для замены стандартного маркера на изображение из определенной директории. Добавьте на форму два элемента управления:
Добавьте в начало метода загрузки главной формы «Form1_Load», приведенный ниже код, реализующий сканирование папки «Markers» с получением имен папок расположенных в ней и занесением их в элемент управления «ComboBox», а так же выбором первого элемента из списка.
В открывшемся окне свойств данного элемента управления, перейдите во вкладку «События» (значок молнии в верхней части) и найдите событие «SelectedIndexChanged». Данное событие срабатывает каждый раз при выборе нового элемента из списка.
Сделайте по нему двойной клик левой клавишей мыши. Вы перейдете в автоматически созданный метод «comboBox1_SelectedIndexChanged». Добавьте приведенный ниже код в тело данного метода.
Запустите ваш проект, нажав на клавиатуре клавишу «F5», если вы все выполнили по инструкции, то у вас после запуска главной формы, в элементе управления «comboBox1» появится список имен директорий, расположенных в папке «Markers». По умолчанию, автоматически будет выбран первый элемент из списка и если в директории есть изображения маркеров, они будут загружены в элемент управления «ListView». Выберете любое изображение маркера и сделайте в любом месте на карте, клик правой клавишей мыши. У вас должен появиться маркер с выбранным изображением и координатами где установлен маркер, в качестве подсказки. Ниже представлен пример работы программы с различными изображениями для маркера, из разных директорий.
Для данной инструкции будет использован пример из четвертой части (Работа с картами в 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Перейдите в директорию, в которой расположен ваш исполняемый файл, в Microsoft Visual Studio это папка «Debug». Создайте в данной директории, папку «Markers». А в ней несколько папок с изображениями маркеров в формате «*.png», которые будут загружаться в элемент управления «ListView».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; }
Запустите ваш проект, нажав на клавиатуре клавишу «F5», если вы все выполнили по инструкции, то у вас после запуска главной формы, в элементе управления «comboBox1» появится список имен директорий, расположенных в папке «Markers». По умолчанию, автоматически будет выбран первый элемент из списка и если в директории есть изображения маркеров, они будут загружены в элемент управления «ListView». Выберете любое изображение маркера и сделайте в любом месте на карте, клик правой клавишей мыши. У вас должен появиться маркер с выбранным изображением и координатами где установлен маркер, в качестве подсказки. Ниже представлен пример работы программы с различными изображениями для маркера, из разных директорий.
Ссылка для скачивания примера: Яндекс.Диск
Комментариев нет:
Отправить комментарий
Большая просьба, не писать в комментариях всякую ерунду не по теме!