2017-02-18 33 views
0

я могу изменить позиции маркеров сОбновление GMap.NET Маркер изображения в C#

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

, но как я могу изменить значок маркера с выставлением varible как выше? Я объявляя точки, как

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

спасибо ...

+0

Когда я объявляю переменную, как указано выше, я могу снова перейти к маркерной переменной как «marker3 [index] = new Bitmap (« images/2.png »);' ??? –

+0

Нет, потому что вы не можете назначить изображение маркеру, поскольку изображение является свойством маркера. – rdoubleui

ответ

0

Проблемы обновления образ этих маркеров является то, что свойство Image не является общедоступным, поэтому вы не можете обновить изображение таким образом.

Существует две возможности: первая заключается в замене ссылки на маркер на новую, что дает вам возможность установить новое изображение и скопировать положение текущего маркера. Однако это не тот чистый способ, поскольку вы без необходимости создаете целую кучу ссылок только для того, чтобы сразу их распоряжаться в зависимости от варианта использования. Если это одноразовое обновление, то этот подход прекрасен.

Предпочитаемый способ состоит в том, чтобы получить от GMapMarker, как это делает пользователь Google (вы можете использовать его как шаблон, не считая всей логики значка Google). Вы знакомы с концепцией получения? Это потребует еще нескольких усилий, но будет стоить того, что может помочь в этом.

Также ваша основная ссылка, вероятно, project's github page.

EDIT

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); 
    } 
} 
+0

Я объявляю маркер снова с новым изображением, но мне это не нравится. Я не знаю, C# ну, так что я не хочу испортить библиотеку GMap.NET: D –

+0

Все в порядке, вы ничего не соблазняете :) Вывод будет расширять функциональность маркера. Это расширение будет жить только в вашем коде, я могу предоставить образец, как только вернусь к компьютеру. – rdoubleui

+0

Добавлен минимальный образец производного маркера с изображением, добавьте этот класс в свой проект и попробуйте, если это сработает для вас. – rdoubleui

1

Чтобы решить эту проблему, я связался с создателем библиотеки: радист. Он назвал код под названием «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, спасибо вам, сэр. Надеюсь, это поможет всем.