9 сент. 2014 г.

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

      Данная инструкция является продолжением обзора компонента по работе с картами - «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». Выберете любое изображение маркера и сделайте в любом месте на карте, клик правой клавишей мыши. У вас должен появиться маркер с выбранным изображением и координатами где установлен маркер, в качестве подсказки. Ниже представлен пример работы программы с различными изображениями для маркера, из разных директорий.

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


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!