GMap学习笔记

2017-01-09 07:53:29来源:cnblogs.com作者:yaohuimo人点击

第七城市

GMap学习笔记

1、GMap体系详解

  •  What is the map control (GMapControl)? This is the control which renders the map. 
  •  What is an Overlay (GMapOverlay)? This is a layer on top of the map control. You can have several layers on top of a map, each layer representing, say, a route with stops, a list    of stores etc.
  •  What are Markers (GMapMarker)? These are the points on a layer, each representing a specific geo location (Lat,Lon) e.g. each drop point on a route.
  • What is a route (GMapRoute)? This is the path or direction between two or more poin

 

 

 

 

 

 

 

 

 

 

 

2、c# 使用GMap 实现具体的功能(加载地图、放大、缩小、鹰眼、添加点线面、自定义marker、截图、下载缓存)

     注:添加GMap.NET.Core.dll 和 GMap.NET.WindowsForms.dll文件,引用后使用GMap的控件。

 2.1 加载地图

这里直接调用了SuperMap iServer REST服务。调用第三方地图服务参考 http://www.cnblogs.com/luxiaoxun/p/3364107.html

 2.2 放大、缩小地图

private void tsbZoomIn_Click(object sender, EventArgs e){this.mapControl1.Zoom += 1;}private void tsbZoomOut_Click(object sender, EventArgs e){this.mapControl1.Zoom -= 1;}//定义的地图控件缩放变化后对应的事件private void mapControl1_OnMapZoomChanged(){double zoom = this.mapControl1.Zoom - Convert.ToDouble(5);this.mapControl2.Zoom = zoom; //设置地图缩放大小}

 2.3 鹰眼

需要2个地图控件,同时缩放、移动,实现联动的效果。

gMapControl1 事件设置代码:

private bool Mapleft1 = false;private void gMapControl1_MouseDown(object sender, MouseEventArgs e){    if (e.Button == MouseButtons.Left)    {        Mapleft1 = true;    }}private void gMapControl1_MouseUp(object sender, MouseEventArgs e){    if (e.Button == MouseButtons.Left)    {        Mapleft1 = false;    }}private void gMapControl1_OnPositionChanged(PointLatLng point){    if (Mapleft1)    {        this.gMapControl2.Position = point; //设置小地图中心点    }}private void gMapControl1_OnMapZoomChanged(){    double zoom = this.gMapControl1.Zoom - Convert.ToDouble(5);    this.gMapControl2.Zoom = zoom; //设置地图缩放大小}

gMapControl2 事件设置代码:

private bool Mapleft2 = false;private void gMapControl2_MouseMove(object sender, MouseEventArgs e){    lastPosition1 = this.gMapControl1.FromLocalToLatLng(e.X, e.Y);}private void gMapControl2_MouseUp(object sender, MouseEventArgs e){    if (e.Button==MouseButtons.Left)    {        Mapleft2 = false;    }}private void gMapControl2_MouseDown(object sender, MouseEventArgs e){    if (e.Button == MouseButtons.Left)    {        this.gMapControl1.Position = lastPosition1; //鼠标单击设置gMapControl1.中心点        Mapleft2 = true;    }}private void gMapControl2_OnPositionChanged(PointLatLng point){    if (Mapleft2)    {        this.gMapControl1.Position = point; //设置gMapControl1中心点    }}

 2.4 添加点线面

以添加点对象为例:

IAction _editAddAlarmAction = null;        //添加告警源        private void tsbAddAlarm_Click_1(object sender, EventArgs e)        {            if (_editAddAlarmAction == null)            {                _editAddAlarmAction = new AddAlarmAction();            }            this.mapControl1.CurrentAction = _editAddAlarmAction;            ToolCheckChanged((sender as ToolStripItem).Name);        }
  public class AddAlarmAction : Action    {        List<Feature> targetFeatures = null;        private GMapControl _gMapControl = null;        private GMapOverlay markerOverlay = new GMapOverlay("addalarm");        private bool _start = false;        List<PointLatLng> _points = null;        List<Point2D> _point2Ds = new List<Point2D>();        private string _mapUrl = string.Empty;        private string _mapName = string.Empty;        Map _map = null;        public override void OnLoad(GMapControl gMapControl)        {            _gMapControl = gMapControl;            _gMapControl.Overlays.Add(markerOverlay);            _points = new List<PointLatLng>();            _start = false;            this._mapUrl = ((SuperMapProvider)gMapControl.MapProvider).ServiceUrl;            this._mapName = ((SuperMapProvider)gMapControl.MapProvider).MapName;            this._map = new Map(this._mapUrl);        }        public override void OnMapMouseDown(object sender, MouseEventArgs e)        {            PointLatLng currentPoint = this._gMapControl.FromLocalToLatLng(e.X, e.Y);            double mercatorX, mercatorY;            Helper.LonLat2Mercator(currentPoint.Lng, currentPoint.Lat, out mercatorX, out mercatorY);            Point2D point2D = new Point2D(mercatorX, mercatorY);            _point2Ds.Add(point2D);            _points.Add(currentPoint);            if (_start)            {                GMapMarker marker = new GMapMarkerImage(currentPoint, new Bitmap("C://Users//yaohui//Desktop//iClient-for-DotNet-master//iClient-for-DotNet-master//Demo//demo.winform//Resources//sign-warning-icon.png"));                markerOverlay.Markers.Add(marker);                marker.ToolTipText = "告警源编号:";                marker.ToolTip.Fill = Brushes.Blue;                marker.ToolTip.Foreground = Brushes.White;                marker.ToolTip.Stroke = Pens.Black;                marker.ToolTip.TextPadding = new Size(20, 20);                marker.ToolTipMode = MarkerTooltipMode.OnMouseOver;            }            _start = true;        }        public override void OnMapMouseDoubleClick(object sender, MouseEventArgs e)        {            if (!_start) return;            PointLatLng currentPoint = this._gMapControl.FromLocalToLatLng(e.X, e.Y);            double mercatorX, mercatorY;            Helper.LonLat2Mercator(currentPoint.Lng, currentPoint.Lat, out mercatorX, out mercatorY);            Point2D point2D = new Point2D(mercatorX, mercatorY);            markerOverlay.Markers.Clear();            _points.Clear();            _point2Ds.Clear();            _start = false;        }    }

 2.5 自定义marker

 通过继承gmap的marker类,进行扩展:(这里添加了符号高亮的画笔)

using GMap.NET.WindowsForms;using System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace gmap.demo.winform{    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 bool IsHighlight = true;        public Pen HighlightPen        {            set;            get;        }        public Pen FlashPen        {            set;            get;        }        public Pen OutPen        {            get;            set;        }        private Timer flashTimer = new Timer();        private int radius;        private int flashRadius;        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);            Image = image;            HighlightPen = new System.Drawing.Pen(Brushes.Red, 2);            radius = Size.Width >= Size.Height ? Size.Width : Size.Height;            flashTimer.Interval = 10;            flashTimer.Tick += new EventHandler(flashTimer_Tick);        }        void flashTimer_Tick(object sender, EventArgs e)        {            if (FlashPen == null)            {                FlashPen = new Pen(Brushes.Red, 3);                flashRadius = radius;            }            else            {                flashRadius += radius / 4;                if (flashRadius >= 2 * radius)                {                    flashRadius = radius;                    FlashPen.Color = Color.FromArgb(255, Color.Red);                }                else                {                    Random rand = new Random();                    int alpha = rand.Next(255);                    FlashPen.Color = Color.FromArgb(alpha, Color.Red);                }            }        }        //this.Overlay.Control.Refresh();        //this.mapControl1.Refresh();        public void StartFlash()        {            flashTimer.Start();        }        public void StopFlash()        {            flashTimer.Stop();            if (FlashPen != null)            {                FlashPen.Dispose();                FlashPen = null;            }        }        //this.mapControl1.Refresh();        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 (IsMouseOver && IsHighlight)            {                g.DrawRectangle(HighlightPen, rect);            }            if (FlashPen != null)            {                g.DrawEllipse(FlashPen,                    new Rectangle(LocalPosition.X - flashRadius / 2 + Size.Width / 2, LocalPosition.Y - flashRadius / 2 + Size.Height / 2, flashRadius, flashRadius));            }        }        //public override void Dispose()        //{        //    if (HighlightPen != null)        //    {        //        HighlightPen.Dispose();        //        HighlightPen = null;        //    }        //    if (FlashPen != null)        //    {        //        FlashPen.Dispose();        //        FlashPen = null;        //    }        //}    }}

 2.6 截图

//地图保存为图片        private void toolStripButton6_Click(object sender, EventArgs e)        {            try            {                using (SaveFileDialog dialog = new SaveFileDialog())                {                    dialog.Filter = "PNG (*.png)|*.png";                    dialog.FileName = "GMap.NET image";                    Image image = this.mapControl1.ToImage();                    if (image != null)                    {                        using (image)                        {                            if (dialog.ShowDialog() == DialogResult.OK)                            {                                string fileName = dialog.FileName;                                if (!fileName.EndsWith(".png", StringComparison.OrdinalIgnoreCase))                                {                                    fileName += ".png";                                }                                image.Save(fileName);                                MessageBox.Show("图片已保存: " + dialog.FileName, "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);                            }                        }                    }                }            }            catch (Exception exception)            {                MessageBox.Show("图片保存失败: " + exception.Message, "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Hand);            }        }

 2.7 保存缓存

        //保存缓存        private void toolStripButton7_Click(object sender, EventArgs e)        {            if (this.mapControl1.ShowExportDialog() == true)            {                //this.gMapControl1.ShowTileGridLines = true;//显示瓦片,也就是显示方格                this.mapControl1.ReloadMap();            }        }

 

3、iclient for .net 模拟B/S实现报警闪烁demo展示

 

4、参考

http://www.cnblogs.com/luxiaoxun/p/3494756.html

http://blog.csdn.net/sunsun1203/article/details/53816464

http://www.cnblogs.com/luxiaoxun/p/3475355.html

http://blog.sina.com.cn/s/blog_819100560101dgng.html

 

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台