簡體   English   中英

在C#中更新GMap.NET標記圖片

[英]Updating GMap.NET Marker Image in C#

我可以用

markers.Markers[2].Position = new PointLatLng(30.0000, 30.00000);

但是如何設置上面的變量來更改標記圖標? 我聲明要點為

GMap.NET.WindowsForms.GMapMarker marker3 =
                new GMap.NET.WindowsForms.Markers.GMarkerGoogle(
                    new GMap.NET.PointLatLng(30.0000, 30.00000),
                    new Bitmap("images/2.png"));

謝謝...

更新該標記的圖像的問題是Image屬性不能公開訪問,因此您不能以這種方式更新圖像。

有兩種可能性:第一種是用新的替換標記參考,這使您有機會設置新圖像並復制當前標記的位置。 但是,這不是一種干凈的方法,因為您不必要地創建一堆引用,而只是根據使用情況立即處置它們。 如果是一次性更新,則此方法很好。

最好的方法是像Google標記一樣從GMapMarker派生(您可以將其用作模板,而GMapMarker整個Google特定的圖標邏輯)。 您是否熟悉派生的概念? 這將需要更多的努力,但值得,可以幫助您。

您的主要參考資料也可能是該項目的github頁面

編輯

using System.Drawing;

public class GImageMarker : GMapMarker
{
    public Bitmap Bitmap { get; set; }

    public GImageMarker(PointLatLng p, Bitmap Bitmap)
        : base(p)
    {
        this.Bitmap = Bitmap;
        Size = new System.Drawing.Size(Bitmap.Width, Bitmap.Height);
        Offset = new Point(-Size.Width / 2, -Size.Height);
    }

    public override void OnRender(Graphics g)
    {
         g.DrawImage(Bitmap, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height);
    }
}

為了解決這個問題,我聯系了圖書館的創建者:廣播員。 他引用了一些名為“ GMarkerArrow”的代碼。 這是代碼:

namespace Demo.WindowsForms.CustomMarkers
{
    using System;
    using System.Drawing;
    using System.Runtime.Serialization;
    using GMap.NET;
    using GMap.NET.WindowsForms;

    [Serializable]
    public class GMarkerArrow : GMapMarker, ISerializable
    {
        [NonSerialized]
        public Brush Fill = new SolidBrush(Color.FromArgb(155, Color.Blue));

        //[NonSerialized]
        //public Pen Pen = new Pen(Brushes.Blue, 5);

        static readonly Point[] Arrow = new Point[] { new Point(-7, 7), new Point(0, -22), new Point(7, 7), new Point(0, 2) };

        public float Bearing = 0;
        private float scale = 1;

        public float Scale
        {
            get
            {
                return scale;
            }
            set
            {
                scale = value;

                Size = new System.Drawing.Size((int)(14 * scale), (int)(14 * scale));
                Offset = new System.Drawing.Point(-Size.Width / 2, (int)(-Size.Height / 1.4));
            }
        }

        public GMarkerArrow(PointLatLng p)
           : base(p)
        {
            Scale = (float)1.4;
        }

        public override void OnRender(Graphics g)
        {
            //g.DrawRectangle(Pen, new System.Drawing.Rectangle(LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height));
            {
                g.TranslateTransform(ToolTipPosition.X, ToolTipPosition.Y);
                var c = g.BeginContainer();
                {
                    g.RotateTransform(Bearing - Overlay.Control.Bearing);
                    g.ScaleTransform(Scale, Scale);

                    g.FillPolygon(Fill, Arrow);
                }
                g.EndContainer(c);
                g.TranslateTransform(-ToolTipPosition.X, -ToolTipPosition.Y);
            }
        }

        public override void Dispose()
        {
            //if(Pen != null)
            //{
            //   Pen.Dispose();
            //   Pen = null;
            //}

            if (Fill != null)
            {
                Fill.Dispose();
                Fill = null;
            }

            base.Dispose();
        }

        #region ISerializable Members

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
        }

        protected GMarkerArrow(SerializationInfo info, StreamingContext context)
           : base(info, context)
        {
        }

        #endregion
    }
}

將其另存為GMarkerArrow.cs並將其添加到您的項目中。 將此添加到您的Form1代碼:

using Demo.WindowsForms.CustomMarkers;

現在,您可以通過以下方式使用新標記:

GMarkerArrow marker1 = new GMarkerArrow(new PointLatLng(-30, -40));
            marker1.ToolTipText = "blablabla";
            marker1.ToolTip.Fill = Brushes.Black;
            marker1.ToolTip.Foreground = Brushes.White;
            marker1.ToolTip.Stroke = Pens.Black;
            marker1.Bearing = 30; // Rotation angle
            marker1.Fill = new SolidBrush(Color.FromArgb(155, Color.Blue)); // Arrow color
            markers.Markers.Add(marker1);
            gMapControl1.Overlays.Add(markers);

我也想感謝@rdoubleui,謝謝你先生。 希望對大家有幫助。

GMapOverlay markersOverlay;

    private void AddOrUpdateMarker(string tag, double lat, double lng, Image NewImage)
    {

        Bitmap bmpmarker = (Bitmap)NewImage;

        var marker = markersOverlay.Markers.FirstOrDefault(m => m.Tag == tag);

        if(marker!=null)
        {
            markersOverlay.Markers.Remove(marker);
            gMapControl1.Refresh();
            marker = new GMarkerGoogle(new PointLatLng(lat, lng), bmpmarker);
            marker.Tag = tag;
            markersOverlay.Markers.Add(marker);
            gMapControl1.Refresh();
        }
        else
        {
            marker = new GMarkerGoogle(new PointLatLng(lat, lng), bmpmarker);
            marker.Tag = tag;
            markersOverlay.Markers.Add(marker);
            gMapControl1.Refresh();
        }


    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM