博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GMap学习笔记
阅读量:5340 次
发布时间:2019-06-15

本文共 11260 字,大约阅读时间需要 37 分钟。

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; //设置地图缩放大小}
View Code

 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; //设置地图缩放大小}
View Code

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中心点    }}
View Code

 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);        }
View Code
public class AddAlarmAction : Action    {        List
targetFeatures = null; private GMapControl _gMapControl = null; private GMapOverlay markerOverlay = new GMapOverlay("addalarm"); private bool _start = false; List
_points = null; List
_point2Ds = new List
(); 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
(); _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; } }
View Code

 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;        //    }        //}    }}
View Code

 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);            }        }
View Code

 2.7 保存缓存

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

 

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

 

转载于:https://www.cnblogs.com/yaohuimo/p/6255396.html

你可能感兴趣的文章
2019-06-19 滴滴打车一面
查看>>
SQL SERVER 简体与繁体 定序 轉換
查看>>
在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
查看>>
使用 Eclipse Memory Analyzer 进行堆转储文件分析
查看>>
开源操作系统读《移动互联网白皮书》有感
查看>>
[bxd学习java基本点]10.set元素不重复,取元素顺序会变的。TreeSet取值时,是安顺序来的。...
查看>>
数据库订正脚本性能优化两则:去除不必要的查询和批量插入SQL
查看>>
android 完全退出实现
查看>>
寻找最水之王
查看>>
18二叉树的镜像
查看>>
远程桌面报错解决:No Remote Desktop License Servers Available
查看>>
git常用命令
查看>>
BigDecimal常用操作
查看>>
LAMP分离部署
查看>>
js弹出遮罩层
查看>>
chucilianxi
查看>>
视图, 事务,存储过程,if,触发器,索引
查看>>
Java面向对象-001-继承与构造函数
查看>>
Tapestry5之css样式引入
查看>>
Electron使用时拦截HTTP请求的解决方案
查看>>