您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> asp.net编程 >> 正文

GMap.Net开发之自定义Marker使用方法

作者:佚名    责任编辑:admin    更新时间:2022-06-22

 这篇文章主要介绍了GMap中Marker的使用方法,有需要的朋友可以参考一下

自定义Marker,可以理解为在地图上自定义图标(Custom Marker),先看看GMap的地图和图标的显示方式:   9.jpg   Map控件上可以添加Overlay(图层),可以添加多个图层,先添加的图层在下面显示。   图层上可以添加GMapMarker,当然也可以添加GMapPolygon和GMapRoute,后续介绍。   在地图的使用中常要求的功能就是添加自定义图标,可以点击图标、删除图标、拖动图标、高亮图标等。   下面介绍这些功能的实现(主要是基于WinForm的,WPF的可以参考官方Demo实现):   1、自定义图标,使用官方的Marker:   代码如下: Bitmap bitmap = Bitmap.FromFile("F:ProjectsGMapDemoGMapDemoImageA.png") as Bitmap; GMapMarker marker = new GMarkerGoogle(point, bitmap);     直接使用GMap.NET.WindowsForms.Markers中的GMarkerGoogle,传入一个Bitmap,就可以使用自定义的图片来做图标。   2、继承GMapMarker,自定义Marker:   代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using GMap.NET; using GMap.NET.WindowsForms; using System.Drawing;   namespace GMapWinFormDemo {     class GMapMarkerImage : GMapMarker     {         private Image image;         public Image Image         {             get             {                 return image;             }             set             {                 image = value;                 if (image != null)                 {                     this.Size = new Size(image.Width, image.Height);                 }             }         }           public Pen Pen         {             get;             set;         }           public Pen OutPen         {             get;             set;         }           public GMapMarkerImage(GMap.NET.PointLatLng p, Image image)             : 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;             Pen = null;             OutPen = null;         }           public override void OnRender(Graphics g)         {             if (image == null)                 return;               Rectangle rect = new Rectangle(LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height);             g.DrawImage(image, rect);               if (Pen != null)             {                 g.DrawRectangle(Pen, rect);             }               if (OutPen != null)             {                 g.DrawEllipse(OutPen, rect);             }         }           public override void Dispose()         {             if (Pen != null)             {                 Pen.Dispose();                 Pen = null;             }               if (OutPen != null)             {                 OutPen.Dispose();                 OutPen = null;             }               base.Dispose();         }     } }       介绍下GMapMarkerImage三个属性的作用:   Image:保存图标的图片。   Pen:在图片外围画DrawRectangle的Pen,当其不为null的时候,会在图片的外围画一个矩形,实现高亮(highlight)的效果。   OutPen:在图片外围画DrawEllipse的Pen,当其不为null的时候,会在图片外围画一个一个椭圆,设置这个值可以实现闪动。   3、移动图标(Move Marker)的实现:   在MapControl中添加如下事件的响应:    代码如下: mapControl.MouseDown += new MouseEventHandler(mapControl_MouseDown); mapControl.MouseUp += new MouseEventHandler(mapControl_MouseUp); mapControl.MouseMove += new MouseEventHandler(mapControl_MouseMove);   mapControl.OnMarkerClick += new MarkerClick(mapControl_OnMarkerClick); mapControl.OnMarkerEnter += new MarkerEnter(mapControl_OnMarkerEnter); mapControl.OnMarkerLeave += new MarkerLeave(mapControl_OnMarkerLeave);       MouseDown和MouseUp中判断左键是否按下(用左键来移动图标)。   OnMarkerEnter中设置选中的Marker,同时设置Pen的值,实现高亮。   OnMarkerLeave中取消选中的Marker,取消Pen的值,取消高亮。   MouseMove中更新选中选中Marker的Position就可以了。   4、图标闪动的实现:   需要一个定时器:使用的是Form下的Timer,定时器响应的事件:   代码如下: void blinkTimer_Tick(object sender, EventArgs e)         {             foreach (GMapMarker m in objects.Markers)             {                 if (m is GMapMarkerImage)                 {                     GMapMarkerImage marker = m as GMapMarkerImage;                     if (marker.OutPen == null)                         marker.OutPen = new Pen(Brushes.Red, 2);                     else                     {                         marker.OutPen.Dispose();                         marker.OutPen = null;                     }                 }             }             mapControl.Refresh();         }     更新所有Marker的OutPen的值(当然你也可以只更新某个Marker),通过在图标上画圈圈来实现闪动,当然你也可以通过设置Marker的IsVisible属性来实现自己想要的效果。。。   效果图如下:       全部代码如下:   代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dr