C#|GMap.NET控件基本使用-高德地图

来源:互联网 发布:淘宝神笔提示保存成功 编辑:程序博客网 时间:2024/05/16 17:43

GMap.Net

GMap.Net是.Net下一个地图控件,可以基于Http协议加载各个公司的地图,主要原理是通过解析各个公司的地图服务的URL,传入相应的参数得到对应的切片底图,如高德地图的GMapProvider的实现如下:

using System;using GMap.NET;using GMap.NET.MapProviders;using GMap.NET.Projections;namespace GMapProvidersExt{    public abstract class AMapProviderBase : GMapProvider    {        public AMapProviderBase()        {            MaxZoom = null;            RefererUrl = "http://www.amap.com/";            //Copyright = string.Format("©{0} 高德 Corporation, ©{0} NAVTEQ, ©{0} Image courtesy of NASA", DateTime.Today.Year);            }        public override PureProjection Projection        {            get { return MercatorProjection.Instance; }        }        GMapProvider[] overlays;        public override GMapProvider[] Overlays        {            get            {                if (overlays == null)                {                    overlays = new GMapProvider[] { this };                }                return overlays;            }        }    }    public class AMapProvider : AMapProviderBase    {        public static readonly AMapProvider Instance;        readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88");        public override Guid Id        {            get { return id; }        }        readonly string name = "AMap";        public override string Name        {            get            {                return name;            }        }        static AMapProvider()        {            Instance = new AMapProvider();        }        public override PureImage GetTileImage(GPoint pos, int zoom)        {            try            {                string url = MakeTileImageUrl(pos, zoom, LanguageStr);                return GetTileImageUsingHttp(url);            }            catch (Exception ex)            {                return null;            }        }        string MakeTileImageUrl(GPoint pos, int zoom, string language)        {            var num = (pos.X + pos.Y) % 4 + 1;            //string url = string.Format(UrlFormat, num, pos.X, pos.Y, zoom);            string url = string.Format(UrlFormat, pos.X, pos.Y, zoom);            return url;        }        //static readonly string UrlFormat = "http://webrd04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=7";        static readonly string UrlFormat = "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={0}&y={1}&z={2}";    }}

加载高德地图

为了方便,我们直接在我们的项目中引用GMap.NET.Core.dll、GMap.NET.WindowsForms.dll和GMapDownload.dll三个文件(这三个文件可以运行官网开源的Demo生成)。

在工具箱-组件-GMapcontrol找到我们GMap控件,拖拽到我们的窗体上,调整合适的大小。
这里写图片描述

在程序初始化时加载地图并设置GMap的一些属性

        private void Form1_Load(object sender, EventArgs e)        {            gmap.MapProvider = GMapProviders.AMapSatelite;//选择地图为高德卫星地图            GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerAndCache;            gmap.SetPositionByKeywords("Chengdu, China");//设定初始中心位置为Chengdu,成都坐标为西纬30.67度,东经104.06            gmap.ShowCenter = false;//不显示中心的红色十字            gmap.DragButton = System.Windows.Forms.MouseButtons.Left;  //左键拖动地图                        //设置地图分辨率信息            gmap.MaxZoom = 18;            gmap.MinZoom = 3;            gmap.Zoom = 15;        }

控件基本使用

使用滑动条trackBar控制地图的分辨率zoom
这时我们的地图已经能够实现用触控板控制地图的分辨率,但为符合用户习惯,我们在地图的右边加上滑动条用于控制地图的分辨率。

首先在定义中我们将滑动条的每一小格为100,滑动条最大值和最小值对应初始时地图分辨率的最大值和最小值。

            this.trackBar1.Minimum = 300;            this.trackBar1.Maximum = 1800;            this.trackBar1.TickFrequency = 100;

滑动条值改变时改变当前的地图分辨率

        //点击滑动条改变地图分辨率        private void trackBar1_ValueChanged_1(object sender, EventArgs e)        {            gmap.Zoom = trackBar1.Value / 100.0;        }        //滑动滑动条改变地图分辨率        private void trackBar1_Scroll(object sender, EventArgs e)        {            gmap.Zoom = trackBar1.Value / 100.0;        }

地图分辨率改变时改变当前的滑动条值

        //地图分辨率改变滑动条位置        void gMapMapZoomChanged()        {          if(gmap.Zoom>=3&&gmap.Zoom<=18)            {                trackBar1.Value = (int)(gmap.Zoom * 100.0);            }          if(gmap.Zoom < 3)            {                gmap.Zoom = 3;            }          if (gmap.Zoom > 18)            {                gmap.Zoom = 18;            }        }

建立标记点
在地图的使用中常要求的功能就是添加标记点,并可以对标记点进行点击、删除等操作。

GMap.NET控件上可以添加Overlay(图层),可以添加多个图层,先添加的图层在下面显示;图层上可以添加GMapMarker(标记点)、GMapPolygon和GMapRoute。
这里写图片描述

 //将字符串组LatLngInfo的点打标记,经纬度中用','隔开 public void SetLableOnMap(string[] LatLngInfo)        {            //创建图层              GMapOverlay gMapOverlay = new GMapOverlay();            //给每个坐标打点            for (int i=0;i< LatLngInfo.Length; i++)            {                string[] LatLng= LatLngInfo[i].Split(',');                //在坐标点上绘制一绿色点并向图层中添加标签                 gMapOverlay.Markers.Add(new GMarkerGoogle(new PointLatLng(double.Parse(LatLng[1]), double.Parse(LatLng[0])), GMarkerGoogleType.red));                //方便之后寻找到是第几个GMapMarker                       gMapOverlay.Markers[i].Tag = i;                    gMapOverlay.Id = "markroad";            }            //向控件中添加图层              gmap.Overlays.Add(gMapOverlay);        }

这里写图片描述

添加多边形
如果已经知道了多边形的各个点的经纬度坐标,我们可以通过如下方式在地图上添加多边形:

//在地图上画矩阵,知道矩阵上下左右(Lat_top、Lat_bottom、Lng_left、Lng_right)的4个点GMapOverlay polyOverlay = new GMapOverlay("polygons");            List<PointLatLng> points = new List<PointLatLng>();            //注意添加点的顺序            points.Add(new PointLatLng(Lat_top, Lng_left));                      points.Add(new PointLatLng(Lat_bottom, Lng_left));            points.Add(new PointLatLng(Lat_bottom, Lng_right));            points.Add(new PointLatLng(Lat_top, Lng_right));            GMapPolygon polygon = new GMapPolygon(points, "mypolygon");            //颜色            polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red));            polygon.Stroke = new Pen(Color.Red, 1);            polyOverlay.Polygons.Add(polygon);            gmap.Overlays.Add(polyOverlay);

这里写图片描述

1 0