在上篇《Winform下的地图开发控件(GMap.NET)使用心得》中简单介绍了GMap.NET的控件基本情况,本篇开始介绍一下相关的代码操作。

其实目前GMap.NET提供的功能还不是很多,因此其演示的例子基本上都涉及到了,我在此基础上做了一些改进和运用,总结下功能代码吧。

首先使用控件前,需要初始化一些变量和事件,初始化代码如下所示:

        private void InitMapControl()
        {
            this.gMapControl1.Manager.Mode = AccessMode.ServerAndCache;
            this.gMapControl1.MapType = MapType.GoogleMapChina;
            this.gMapControl1.MaxZoom = 18;
            this.gMapControl1.MinZoom = 8;
            this.gMapControl1.Zoom = 13;

this.gMapControl1.MouseMove += new MouseEventHandler(gMapControl1_MouseMove);
            this.gMapControl1.DoubleClick += new EventHandler(gMapControl1_DoubleClick);
            this.gMapControl1.MouseDown += new MouseEventHandler(this.MainMap_MouseDown);
            this.gMapControl1.MouseUp += new MouseEventHandler(this.MainMap_MouseUp);

this.gMapControl1.OnCurrentPositionChanged += new CurrentPositionChanged(this.MainMap_OnCurrentPositionChanged);
            this.gMapControl1.OnTileLoadStart += new TileLoadStart(this.MainMap_OnTileLoadStart);
            this.gMapControl1.OnTileLoadComplete += new TileLoadComplete(this.MainMap_OnTileLoadComplete);

this.gMapControl1.OnMarkerClick += new MarkerClick(this.MainMap_OnMarkerClick);
            this.gMapControl1.OnMapZoomChanged += new MapZoomChanged(this.MainMap_OnMapZoomChanged);
            this.gMapControl1.OnMapTypeChanged += new MapTypeChanged(this.MainMap_OnMapTypeChanged);

this.routes = new GMapOverlay(this.gMapControl1, "routes");
            this.gMapControl1.Overlays.Add(this.routes);
            this.objects = new GMapOverlay(this.gMapControl1, "objects");
            this.gMapControl1.Overlays.Add(this.objects);
            this.top = new GMapOverlay(this.gMapControl1, "top");
            this.gMapControl1.Overlays.Add(this.top);
            this.currentMarker = new GMapMarkerGoogleRed(this.gMapControl1.CurrentPosition);
            this.top.Markers.Add(this.currentMarker);
            this.center = new GMapMarkerCross(this.gMapControl1.CurrentPosition);
            this.top.Markers.Add(this.center);

this.myShop = new GMapOverlay(this.gMapControl1, "myShop");
            this.gMapControl1.Overlays.Add(this.myShop);
            DisplayMyShop();
            
            SetZoomCenter();

this.gMapControl1.DragButton = MouseButtons.Left;
        }

其中的OnMarkerClick好像虽然有相关的事件,但是并不能捕获单击图标的时间操作,估计是没有完成该功能吧。

GMap.NET提供了各种鼠标的操作事件,我们重载即可实现特殊的控制处理了:

        void gMapControl1_DoubleClick(object sender, EventArgs e)
        {
            this.gMapControl1.Zoom += 1;
            this.gMapControl1.CurrentPosition = lastPosition;
        }

void gMapControl1_MouseMove(object sender, MouseEventArgs e)
        {
            PointLatLng latLng = this.gMapControl1.FromLocalToLatLng(e.X, e.Y);
            this.tsslPosition.Text = string.Format("经度:{0}, 纬度:{1} ", latLng.Lng, latLng.Lat);
        }

private void MainMap_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.isMouseDown = true;
                lastPosition = this.gMapControl1.FromLocalToLatLng(e.X, e.Y);              
            }            
        }

private void MainMap_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.isMouseDown = false;
            }
        }

保存截图的操作如下所示

        private void tsbSavePicture_Click(object sender, EventArgs e)
        {
            try
            {
                using (SaveFileDialog dialog = new SaveFileDialog())
                {
                    dialog.Filter = "PNG (*.png)|*.png";
                    dialog.FileName = "GMap.NET image";
                    Image image = this.gMapControl1.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);
            }

地址查询并绘制图标的代码如下:

private void btnSearch_Click(object sender, EventArgs e)
        {
            if (this.txtAddress.Text.Length == 0)
            {
                this.txtAddress.Focus();
                MessageBox.Show("请输入查询的地址");
            }

string search = string.Format("{0},{1}", this.txtCity.Text, this.txtAddress.Text);
            GeoCoderStatusCode code = this.gMapControl1.SetCurrentPositionByKeywords(search);
            if (code != GeoCoderStatusCode.G_GEO_SUCCESS)
            {
                MessageBox.Show("地址没有找到:'" + this.txtAddress.Text + "', 原因:" + code.ToString(), "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

this.objects.Markers.Clear();
            AddLocation(this.txtAddress.Text);
        }

private void AddLocation(string place)
        {
            GeoCoderStatusCode unknow = GeoCoderStatusCode.Unknow;
            PointLatLng? latLngFromGeocoder = Singleton<GMaps>.Instance.GetLatLngFromGeocoder(place, out unknow);
            if (latLngFromGeocoder.HasValue && (unknow == GeoCoderStatusCode.G_GEO_SUCCESS))
            {
                GMapMarker item = new GMapMarkerGoogleGreen(latLngFromGeocoder.Value);
                GMapMarkerRect rect = new GMapMarkerRect(latLngFromGeocoder.Value);
                rect.Size = new System.Drawing.Size(100, 100);
                rect.ToolTipText = place;
                rect.TooltipMode = MarkerTooltipMode.Always;
                this.objects.Markers.Add(item);
                this.objects.Markers.Add(rect);
            }
        }

绘制两地之间的线路图命令如下所示:

        private void ctxMenu_GetRout_Click(object sender, EventArgs e)
        {
            this.objects.Markers.Clear();
            this.routes.Routes.Clear();//清楚路线

this.start = defaultLocation;
            this.end = this.gMapControl1.FromLocalToLatLng(this.contextMenuStrip1.Bounds.X, this.contextMenuStrip1.Bounds.Y);

MapRoute route = Singleton<GMaps>.Instance.GetRouteBetweenPoints(this.start, this.end, false, (int)this.gMapControl1.Zoom);
            if (route != null)
            {
                GMapRoute item = new GMapRoute(route.Points, route.Name);
                item.Color = Color.Blue;
                this.routes.Routes.Add(item);

GMapMarker marker = new GMapMarkerGoogleRed(this.start);
                //marker.ToolTipText = "Start: " + route.Name;
                marker.TooltipMode = MarkerTooltipMode.Always;

//Placemark place = this.gMapControl1.Manager.GetPlacemarkFromGeocoder(this.end);//地标不准确,不用
                MapRoute mapRoute = this.gMapControl1.Manager.GetRouteBetweenPoints(this.start, this.end, true, (int)this.gMapControl1.Zoom);
                GMapMarker marker2 = new GMapMarkerGoogleGreen(this.end);
                marker2.ToolTipText = string.Format("目的地距离:{0}公里 ", Math.Round(mapRoute.Distance, 2));
                marker2.TooltipMode = MarkerTooltipMode.Always;

this.objects.Markers.Add(marker);
                this.objects.Markers.Add(marker2);
                this.gMapControl1.ZoomAndCenterRoute(item);
            }            
        }

放大、缩小、重新加载地图的操作如下:

        private void ctxMenu_ZoomOut_Click(object sender, EventArgs e)
        {
            this.gMapControl1.Zoom += 1;            
        }

private void ctxMenu_ZoomIn_Click(object sender, EventArgs e)
        {
            this.gMapControl1.Zoom -= 1;
        }

private void tsbReload_Click(object sender, EventArgs e)
        {
            this.gMapControl1.ReloadMap();
        }

程序截图如下所示:

本文转自博客园伍华聪的博客,原文链接:Winform下的地图开发控件(GMap.NET)使用心得之二,如需转载请自行联系原博主。

Winform下的地图开发控件(GMap.NET)使用心得之二相关推荐

  1. Winform下的地图开发控件(GMap.NET)使用心得

    原文地址为: Winform下的地图开发控件(GMap.NET)使用心得 我们先看看GMap.NET的定义: GMap.NET是一个强大.免费.跨平台.开源的.NET控件,它在Windows Form ...

  2. 基于地图开发控件GMap.Net 使用 (一) 原创

    我们先看看GMap.NET的定义: GMap.NET是一个强大.免费.跨平台.开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, Op ...

  3. WinForm下PictureBox和Panel控件的On_Paint事件有何区别

    昨天一个WindowForm项目需要画图,随手拖了一个PictureBox控件上来,实现了On_paint事件后,图画的倒是不错,但总是不能很好的重画,总感觉是重画完成后又被刷新了,试了N次都不行. ...

  4. (转)深入理解最强桌面地图控件GMAP.NET --- 原理篇

    前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 我们以Google地图为例,这章介绍下地图 ...

  5. 深入理解最强桌面地图控件GMAP.NET --- 原理篇

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/18/2865700.html 前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件G ...

  6. 深入理解最强桌面地图控件GMAP.NET --- SOSO地图

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/15/2859028.html 前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百 ...

  7. (转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图

    前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百度地图. 深入理解最强桌面地图控件GMAP.NET --- 初识 深入理解最强桌面地图控件GMAP.NET --- 初用 深入理解最强桌面地 ...

  8. 深入理解最强桌面地图控件GMAP.NET --- 百度地图

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/14/2859026.html 前两篇介绍了GMAP.NET的一些基本功能和如何在自己的项目 ...

  9. 深入理解最强桌面地图控件GMAP.NET ---高德地图

    前一篇介绍了GMAP.NET的理论基础,这篇介绍如何集成高德地图.高德地图自从为IOS6提供地图后,目前已经被大众所熟知了. 在我集成国内地图的经验来看,也是最符合墨卡托投影法的. 前面的相关文章链接 ...

最新文章

  1. nagios用NsClient自定义windows监控
  2. 推荐算法炼丹笔记:电商搜索推荐业务词汇表
  3. nginx无法访问index.html,ThinkPHP5 + nginx配置(index.php无法访问404)
  4. Nginx的官方简介
  5. for循环数据量太大_中文文本分类roberta大力出奇迹之数据量大的问题
  6. mybatis直接执行sql_拼多多二面:Mybatis是如何执行一条SQL命令的?
  7. springboot事务管理
  8. 朴素的UNIX之-进程/线程模型
  9. java基础 (六)面向对象(一)
  10. 【胸片分割】基于matlab GUI最小误差法胸片分割系统【含Matlab源码 1065期】
  11. RDKit | RDKit分子结构图的详细说明
  12. 猎豹网校梁兴珍老师的python课程很不错
  13. error LNK2001的一些原因
  14. java 图像识别颜色块_Java opencv识别图片中指定颜色
  15. 思维导图与知识树/大纲/目录的区别是什么?
  16. 互联网公司加班狠?盘点阿里、华为的凌晨四点
  17. The error occurred while setting parameters
  18. java生成N位随机数字
  19. 安防监控直播中无插件web直播方案中实现快照抓取的功能
  20. 博通wifi驱动详解(三)

热门文章

  1. 例解 autoconf 和 automake 生成 Makefile 文件
  2. javascript 2
  3. 随笔——js中的this指向,apply()与 call()
  4. ITTC数据挖掘平台介绍(四) 框架改进和新功能
  5. Mongodb 添加删除分片与非分片表维护
  6. Web开发者推荐的最佳HTML5/CSS3代码生成器
  7. Android Stability test occured SWT restart issue
  8. 在MFC中使用AFXBEGINTHREAD的方法
  9. CSS:IE与Firefox的CSS兼容大全
  10. Custom Control 设计初论