Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2020, 12:33   #1
eliasum
Пользователь
 
Регистрация: 12.02.2015
Сообщений: 31
По умолчанию Дублирование маркера при первой попытке переноса маркера на карте компонента gMapControl библиотеки GMap.NET

Здравствуйте!

Создал Win Forms приложение, подключил библиотеку GMap.NET для работы с картами, такой код:
Код:
using GMap.NET.WindowsForms;
using System;
using System.Linq;
using System.Windows.Forms;

namespace Google_Maps_and_Gmap
{
    public partial class FormMain : Form
    {
        //выбранный маркер
        private GMapMarker _selectedMarker;

        public FormMain()
        {
            InitializeComponent();

            this.Load += FormMain_Load;

            //подписка на события мыши
            _gMapControl.MouseUp += _gMapControl_MouseUp;
            _gMapControl.MouseDown += _gMapControl_MouseDown;
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            //Настройки для компонента GMap.
            _gMapControl.Bearing = 0;

            //CanDragMap - Если параметр установлен в True,
            //пользователь может перетаскивать карту 
            ///с помощью правой кнопки мыши. 
            _gMapControl.CanDragMap = true;

            //Указываем что перетаскивание карты осуществляется 
            //с использованием левой клавишей мыши.
            //По умолчанию - правая.
            _gMapControl.DragButton = MouseButtons.Left;

            _gMapControl.GrayScaleMode = true;

            //MarkersEnabled - Если параметр установлен в True,
            //любые маркеры, заданные вручную будет показаны.
            //Если нет, они не появятся.
            _gMapControl.MarkersEnabled = true;

            //Указываем значение максимального приближения.
            _gMapControl.MaxZoom = 18;

            //Указываем значение минимального приближения.
            _gMapControl.MinZoom = 2;

            //Устанавливаем центр приближения/удаления
            //курсор мыши.
            _gMapControl.MouseWheelZoomType =
                GMap.NET.MouseWheelZoomType.MousePositionAndCenter;

            //Отказываемся от негативного режима.
            _gMapControl.NegativeMode = false;

            //Разрешаем полигоны.
            _gMapControl.PolygonsEnabled = true;

            //Разрешаем маршруты.
            _gMapControl.RoutesEnabled = true;

            //Скрываем внешнюю сетку карты
            //с заголовками.
            _gMapControl.ShowTileGridLines = false;

            //Указываем, что при загрузке карты будет использоваться 
            //18ти кратной приближение.
            _gMapControl.Zoom = 18;

            //Указываем, что все края элемента управления
            //закрепляются у краев содержащего его элемента
            //управления(главной формы), а их размеры изменяются 
            //соответствующим образом.
            _gMapControl.Dock = DockStyle.Fill;

            //Указываем, что будем использовать карты Google.
            _gMapControl.MapProvider =
                GMap.NET.MapProviders.GMapProviders.GoogleMap;
            GMap.NET.GMaps.Instance.Mode =
                GMap.NET.AccessMode.ServerOnly;

            //Если вы используете интернет через прокси сервер,
            //указываем свои учетные данные.
            GMap.NET.MapProviders.GMapProvider.WebProxy =
                System.Net.WebRequest.GetSystemWebProxy();
            GMap.NET.MapProviders.GMapProvider.WebProxy.Credentials =
                System.Net.CredentialCache.DefaultCredentials;

            //Указываем элементу управления,
            //что необходимо при открытии карты прейти по
            //координатам красной площади в Москве.
            _gMapControl.Position = new GMap.NET.PointLatLng(55.75393, 37.620795);

            //Создаем новый список маркеров, с указанием компонента 
            //в котором они будут использоваться и названием списка.
            GMap.NET.WindowsForms.GMapOverlay markersOverlay =
                new GMap.NET.WindowsForms.GMapOverlay(_gMapControl, "marker");

            //Инициализация нового ЗЕЛЕНОГО маркера, с указанием его координат.
            GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen markerG =
                new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen(
                //Указываем координаты Красной площади
                new GMap.NET.PointLatLng(55.75393, 37.620795));
            markerG.ToolTip =
                new GMap.NET.WindowsForms.ToolTips.GMapRoundedToolTip(markerG);
            //Текст отображаемый при наведении на маркер.
            markerG.ToolTipText = "Красная площадь";
            markerG.Tag = 1;

            //Инициализация нового КРАСНОГО маркера, с указанием его координат.
            GMap.NET.WindowsForms.Markers.GMapMarkerGoogleRed markerR =
                new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleRed(
                //Указываем координаты Красной площади
                new GMap.NET.PointLatLng(55.75393, 37.620695));
            markerR.ToolTip =
                new GMap.NET.WindowsForms.ToolTips.GMapBaloonToolTip(markerG);
            //Текст отображаемый при наведении на маркер.
            markerR.ToolTipText = "Красная площадь";
            markerR.Tag = 2;

            //Добавляем маркеры в список маркеров.
            //Зеленый маркер
            markersOverlay.Markers.Add(markerG);
            //Красный маркет
            markersOverlay.Markers.Add(markerR);
            //Добавляем в компонент, список маркеров.
            _gMapControl.Overlays.Add(markersOverlay);
        }

        private void _gMapControl_MouseDown(object sender, MouseEventArgs e)
        {
            // находим тот маркер над которым нажали клавишу мыши
            _selectedMarker = _gMapControl.Overlays
                .SelectMany(o => o.Markers)
                .FirstOrDefault(m => m.IsMouseOver == true);
        }

        private void _gMapControl_MouseUp(object sender, MouseEventArgs e)
        {
            if (_selectedMarker is null)
                return;

            // переводим координаты курсора мыши в долготу и широту на карте
            var latlng = _gMapControl.FromLocalToLatLng(e.X, e.Y);
            // присваиваем новую позицию для маркера
            _selectedMarker.Position = latlng;

            _selectedMarker = null;
        }
    }
}
При запуске приложения создается два маркера на карте:
1 .jpg

При первом перетаскивании маркера он дублируется, одна копия остается на старом месте, другая копия перемещается в новое место, получается вместо 2-х маркеров становится 4:
2 .jpg
Причем при отладке, когда точка останова стоит на методе _gMapControl_MouseDown, я заметил, что в метод _gMapControl_MouseDown и _gMapControl_MouseUp происходит вход 2 раза подряд. Подскажите, почему так происходит?
eliasum вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java script - смена маркера списка Knight_ JavaScript, Ajax 1 08.10.2017 00:49
Изменение значения ячейки перетаскивание маркера точки на диаграмме Обыватель Microsoft Office Excel 0 29.02.2012 14:50
Поиск текста от маркера до маркера artemavd Общие вопросы Delphi 13 07.04.2010 12:37
Delphi: движение маркера по игровому полю Blondy Gamedev - cоздание игр: Unity, OpenGL, DirectX 16 08.02.2010 12:25
Захват маркера на видео Liam Помощь студентам 0 03.07.2009 03:52