精华内容
下载资源
问答
  • C#gmap开发资料

    2015-08-03 11:26:51
    C#gmap开发资料,有助于初步了解C#gmap开发资料的知识
  • gmap地图开发例子

    2015-11-30 16:46:34
    自己最近项目需求开始学习gmap地图开发,根据网上一些提示做了简单的google地图离线调用简单小例子,整个开发文档希望对初学者有所帮助。
  • C# GMap.net百度地图的在线地图和离线地图的的用法。 经严格反复的实验,可行可用。
  • GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在Windows Forms和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现路径规划、地理编码以及地图展示功能,并支持缓存和...

    一、概述

    • GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在Windows Forms和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现路径规划、地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中。

    二、步骤

    1、Visual Studio添加GMap引用

    • 右键工程->管理NuGet包->下载安装GMap.NET.WindowsForms
      在这里插入图片描述

    2、下载GMap Demo

    包含GMap源码以及地图下载器(用于生成GMDB格式离线地图文件)
    下载地址:https://archive.codeplex.com/?p=greatmaps
    在这里插入图片描述

    3、使用GMap Demo下载离线地图

    • (1)打开demo工程
      在这里插入图片描述
    • (2)启动demo,连接网络,选择地图类型,很多地图服务器是链接不上的,选一个能连接上的地图。
      在这里插入图片描述
      在这里插入图片描述
    • (3)按住alt,鼠标左键框选需要下载的地图
      在这里插入图片描述
      -(4)右侧菜单栏点击cache->Prefetch selected area,确定这个选定区域
      在这里插入图片描述
    • (5)会出现提示 是否截取Zoom级别为10的地图;点击“是”。这里是为了确定下载哪部分变焦的地图,选择“是”就会下载对应Zoom的地图内容,选择下载的Zoom越多,地图占用存储空间约大,根据需要选择,一般选择截取<15做个测试就够用了,否则下载时间会很长,不需要的选择“否”。
      在这里插入图片描述
      在这里插入图片描述
    • (6)点击cache->Export导出gmdb文件。
      在这里插入图片描述

    4、创建Winform程序导入地图

    • (1)右键重新生成一下解决方案,确保将Gmap的控件添加到工具箱了, 拖动控件GMapControl到Form1中

    在这里插入图片描述

    • (2)地图文件放在Debug文件夹中(或自定义路径)
      在这里插入图片描述
    • (3)添加代码,导入地图
      在这里插入图片描述
            private void Form1_Load(object sender, EventArgs e)
            {
                string mapPath = Application.StartupPath + "\\DataExp.gmdb";
                GMap.NET.GMaps.Instance.ImportFromGMDB(mapPath);
                gMapControl1.Manager.Mode = AccessMode.CacheOnly;//  ServerOnly,ServerAndCache设置从服务器和缓存中获取地图数据
                gMapControl1.MapProvider = GMapProviders.OpenCycleMap;//GMapProviders.GoogleChinaMap;   //谷歌中国地图         
                gMapControl1.MinZoom = 3;      //最小比例
                gMapControl1.MaxZoom = 18;     //最大比例
                gMapControl1.Zoom = 10;        //当前比例
                //this.gMapControl1.ShowCenter = false;//不显示中心十字标记
                this.gMapControl1.DragButton = System.Windows.Forms.MouseButtons.Left;//左键拖拽地图
                gMapControl1.MouseWheelZoomType = MouseWheelZoomType.MousePositionAndCenter;//鼠标缩放模式
                gMapControl1.Position = new PointLatLng(36.164822, 120.357477);//地图中心坐标
            }
    

    在这里插入图片描述

    5、Winform程序 在地图上画标记

    • 在地图上画东西,首先需要创建一个图层(函数中没有引用的,直接ALT+ENTER自动添加引用)
    public static GMapOverlay OverlayMarker;//放在全局使用
    
    OverlayMarker = new GMapOverlay("OverlayMarker"); //创建一个名为“OverlayMarker”的图层
    this.gMapControl1.Overlays.Add(OverlayMarker);
    
    • 绘制标记的函数
            public void DrawMarker(GMapOverlay overlay, double lat, double lng)
            {
                //创建一个名为“overlay”的图层
                //GMapOverlay overlay = new GMapOverlay("overlay");
    
                //创建标记,并设置位置及样式
                GMapMarker marker = new GMarkerGoogle(new PointLatLng(lat, lng), GMarkerGoogleType.blue_small);
                //将标记添加到图层
                overlay.Markers.Add(marker);
                //将图层添加到地图
                this.gMapControl1.Overlays.Add(overlay);
     
                //鼠标标记点提示框ToolTip
                marker.ToolTip = new GMapToolTip(marker);
                //Brush tooltipBackColor = new SolidBrush(Color.Transparent);//颜色获取,可用于填充背景
                marker.ToolTipText = "实时坐标";
                marker.ToolTip.Font = new Font("微软雅黑", 11);
                marker.ToolTip.Fill = new SolidBrush(Color.FromArgb(100, Color.Black));
                marker.ToolTip.Foreground = Brushes.White;
                marker.ToolTip.TextPadding = new Size(20, 20);
                //marker.ToolTipMode= MarkerTooltipMode.Always;//标注一直显示
                marker.ToolTip.Offset = new System.Drawing.Point(marker.Offset.X - (int)((float)marker.ToolTipText.Length / 2) * 15, marker.Offset.Y + 28);//显示位置
                
            }
    
    • 在控件中测试的函数
    		public static GMapOverlay OverlayMarker;//放在全局使用	
    		
            private void Form1_Load(object sender, EventArgs e)
            {
                string mapPath = Application.StartupPath + "\\DataExp.gmdb";
                GMap.NET.GMaps.Instance.ImportFromGMDB(mapPath);
                gMapControl1.Manager.Mode = AccessMode.CacheOnly;//  ServerOnly,ServerAndCache设置从服务器和缓存中获取地图数据
                gMapControl1.MapProvider = GMapProviders.OpenCycleMap;//GMapProviders.GoogleChinaMap;   //谷歌中国地图         
                gMapControl1.MinZoom = 3;      //最小比例
                gMapControl1.MaxZoom = 18;     //最大比例
                gMapControl1.Zoom = 10;        //当前比例
                //this.gMapControl1.ShowCenter = false;//不显示中心十字标记
                this.gMapControl1.DragButton = System.Windows.Forms.MouseButtons.Left;//左键拖拽地图
                gMapControl1.MouseWheelZoomType = MouseWheelZoomType.MousePositionAndCenter;//鼠标缩放模式
                gMapControl1.Position = new PointLatLng(36.164822, 120.357477);//地图中心坐标
    
                OverlayMarker = new GMapOverlay("OverlayMarker"); //创建一个名为“OverlayMarker”的图层
                this.gMapControl1.Overlays.Add(OverlayMarker);
    
                //添加标记
                DrawMarker(OverlayMarker, 36.164822, 120.357477);
            }
    

    在这里插入图片描述

    6、Winform程序 在地图上画多边形

    • 画多边形的函数
            public static void DrawPolygons(GMapOverlay overlay, double lat1, double lng1, double lat2, double lng2, double lat3, double lng3, double lat4, double lng4)
            {
                //GMapOverlay polygons = new GMapOverlay("polygons");
                // 多边形的顶点
                List<PointLatLng> points = new List<PointLatLng>();
                points.Add(new PointLatLng(lat1, lng1));
                points.Add(new PointLatLng(lat2, lng2));
                points.Add(new PointLatLng(lat3, lng3));
                points.Add(new PointLatLng(lat4, lng4));
    
                GMapPolygon polygon = new GMapPolygon(points, "名字");
                polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red));
                polygon.Stroke = new Pen(Color.Red, 1);
                overlay.Polygons.Add(polygon); 
            }
    
    • 测试代码
            public static GMapOverlay OverlayMarker;//放在全局使用
            private void Form1_Load(object sender, EventArgs e)
            {
                string mapPath = Application.StartupPath + "\\DataExp.gmdb";
                GMap.NET.GMaps.Instance.ImportFromGMDB(mapPath);
                gMapControl1.Manager.Mode = AccessMode.CacheOnly;//  ServerOnly,ServerAndCache设置从服务器和缓存中获取地图数据
                gMapControl1.MapProvider = GMapProviders.OpenCycleMap;//GMapProviders.GoogleChinaMap;   //谷歌中国地图         
                gMapControl1.MinZoom = 3;      //最小比例
                gMapControl1.MaxZoom = 18;     //最大比例
                gMapControl1.Zoom = 10;        //当前比例
                //this.gMapControl1.ShowCenter = false;//不显示中心十字标记
                this.gMapControl1.DragButton = System.Windows.Forms.MouseButtons.Left;//左键拖拽地图
                gMapControl1.MouseWheelZoomType = MouseWheelZoomType.MousePositionAndCenter;//鼠标缩放模式
                gMapControl1.Position = new PointLatLng(36.164822, 120.357477);//地图中心坐标
    
                OverlayMarker = new GMapOverlay("OverlayMarker"); //创建一个名为“OverlayMarker”的图层
                this.gMapControl1.Overlays.Add(OverlayMarker);
    
                //添加标记
                DrawMarker(OverlayMarker, 36.164822, 120.357477);
    
                //添加多边形
                DrawPolygons(OverlayMarker, 36.164822 + 0.01, 120.357477 + 0.01, 36.164822 + 0.01, 120.357477 + 0.02, 36.164822 + 0.02, 120.357477 + 0.01, 36.164822 + 0.03, 120.357477 + 0.03);
            }
    

    在这里插入图片描述

    7、Winform程序 在地图上画图片

    • 添加画图片的代码,准备一张“path.png”的图片放在debug文件中
            //添加标记图片
            public void DrawMarkerPicture(GMapOverlay overlay, double lat, double lng, string filename)
            {
                Bitmap bitmap = Bitmap.FromFile(filename) as Bitmap;
    
                //创建标记,并设置位置及样式
                GMapMarker marker = new GMarkerGoogle(new PointLatLng(lat, lng), bitmap);
                //将标记添加到图层
                overlay.Markers.Add(marker);
                //将图层添加到地图
                this.gMapControl1.Overlays.Add(overlay);
    
                //鼠标标记点提示框ToolTip
                marker.ToolTipText = "一张图片";
                marker.ToolTip.Fill = new SolidBrush(Color.FromArgb(100, Color.Black));
                marker.ToolTip.Foreground = Brushes.White;
                marker.ToolTip.TextPadding = new Size(20, 20);
            }
    
    • 测试代码
            public static GMapOverlay OverlayMarker;//放在全局使用
            private void Form1_Load(object sender, EventArgs e)
            {
                string mapPath = Application.StartupPath + "\\DataExp.gmdb";
                GMap.NET.GMaps.Instance.ImportFromGMDB(mapPath);
                gMapControl1.Manager.Mode = AccessMode.CacheOnly;//  ServerOnly,ServerAndCache设置从服务器和缓存中获取地图数据
                gMapControl1.MapProvider = GMapProviders.OpenCycleMap;//GMapProviders.GoogleChinaMap;   //谷歌中国地图         
                gMapControl1.MinZoom = 3;      //最小比例
                gMapControl1.MaxZoom = 18;     //最大比例
                gMapControl1.Zoom = 10;        //当前比例
                //this.gMapControl1.ShowCenter = false;//不显示中心十字标记
                this.gMapControl1.DragButton = System.Windows.Forms.MouseButtons.Left;//左键拖拽地图
                gMapControl1.MouseWheelZoomType = MouseWheelZoomType.MousePositionAndCenter;//鼠标缩放模式
                gMapControl1.Position = new PointLatLng(36.164822, 120.357477);//地图中心坐标
    
                OverlayMarker = new GMapOverlay("OverlayMarker"); //创建一个名为“OverlayMarker”的图层
                this.gMapControl1.Overlays.Add(OverlayMarker);
    
                //添加标记
                DrawMarker(OverlayMarker, 36.164822, 120.357477);
    
                //添加多边形
                DrawPolygons(OverlayMarker, 36.164822 + 0.01, 120.357477 + 0.01, 36.164822 + 0.01, 120.357477 + 0.02, 36.164822 + 0.02, 120.357477 + 0.01, 36.164822 + 0.03, 120.357477 + 0.03);
    
                //添加图片
                DrawMarkerPicture(OverlayMarker, 36.26282268, 120.24647712, Application.StartupPath + "\\path.png");
            }
    

    在这里插入图片描述

    8、Winform程序 在地图上利用路线层画个圆

    • 新创一个类添加到工程中,MyLatLng.class
      在这里插入图片描述
    • MyLatLng.class
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace WindowsFormsApp1
    {
        //自定义经纬度类
        public class MyLatLng
        {
            public double Rc = 6378137;     //赤道半径
            public double Rj = 6356725;     //极半径
            public double m_LoDeg, m_LoMin, m_LoSec;
            public double m_LaDeg, m_LaMin, m_LaSec;
            public double m_Longitude, m_Latitude;
            public double m_RadLo, m_RadLa;
            public double Ec;
            public double Ed;
            public MyLatLng(double longitude, double latitude)
            {
                m_LoDeg = (int)longitude;
                m_LoMin = (int)((longitude - m_LoDeg) * 60);
                m_LoSec = (longitude - m_LoDeg - m_LoMin / 60) * 3600;
    
                m_LaDeg = (int)latitude;
                m_LaMin = (int)((latitude - m_LaDeg) * 60);
                m_LaSec = (latitude - m_LaDeg - m_LaMin / 60) * 3600;
    
                m_Longitude = longitude;
                m_Latitude = latitude;
                m_RadLo = longitude * Math.PI / 180;
                m_RadLa = latitude * Math.PI / 180;
                Ec = Rj + (Rc - Rj) * (90 - m_Latitude) / 90;
                Ed = Ec * Math.Cos(m_RadLa);
            }
    
    
    
    
            private const double EARTH_RADIUS = 6378.137;//地球半径
            private static double rad(double d)
            {
                return d * Math.PI / 180.0;
            }
            //
            public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
            {
                double radLat1 = rad(lat1);
                double radLat2 = rad(lat2);
                double a = radLat1 - radLat2;
                double b = rad(lng1) - rad(lng2);
    
                double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
                 Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
                s = s * EARTH_RADIUS;
                s = Math.Round(s * 10000) / 10000;
                return s;
            }
    
    
            //度 转换成 弧度
            public static double DegreesToRadians(double degrees)
            {
                const double degToRadFactor = Math.PI / 180;
                return degrees * degToRadFactor;
            }
    
            //弧度 转换成 度
            public static double RadiansToDegrees(double radians)
            {
                const double radToDegFactor = 180 / Math.PI;
                return radians * radToDegFactor;
            }
    
            /**
             * 求圆点四周,距离圆点距离为指定半径的所有点位置(经纬度)
            * 求B点经纬度
            * @param A 已知点的经纬度,
            * @param distance   AB两地的距离  单位km
            * @param angle  AB连线与正北方向的夹角(0~360)
            * @return  B点的经纬度
            */
            public static MyLatLng getMyLatLng(MyLatLng A, double distance, double angle)
            {
                double dx = distance * 1000 * Math.Sin(DegreesToRadians(angle));
                double dy = distance * 1000 * Math.Cos(DegreesToRadians(angle));
    
                double bjd = (dx / A.Ed + A.m_RadLo) * 180 / Math.PI;
                double bwd = (dy / A.Ec + A.m_RadLa) * 180 / Math.PI;
                return new MyLatLng(bjd, bwd);
            }
    
        }
    }
    
    
    • 创建一个画圆函数
            //描述:以centerP为圆心,绘制半径为radius的圆
            //gMapControl:Gmap控制器		overlay:图层
            //centerP:圆心点	 radius:圆半径(单位: km)  name:路线id
            public static void DrawEllipse(GMapControl gMapControl, GMapOverlay overlay, PointLatLng centerP, double radius, string name,Color color)
            {
                try
                {
                    if (radius <= 0)
                        return;
    
                    List<PointLatLng> latLngs = new List<PointLatLng>();
                    MyLatLng centerLatLng = new MyLatLng(centerP.Lng, centerP.Lat);
    
                    // 0 - 360度 寻找半径为radius,圆心为centerP的圆上点的经纬度
                    for (int i = 0; i <= 360; i++)
                    {
                        //获取目标经纬度
                        MyLatLng tempLatLng = MyLatLng.getMyLatLng(centerLatLng, radius, i);
                        //将自定义的经纬度类 转换成 标准经纬度类
                        PointLatLng p = new PointLatLng(tempLatLng.m_Latitude, tempLatLng.m_Longitude);
                        latLngs.Add(p);
                    }
    
                    //安全性检查
                    if (latLngs.Count < 20)
                    {
                        return;
                    }
    
                    //通过绘制路线的方式绘制圆
                    GMapRoute route = new GMapRoute(latLngs, name);
                    if (route == null)
                    {
                        return;
                    }
                    route.Stroke = new Pen(color, 2.5f);
                    //route.Stroke.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;   //虚线
                    overlay.Routes.Add(route);
                }
                catch (Exception ex)
                {
                    //Dialog.Error(ex);
                }
            }
    
    • 测试代码
            public static GMapOverlay OverlayMarker;//放在全局使用
            private void Form1_Load(object sender, EventArgs e)
            {
                string mapPath = Application.StartupPath + "\\DataExp.gmdb";
                GMap.NET.GMaps.Instance.ImportFromGMDB(mapPath);
                gMapControl1.Manager.Mode = AccessMode.CacheOnly;//  ServerOnly,ServerAndCache设置从服务器和缓存中获取地图数据
                gMapControl1.MapProvider = GMapProviders.OpenCycleMap;//GMapProviders.GoogleChinaMap;   //谷歌中国地图         
                gMapControl1.MinZoom = 3;      //最小比例
                gMapControl1.MaxZoom = 18;     //最大比例
                gMapControl1.Zoom = 10;        //当前比例
                //this.gMapControl1.ShowCenter = false;//不显示中心十字标记
                this.gMapControl1.DragButton = System.Windows.Forms.MouseButtons.Left;//左键拖拽地图
                gMapControl1.MouseWheelZoomType = MouseWheelZoomType.MousePositionAndCenter;//鼠标缩放模式
                gMapControl1.Position = new PointLatLng(36.164822, 120.357477);//地图中心坐标
    
                OverlayMarker = new GMapOverlay("OverlayMarker"); //创建一个名为“OverlayMarker”的图层
                this.gMapControl1.Overlays.Add(OverlayMarker);
    
                //添加标记
                DrawMarker(OverlayMarker, 36.164822, 120.357477);
    
                //添加多边形
                DrawPolygons(OverlayMarker, 36.164822 + 0.01, 120.357477 + 0.01, 36.164822 + 0.01, 120.357477 + 0.02, 36.164822 + 0.02, 120.357477 + 0.01, 36.164822 + 0.03, 120.357477 + 0.03);
    
                //添加图片
                DrawMarkerPicture(OverlayMarker, 36.064822, 120.357477, Application.StartupPath + "\\path.png");
    
                //添加圆形
                PointLatLng LatLng = new PointLatLng(36.164822, 120.357477);
                DrawEllipse(this.gMapControl1, OverlayMarker, LatLng, 1.2, "123",Color.Red);
            }
    

    在这里插入图片描述

    9、Winform程序 清除标记、多边形、图片

            //清除图层标记
            public static void ClearMarkers(GMapOverlay overlay)//参数:图层
            {
                overlay.Markers.Clear();
            }
    
            //清除图层路线
            public static void ClearRoutes(GMapOverlay overlay)//参数:图层
            {
                overlay.Routes.Clear();
            }
    
            //清除图层多边形
            public static void ClearPolygons(GMapOverlay overlay)//参数:图层
            {
                overlay.Polygons.Clear();
            }
    

    10、Winform程序 鼠标移动获取经纬度

    在这里插入图片描述

    • 添加事件的代码
            //鼠标移过gMapControl1后发生的事件
            private void gMapControl1_MouseMove(object sender, MouseEventArgs e)
            {
                    PointLatLng point = gMapControl1.FromLocalToLatLng(e.Location.X, e.Location.Y);//获取鼠标位置(FromLocalToLatLng是将数值转换成坐标  )
                    StatusLabel_x.Text = point.Lat.ToString("0.000000");
                    StatusLabel_y.Text = point.Lng.ToString("0.000000");
            }
    

    在这里插入图片描述

    11、根据需开发中可能使用的函数

    • (1)计算两点直间的距离
            private const double EARTH_RADIUS = 6378137;//地球半径m
            private static double rad(double d)
            {
                return d * Math.PI / 180.0;
            }
            //
            public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
            {
                double radLat1 = rad(lat1);
                double radLat2 = rad(lat2);
                double a = radLat1 - radLat2;
                double b = rad(lng1) - rad(lng2);
    
                double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
                 Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
                s = s * EARTH_RADIUS;
                //s = Math.Round(s * 10000) / 10000;
                return s;
            }
    
            //计算与中心点的距离
            public void DistanceToCenter(double lat1, double lng1, double lat2, double lng2)
            {
                double latdiffer = 0;//纬度差
                double lngdiffer = 0;//经度差
                double latDifferDistance = 0;   //纬度实际距离差米
                double lngDifferDistance = 0;   //经度实际距离差米
    
                //计算出纬度经度差
                latdiffer = lat2 - lat1;
                lngdiffer = lng2 - lng1;
                //根据纬度经度差算出实际的距离差
                latDifferDistance = latdiffer * 111000;    //在经线上纬度差1度对应的实际距离是111千米
                lngDifferDistance = lngdiffer * 111000 * Math.Cos(lat1 / 180 * Math.PI);//在除赤道外的其他纬线上,经度差1度对应的实际距离是111*cos纬度。C#中Match.Cos(度数 / 180 * Math.PI),括号内是弧度,因此与角度换算
                label10.Text = latDifferDistance.ToString("0.000") + "m";//横向距离
                label11.Text = lngDifferDistance.ToString("0.000") + "m";//纵向距离
                label14.Text = MyLatLng.GetDistance(lat1, lng1, lat2, lng2).ToString("0.000") + "m";//计算两点之间的直线距离
    
            }
    
    • (2)坐标“度.分”格式转换为“度.度”格式
            //模块输出的是“度.分”格式   经度 11324.420920 纬度:2303.006850,需用下面函数转换成“度.度”格式
            double DegreeConvert(double sDegree)
            {
                double dDegree;
                if (sDegree == 0) return 0;
                int integer = (int)sDegree;
                double decimal1 = sDegree - (int)sDegree;
                double min = integer % 100;
                int hour = (int)(integer / 100);
                dDegree = (double)hour + (double)(min / 60) + (double)(decimal1 / 60);
                return dDegree;
            }
    

    12、注意

    • 例程中使用的坐标是WGS84坐标,如转成国内高德或者百度地图,注意坐标转换。

    例程连接:https://download.csdn.net/download/Davidysw/18936123

    展开全文
  • GMap.NET是一个强大的免费开源.NET组件。该组件允许用户加载Google、雅虎、必应、街景等地图。用户可以在这些地图上进行点的标记、路线规划、区域操作。GMap.NET应用于Windows Forms和Presentation,并且支持缓存和...

        GMap.NET是一个强大的免费开源.NET组件。该组件允许用户加载Google、雅虎、必应、街景等地图。用户可以在这些地图上进行点的标记、路线规划、区域操作。GMap.NET应用于Windows Forms和Presentation,并且支持缓存和在线两种模式。

        GMap.NET项目下载地址:http://greatmaps.codeplex.com/

    1.1 地图的结构

        GMap地图的结构分为三层,分别为mapcontrol、overlay和marker。弄清这三者之间的关系是用好GMap的基础。

        mapcontrol是地图的背景,显示了如地形、街道等基本信息。

        overlay是在mapcontrol之上的一个图层,overlay包含route和mark等。

        mark是一个overlay上的点,每个点标注了一个明确的地理位置(纬度,经度)。

        route是两个或多个点之间的路径或方向。

        地图结构如图1所示。

    图1 GMap的结构

    1.2 在项目中添加GMap组件

        在.NET项目中添加GMap组件需要通过添加引用和添加组件两个步骤,在应用的过程中需要添加GMap的引用。

        

     

    经过以上步骤之后,进行简单的地图设置:

            //初始化地图类型
            public void InitialMap(GMapControl gMap)
            {
                gMap.MapProvider = GMapProviders.BingSatelliteMap;
            }

    运行程序,结果如下

     

        现在为止,向项目挂载地图已经实现了,接下来就是基于GMap.NET的地图应用程序功能开发。

    转载于:https://www.cnblogs.com/oen8080/p/4875871.html

    展开全文
  • WPF使用GMap.net框架开发地图应用

    千次阅读 2019-11-14 22:10:15
    GMap.NET有两个版本,分别是WinForm和WPF的版本,WinForm版本的教程很多。这次主要介绍的WPF版本的操作。 要下载GMap.NET请点击这里,这个最好下载下来,可以参考里面的Demo来学习。下载下来后,用visual studio打开...

    GMap.NET有两个版本,分别是WinForm和WPF的版本,WinForm版本的教程很多。这次主要介绍的WPF版本的操作。

    要下载GMap.NET请点击这里,这个最好下载下来,可以参考里面的Demo来学习。下载下来后,用visual studio打开SourceCode里面的sln文件。打开的时候可能需要让你下载什么东西,这个有点不记得了,但是关于数据库的那个应该不用下载。

    1、导入dll

    1-1、第一种方法
    按照下图打开NuGet包管理器,然后输入Gmap.net进行搜索,点击想要安装的dll,然后选择项目,点击安装即可。
    在这里插入图片描述
    在这里插入图片描述
    1-2、第二种方法
    这种方法就是运行下载下来的源代码,然后再拷贝Debug下面生成的dll文件。这样的做法更加灵活,可以自己更改代码。

    2、导入GMapControl控件

    2-1、再工具箱空白处右键“选项”然后选中GMapControl,点击确定。即可在工具箱中使用GMapControl控件。
    在这里插入图片描述

    3、导入高德地图

    高德的地图和google地图使用的坐标一致,可以切换使用,但是据说百度的又增加了偏移。
    3-1、普通地图

    using GMap.NET;
    using GMap.NET.MapProviders;
    using GMap.NET.Projections;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace jiemian3.CustomMap
    {
        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}";
        }
    }
    

    3-2、高德卫星地图,但是高德卫星地图(官网的地图)的数据不完整

    using GMap.NET;
    using GMap.NET.MapProviders;
    using GMap.NET.Projections;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace jiemian3.CustomMap
    {
        public class AMapSateliteProvider : AMapProviderBase
        {
            private readonly Guid id = new Guid("FCA94AF4-3467-47c6-BDA2-6F52E4A145BC");
            public static readonly AMapSateliteProvider Instance = new AMapSateliteProvider();
            //private readonly string name = Resources.Strings.AMapSatellite;
            private readonly string name = "AMapSatellite";
            private static readonly string UrlFormat = "http://webst04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=6";
    
            public override PureImage GetTileImage(GPoint pos, int zoom)
            {
                string url = this.MakeTileImageUrl(pos, zoom, GMapProvider.LanguageStr);
                return base.GetTileImageUsingHttp(url);
            }
    
            private string MakeTileImageUrl(GPoint pos, int zoom, string language)
            {
                string str = string.Format(UrlFormat, pos.X, pos.Y, zoom);
                Console.WriteLine("url:" + str);
                return str;
            }
    
            public override Guid Id
            {
                get
                {
                    return this.id;
                }
            }
    
            public override string Name
            {
                get
                {
                    return this.name;
                }
            }
        }
    }
    
    4、自定义Marker

    winform版的自己GMap提供了第三方的marker,但是WPF的需要自己写。可以参考源代码项目中Demo目录下面的“Demo.WindowsPresentation”,WPF所有的代码都可以参考这个Demo。我直接把“Demo.WindowsPresentation”里面对应的代码粘贴到下面。

    因为这些代码再一个单独的文件夹下面,所以注意命名空间和路径,自己做调整。
    CustomMarkerRed.xaml

    <UserControl
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	x:Class="Demo.WindowsPresentation.CustomMarkers.CustomMarkerRed"
    	Height="40" Width="30" Opacity="10">
    		<Image Name="icon" Source="red-dot.png" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </UserControl>
    

    CustomMarkerRed.xaml.cs

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Controls.Primitives;
    using System.Windows.Input;
    using System.Windows.Media;
    using GMap.NET.WindowsPresentation;
    
    namespace Demo.WindowsPresentation.CustomMarkers
    {
       /// <summary>
       /// Interaction logic for CustomMarkerDemo.xaml
       /// </summary>
       public partial class CustomMarkerRed
       {
          Popup Popup;
          Label Label;
          GMapMarker Marker;
          MainWindow MainWindow;
    
          public CustomMarkerRed(MainWindow window, GMapMarker marker, string title)
          {
             this.InitializeComponent();
    
             this.MainWindow = window;
             this.Marker = marker;
    
             Popup = new Popup();
             Label = new Label();
    
             this.Loaded += new RoutedEventHandler(CustomMarkerDemo_Loaded);
             this.SizeChanged += new SizeChangedEventHandler(CustomMarkerDemo_SizeChanged);
             this.MouseEnter += new MouseEventHandler(MarkerControl_MouseEnter);
             this.MouseLeave += new MouseEventHandler(MarkerControl_MouseLeave);
             this.MouseMove += new MouseEventHandler(CustomMarkerDemo_MouseMove);
             this.MouseLeftButtonUp += new MouseButtonEventHandler(CustomMarkerDemo_MouseLeftButtonUp);
             this.MouseLeftButtonDown += new MouseButtonEventHandler(CustomMarkerDemo_MouseLeftButtonDown);
    
             Popup.Placement = PlacementMode.Mouse;
             {
                Label.Background = Brushes.Blue;
                Label.Foreground = Brushes.White;
                Label.BorderBrush = Brushes.WhiteSmoke;
                Label.BorderThickness = new Thickness(2);
                Label.Padding = new Thickness(5);
                Label.FontSize = 22;
                Label.Content = title;
             }
             Popup.Child = Label;
          }
    
          void CustomMarkerDemo_Loaded(object sender, RoutedEventArgs e)
          {
             if(icon.Source.CanFreeze)
             {
                icon.Source.Freeze();
             }
          }
    
          void CustomMarkerDemo_SizeChanged(object sender, SizeChangedEventArgs e)
          {
             Marker.Offset = new Point(-e.NewSize.Width/2, -e.NewSize.Height);
          }
    
          void CustomMarkerDemo_MouseMove(object sender, MouseEventArgs e)
          {
             if(e.LeftButton == MouseButtonState.Pressed && IsMouseCaptured)
             {
                Point p = e.GetPosition(MainWindow.MainMap);
                Marker.Position = MainWindow.MainMap.FromLocalToLatLng((int) p.X, (int) p.Y);
             }
          }
    
          void CustomMarkerDemo_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
          {
             if(!IsMouseCaptured)
             {
                Mouse.Capture(this);
             }
          }
    
          void CustomMarkerDemo_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
          {
             if(IsMouseCaptured)
             {
                Mouse.Capture(null);
             }
          }
    
          void MarkerControl_MouseLeave(object sender, MouseEventArgs e)
          {
             Marker.ZIndex -= 10000;
             Popup.IsOpen = false;
          }
    
          void MarkerControl_MouseEnter(object sender, MouseEventArgs e)
          {
             Marker.ZIndex += 10000;
             Popup.IsOpen = true;
          }
       }
    }
    

    在主界面中使用

    currentMarker = new GMapMarker(MainMap.Position);
    {
       currentMarker.Shape = new CustomMarkerRed(this, currentMarker, "custom position marker");
       currentMarker.Offset = new System.Windows.Point(-15, -15);
       currentMarker.ZIndex = int.MaxValue;
       MainMap.Markers.Add(currentMarker);
    }
    

    图片如下:
    标记

    5、绘制多边形

    下面只公布部分代码和思想,如果有不懂的可以提问。有些不方面提供。
    5-1、多边形
    使用dll中提供的GMapPolygon类。

    List<PointLatLng> points = new List<PointLatLng>();
    //在这块添加一些points
    GMapPolygon polygon = new GMapPolygon(points);
    
    polygon.ZIndex = 10; //设置Zindex,显示的优先级(层)
    polygon.RegenerateShape(gmap); //gmap就是地图控件
    //下面这个比较重要,是设置样式。
    (polygon.Shape as Path).Stroke = Brushes.GreenYellow;
    (polygon.Shape as Path).StrokeThickness = 5;
    (polygon.Shape as Path).Effect = null;
    gmap.Markers.Add(polygon);
    

    5-2、折线(路径)
    使用GMapRoute类,基本和上面的一样。

    List<PointLatLng> points = new List<PointLatLng>();
    //在这块添加一些points
    GMapRoute route = new GMapRoute(points);//
    route.ZIndex = 10;
    route.RegenerateShape(gmap);
    (route.Shape as Path).Stroke = Brushes.Blue;
    (route.Shape as Path).StrokeThickness = 5;
    (route.Shape as Path).Effect = null;
    gmap.Markers.Add(route);
    

    5-3、根据鼠标画矩形
    这个需要自己写一些鼠标事件。这个自己发挥吧,代码有点乱,自己思考也不难。因为一些原因,这部分代码不能全部公布,多多理解。
    下面的代码是画矩形的,只是没有鼠标事件的代码。已经很接近了。

    PointLatLng startpoint = mainmarker.Position;
          List<PointLatLng> list_points = new List<PointLatLng>();
         
          if (startpoint.Lat > current_point.Lat)
          {
              if (startpoint.Lng < current_point.Lng)
              {
                  //右下
                  list_points.Add(startpoint);
                  list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));
                  list_points.Add(current_point);
                  list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));
              }
              else
              {
                  //左下
                  list_points.Add(startpoint);
                  list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));
                  list_points.Add(current_point);
                  list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));
              }
          }
          else
          {
              if (startpoint.Lng < current_point.Lng)
              {
                  //右上
                  list_points.Add(startpoint);
                  list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));
                  list_points.Add(current_point);
                  list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));
              }
              else
              {
                  //左上
                  list_points.Add(startpoint);
                  list_points.Add(new PointLatLng(current_point.Lat, startpoint.Lng));
                  list_points.Add(current_point);
                  list_points.Add(new PointLatLng(startpoint.Lat, current_point.Lng));
              }
          }
          double lat = (startpoint.Lat+current_point.Lat) / 2;
          double lng = (startpoint.Lng + current_point.Lng) / 2;
          double heightlat = Math.Abs(current_point.Lat-startpoint.Lat);
          double widthlng = Math.Abs(current_point.Lng-startpoint.Lng);
          rectLatLng = RectLatLng.FromLTRB(startpoint.Lng,startpoint.Lat,current_point.Lng,current_point.Lat);
    
          rectangle = new GMapPolygon(list_points);
          rectangle.ZIndex = Rectangle_index;
          rectangle.RegenerateShape(gmap);
          (rectangle.Shape as Path).Stroke = Brushes.GreenYellow;
          (rectangle.Shape as Path).StrokeThickness = 5;
          (rectangle.Shape as Path).Effect = null;
    
          gmap.Markers.Add(rectangle);
    

    5-4、根据鼠标画圆形
    上面的矩形还好是GMAP自己控件画的,但是圆形没有,也不能根据点画,因为有无数个点。最主要的是画的圆形要能够更具地图缩放。这部分还是参考Demo中的代码。思路是:使用一个XMAL控件,里面是一个圆,设置属性是填充的,然后改变边框即可改变圆的大小。首先根据鼠标移动位置和中心点的经纬度坐标转化成界面坐标,然后计算半径,画圆。
    Circle.xaml

    <UserControl x:Class="Demo.WindowsPresentation.CustomMarkers.Circle"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300" Background="Transparent">
        <Grid>
            <Ellipse Stroke="Red" Fill="AliceBlue" Opacity="0.44" />
        </Grid>
    </UserControl>
    

    Circle.xaml.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using GMap.NET;
    
    namespace Demo.WindowsPresentation.CustomMarkers
    {
       /// <summary>
       /// Interaction logic for Circle.xaml
       /// </summary>
       public partial class Circle : UserControl
       {
          public Circle()
          {
             InitializeComponent();
          }
    
          public PointLatLng Center;
          public PointLatLng Bound;
       }
    }
    

    画圆的代码

    PointLatLng center = mainmarker.Position;
    circle = new GMapMarker(center);
    circle_shape = new Circle();
    circle_shape.Center = center;
    circle_shape.Bound = current_point;
    circle_shape.Tag = circle;
    circle_shape.IsHitTestVisible = false;
    UpdateCircle(circle_shape);//下面的代码
    circle.Shape = circle_shape;
    circle.ZIndex = Circle_index;
    gmap.Markers.Add(circle);
    

    更新圆的大小的代码,这块每次在地图加载的时候调用就可以让圆不断变化大小。

     private void UpdateCircle(Circle c)
     {
         var pxCenter = gmap.FromLatLngToLocal(c.Center);
         var pxBounds = gmap.FromLatLngToLocal(c.Bound);
         Console.WriteLine(pxCenter + "            " + pxBounds);
         double a = (double)(pxBounds.X - pxCenter.X);
         double b = (double)(pxBounds.Y - pxCenter.Y);
         //半径
         var pxCircleRadius = Math.Sqrt(a * a + b * b);
         Console.WriteLine("半径为:" + pxCircleRadius);
         c.Width = pxCircleRadius * 2;
         c.Height = pxCircleRadius * 2;
         (c.Tag as GMapMarker).Offset = new System.Windows.Point(-c.Width / 2, -c.Height / 2);
     }
    
    6、Zindex

    WPF中没有GMapOverlay,但是可以使用Zindex来设置虚拟的。Zindex越大的显示就越靠上。

    展开全文
  • 主要介绍了GMap中Marker的使用方法,有需要的朋友可以参考一下
  • 关于GMAP开发

    2014-11-05 16:15:38
    出自:http://www.cnblogs.com/wuhuacong/archive/2010/03/10/1681790.html
    展开全文
  • GMAP平台开发宝典

    2011-07-26 20:59:53
    GMAP平台宝典》已由平台开发部整理完成。宝典分为“部件描述指南”、“平台编程接口”、“平台数据字典”、“打印”、“工作流”、“消息通讯”、“开发常见问题”、“实施常见问题”等8部分,每一部分都又有下一...
  • 基于gmap和百度地图API开发的GIS应用支持定位查询,放大缩小,平移,抓取等功能基于gmap和百度地图API开发的GIS应用支持定位查询,放大缩小,平移,抓取等功能
  • Gmap.net百度地图开发

    千次阅读 2016-03-30 14:53:36
    找了很多资料,最终决定用gmap.net开发,不过选用百度,这里可能会考虑到很多东西,比如说纠偏等问题。因为当初我找资料找的比较辛苦,所以分享出来。就这篇博客技术上如果有任何问题,请各位指正,谢谢。
  • 目录添加GMap引用下载GMap demo尝试一个测试程序下载离线地图使用离线模式读取地图加载高德地图获取WMTS坐标系转化GMap常用地图操作自建地图服务器 添加GMap引用 下载GMap demo 包含GMap源码以及地图下载器(用于...
  • VS2017环境下GMap的学习及开发(二)

    千次阅读 2018-10-25 09:48:30
    在GMapcontrol控件中显示地图 ...using GMap.NET.MapProviders; 在public Form1() 函数中加入 public Form1() { InitializeComponent(); ///gMapControl1 为GMapcontrol控件的变量 ...
  • 在做项目demo中使用到了Gmap,但默认的marker不能满足需求,所以需要自定义的marker: 1、默认的marker:js代码 [code="java"] // 名称转换为经纬度的工具类 var geocoder = null; // 地图对象 var ...
  • 主要功能: 1.规范地图文件txt格式-在地图控件上显示 2.切换地图源 3.自定义地图图标 4.自定义线路颜色、图标 5.自适应屏幕
  • 本教程在VS中,使用C#进行开发GMap.NET的下载 使用GMap.NET控件需要两个核心库,下载地址:https://download.csdn.net/download/qq_43474959/12511587 得到以下两个库 在Visual Studio的WinForms窗体程序中添加...
  • wpf中关于Gmap.net地图的开发 里面有怎么添加自定义标注 有google bingmap
  • 1.下载基于GMap.NET控件的WindowsForms程序的实例,可以直接引用这些dll文件编写地图应用软件。  我们所要用到其中的三个文件:   GMap.Net.Core.dll  GMap.Net.WindowsForms.dll  Demo.WindowsForms.exe(生成...
  • 使用第三方Gmap.net开发Google Map搜索,路线规划,多点地图等。 我用的是Gmap.net v1.7 https://greatmaps.codeplex.com/
  • 基于GMap.Net的地图解决方案

    千次阅读 2018-09-30 10:41:52
    GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件 GMap.Net是.Net下一个地图控件,可以基于Http协议加载各个公司的地图,如Google,Bing,ArcGIS的,主要原理是通过解析各个公司的地图服务的URL,传入相应的...
  • Gmap开发心的

    2009-01-18 19:08:00
    1.在地图添加图层必须在setCenter之后2.在回调函数中this是地图对象
  • C# Winform开发使用离线地图 GMap 基础例程,包括导入离线地图,地图图层绘制标点、多边形、圆、图片、鼠标移动显示坐标经纬度等。
  • GMAP离线地图下载

    2017-09-14 10:50:59
    GMAP离线地图下载,支持谷歌、百度、高德、腾讯,支持行政区域与自定义下载,Zoom级别可以自定义设置,主要便于C#GMAP开发离线地图做参考,尤其是根据行政区域下载。
  • Gmap.net 源码

    2020-03-26 23:06:17
    Gmap.net 官网下载的源码,顺利通过了编译,运行顺畅。GMap.net支持多种在线地图,适合在winform中做地图的二次开发,或者做地图下载器。
  • GMap.NET源码实例V1.7.5

    2017-10-16 17:32:50
    GMap.NET 是一个.NET开源控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现寻找路径、地理编码以及地图展示功能。与Google地图不同的是,该项目是基于...
  • Gmap-for-Android 在Android中显示谷歌地图 在 Android 开发者工具中打开项目 创建 Android 密钥:转到 -> 创建新项目或使用现有项目。 在左侧栏上,转到 Identier -> 创建密钥 -> Android 密钥 -> 过去 SHA1 指纹...
  • 我们先看看GMap.NET的定义: GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, Op

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,487
精华内容 594
关键字:

gmap开发