zoukankan      html  css  js  c++  java
  • 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(100100);
                    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();
            }

    程序截图如下所示:

    主要研究技术:代码生成工具、Visio二次开发
        
        转载请注明出处:
    撰写人:伍华聪  http:
    //www.iqidi.com 
  • 相关阅读:
    Linux删除tunnel的方法
    rpm 强制更新安装
    普通用户使用kubectl
    网络通信过程中mac地址和ip地址的必要性
    Quartz.net开源作业调度框架使用详解
    C# 开源组件--Word操作组件DocX
    用c#创建支持多语言的WinForm应用程序
    使用JavaScript获取日期加随机数生成单号
    C# winform treeView checkbox全选反选
    DevExpress控件的GridControl控件小结
  • 原文地址:https://www.cnblogs.com/jcomet/p/1693607.html
Copyright © 2011-2022 走看看