GMap.Net开发之自定义Marker
图层上可以添加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
{
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();
}