当前位置: 移动技术网 > IT编程>开发语言>.net > GMap.Net开发之自定义Marker

GMap.Net开发之自定义Marker

2018年11月03日  | 移动技术网IT编程  | 我要评论

忽必烈电视剧全集,江西红途新闻,光雾山天气

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

{

    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();

        }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网