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

简介:

在上篇《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)使用心得之二,如需转载请自行联系原博主。



目录
相关文章
|
3月前
|
开发框架 JavaScript 前端开发
震撼!破解 ASP.NET 服务器控件 Button 执行顺序之谜,颠覆你的开发认知!
【8月更文挑战第16天】在ASP.NET开发中,通过Button控件实现先执行JavaScript再触后台处理的需求十分常见。例如,在用户点击按钮前需前端验证或提示,确保操作无误后再传递数据至后台深度处理。此过程可通过设置Button的`OnClientClick`属性调用自定义JavaScript函数完成验证;若验证通过,则继续触发后台事件。此外,结合jQuery也能达到相同效果,利用`__doPostBack`手动触发服务器端事件。这种方式增强了应用的交互性和用户体验。
44 8
|
11天前
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
18天前
|
C# Android开发 iOS开发
一组.NET MAUI绘制的开源控件 - AlohaKit
一组.NET MAUI绘制的开源控件 - AlohaKit
|
2月前
|
开发框架 JavaScript 前端开发
|
6月前
|
SQL 开发框架 JavaScript
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
77 0
|
6月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
80 0
|
6月前
|
开发框架 .NET
Asp.Net就业课堂之模板控件
Asp.Net就业课堂之模板控件
65 1
|
6月前
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
107 0
|
6月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
136 0

相关实验场景

更多