在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
自定义Marker,可以理解为在地图上自定义图标(Custom Marker),先看看GMap的地图和图标的显示方式: Map控件上可以添加Overlay(图层),可以添加多个图层,先添加的图层在下面显示。 图层上可以添加GMapMarker,当然也可以添加GMapPolygon和GMapRoute,后续介绍。 在地图的使用中常要求的功能就是添加自定义图标,可以点击图标、删除图标、拖动图标、高亮图标等。 下面介绍这些功能的实现(主要是基于WinForm的,WPF的可以参考官方Demo实现): 1、自定义图标,使用官方的Marker: 复制代码 代码如下: Bitmap bitmap = Bitmap.FromFile("F:\\Projects\\GMapDemo\\GMapDemo\\Image\\A.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 public Pen Pen public Pen OutPen public GMapMarkerImage(GMap.NET.PointLatLng p, Image image) public override void OnRender(Graphics g) Rectangle rect = new Rectangle(LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height); if (Pen != null) if (OutPen != null) public override void Dispose() if (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); 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.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using GMap.NET; using GMap.NET.WindowsForms; using GMap.NET.MapProviders; using GMap.NET.WindowsForms.Markers; namespace GMapWinFormDemo private Timer blinkTimer = new Timer(); public MainForm() try mapControl.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //缓存位置 mapControl.OnMapZoomChanged += new MapZoomChanged(mapControl_OnMapZoomChanged); mapControl.OnMarkerClick += new MarkerClick(mapControl_OnMarkerClick); mapControl.Overlays.Add(objects); void mapControl_MouseMove(object sender, MouseEventArgs e) void mapControl_MouseUp(object sender, MouseEventArgs e) void mapControl_MouseDown(object sender, MouseEventArgs e) void mapControl_OnMarkerLeave(GMapMarker item) void mapControl_OnMarkerEnter(GMapMarker item) void mapControl_OnMarkerClick(GMapMarker item, MouseEventArgs e) void mapControl_MouseClick(object sender, MouseEventArgs e) void mapControl_OnMapZoomChanged() private void buttonBeginBlink_Click(object sender, EventArgs e) void blinkTimer_Tick(object sender, EventArgs e) private void buttonStopBlink_Click(object sender, EventArgs e) |
请发表评论