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

      Данная инструкция является дополнительным материалом к статье по изменению изображения маркера (Работа с картами в Windows Form с использованием GMap.NET. Часть 2.), при использовании компонента по работе с картами от различных производителей - «GMap.Net». Основными отличиями между этим дополнением и основной инструкцией, является установка двух изображений, одно на перемещение, а другое на установленный маркер.
      Для работы вам понадобится тестовый пример из второй части (
Работа с картами в Windows Form с использованием GMap.NET. Часть 2.) обзора данного компонента. Запустите Microsoft Visual Studio и откройте скачанный проект. Перейдите в Обозреватель решений и откройте класс «GMapMarkerImage». Выполните в нем изменения в соответствии с приведенным ниже листингом.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using GMap.NET;
using GMap.NET.WindowsForms;
using System.Drawing;
namespace Gmap_Markers
{
    class GMapMarkerImage : GMapMarker
    {
        private Image image;
        private Image imageM;
        public Image Image
        {
            get
            {
                return image;
            }
            set
            {
                image = value;
                if (image != null)
                {
                    this.Size = 
                        new Size(image.Width,
                            image.Height);
                }
            }
        }      

        public GMapMarkerImage(
            GMap.NET.PointLatLng p,
            Image image, Image imageM)
            : base(p)
        {
            Size = 
                new System.Drawing.Size(
                    image.Width,
                    image.Height);
            Offset =
                new System.Drawing.Point(
                    -Size.Width / 2,
                    -Size.Height / 2);
            this.image = image;
            this.imageM = imageM;
          
        }

        public override void OnRender(Graphics g)
        {
            if (image == null)
            {

                Rectangle rect =
                    new Rectangle(LocalPosition.X,
                                  LocalPosition.Y,
                                  Size.Width,
                                  Size.Height);
                g.DrawImage(imageM, rect);
            }
            else
            {
                Rectangle rect =
                    new Rectangle(LocalPosition.X,
                                  LocalPosition.Y,
                                  Size.Width,
                                  Size.Height);
                g.DrawImage(image, rect);
            }            
        }
    }
}
      Откройте листинг основной формы и замените методы «mapControl_OnMarkerLeave», «mapControl_OnMarkerEnter», «mapControl_MouseClick», «blinkTimer_Tick» и «buttonStopBlink_Click» соответственно приведенным ниже.
//Заменяем изображение при выделении маркера
//если нет действий с маркером.
void mapControl_OnMarkerLeave(GMapMarker item)
{
    if (item is GMapMarkerImage)
    {
        currentMarker = null;
        GMapMarkerImage m = item as GMapMarkerImage;
        m.Image.Dispose();
        m.Image = null;
    }
}

//Устанавливаем для маркера изображение №2
//если маркер выделен клавишей Enter.
void mapControl_OnMarkerEnter(GMapMarker item)
{
    if (item is GMapMarkerImage)
    {
        currentMarker = item as GMapMarkerImage;
        currentMarker.Image = 
            Bitmap.FromFile(
              Application.StartupPath + @"\marker_2.png")
              as Bitmap;
    }
} 

void mapControl_MouseClick(object sender, MouseEventArgs e)
{
    //Выполняем проверку, какая клавиша мыши была нажата,
    //если правая, то выполняем установку маркера.
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
    {
        //Если надо установить только один маркер,
        //то выполняем очистку списка маркеров
        markersOverlay.Markers.Clear();
        PointLatLng point = gMapControl1.FromLocalToLatLng(e.X, e.Y); 

        //Инициализируем новую переменную изображения и
        //загружаем в нее изображение маркера,
        //лежащее возле исполняемого файла.
        
        //Маркер для перемещения или наведения мыши
        Bitmap bitmap =
          Bitmap.FromFile(
            Application.StartupPath + @"\marker_2.png")
            as Bitmap;
        
        //Маркер для простой отметки на карте
        Bitmap bitmapM = 
          Bitmap.FromFile(
            Application.StartupPath + @"\marker_1.png")
            as Bitmap;

        //Инициализируем новый маркер с использованием 
        //созданного нами маркера.
        GMapMarker marker = new GMapMarkerImage(point, bitmap, bitmapM);
        marker.ToolTipMode = MarkerTooltipMode.OnMouseOver;

        //В качестве подсказки к маркеру устанавливаем 
        //координаты где он устанавливается.
        //Данные о местоположении маркера, 
        //вы можете вывести в любой компонент
        //который вам нужен.
        //например:
        //textBo1.Text = point.Lat;
        //textBo2.Text = point.Lng;
        marker.ToolTipText = 
           string.Format("{0},{1}", point.Lat, point.Lng);

        //Добавляем маркер в список маркеров.
        markersOverlay.Markers.Add(marker);
    }
} 

//Отрисовка изображения №2 при наведении
//курсора мыши на маркер.
void blinkTimer_Tick(object sender, EventArgs e)
{
    foreach (GMapMarker m in markersOverlay.Markers)
    {
        if (m is GMapMarkerImage)
        {
            GMapMarkerImage marker = m as GMapMarkerImage;
            if (marker.Image == null)
                //Задаем цвет и ширину линии квадрата,
                //отображаемого вокруг маркера
                //на который наведен курсор.
                marker.Image =
                 Bitmap.FromFile(
                   Application.StartupPath + @"\marker_2.png")
                   as Bitmap;
            else
            {
                //Убираем красный квадрат.
                marker.Image.Dispose();
                marker.Image = null;
            }
        }
    }
    //Перерисовываем карту.
    gMapControl1.Refresh();
}

private void buttonStopBlink_Click(object sender, EventArgs e)
{
    //Останавливаем таймер отображения квадрата.
    blinkTimer.Stop();
    foreach (GMapMarker m in markersOverlay.Markers)
    {
        if (m is GMapMarkerImage)
        {
            GMapMarkerImage marker =
               m as GMapMarkerImage;
            marker.Image.Dispose();
            marker.Image = null;
        }
    }
    //Перерисовываем карту.
    gMapControl1.Refresh();
}
      Данные изменения в коде позволяют вам установить свои изображения маркеров при перемещении, установке нового и постоянного маркера. Ниже представлен пример установленного маркера. Для изменения изображения маркера вам необходимо заменить изображения рядом с исполняемым файлом проекта на любые другие, соблюдая всего два критерия, изображение должно быть в формате «*.png», названо «marker_1» - для постоянного и «marker_2» - для устанавливаемого (перемещаемого) маркера.
Пример перемещаемого или устанавливаемого маркера.

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


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

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

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