C# Gmap.net控件的使用

1,首先要先添加引用Gmap.net的动态链接库.dll文件

2,初始化地图信息

     public void MapShow()
        {

            try
            {
                System.Net.IPHostEntry ela = System.Net.Dns.GetHostEntry("www.google.com.hk");
            }
            catch
            {
                gMap_control.Manager.Mode = AccessMode.ServerAndCache;
                MessageBox.Show("No internet connection avaible, going to CacheOnly mode.",
                                "GMap.NET Demo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            gMap_control.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //缓存位置
            MyInvoke my = new MyInvoke(Init);
            this.BeginInvoke(my);
        }
     public delegate void MyInvoke();
        public void Init()
        {

            gMap_control.MinZoom = 4;  //最小比例
            gMap_control.MaxZoom = 22; //最大比例
            gMap_control.Zoom = 4;
            gMap_control.DragButton = System.Windows.Forms.MouseButtons.Left; //左键拖拽地图

            gMap_control.Position = new PointLatLng(32.064, 118.704); //地图中心位置:南京

        }
    gMap_control.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图
        new Thread(MapShow).Start();

3,添加一个market

     GMapOverlay MyMarkss = new GMapOverlay(this.gMap_control, "MyMarkss");
        GMapMarkerGoogleGreen gn = new GMapMarkerGoogleGreen(gMap_control.Position);
        MyMarkss.Markers.Add(gn);

        this.gMap_control.Overlays.Add(MyMarkss);
        gn.ToolTipMode = MarkerTooltipMode.Always;
        gn.ToolTipText = "提示信息"

4,添加一个自定义的market

class GMapMarkerDirection : GMapMarker
    {
        public float Ang;

        private Image image;
        public Image Image
        {
            get
            {
                return image;
            }
            set
            {
                image = value;
                if (image != null)
                {
                    this.Size = new Size(image.Width, image.Height);
                }
            }
        }

        public GMapMarkerDirection(PointLatLng p, Image image, float angle)
            : base(p)
        {

            Ang = angle - 90;
            if (Ang > 360)
            {
                Ang -= 360;
            }
            if (Ang < 0)
            {
                Ang += 360;
            }
            Image = image;
            Size = new System.Drawing.Size(image.Width, image.Height);
            Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height / 2);
        }

        public override void OnRender(Graphics g)
        {

            g.DrawImageUnscaled(RotateImage(Image, Ang), LocalPosition.X, LocalPosition.Y);
        }

        private Bitmap RotateImage(Image image, float angle)
        {
            if (image == null)
                throw new ArgumentNullException("image");

            const double pi2 = Math.PI / 2.0;
            double oldWidth = (double)image.Width;
            double oldHeight = (double)image.Height;
            double theta = ((double)angle) * Math.PI / 180.0;
            double locked_theta = theta;

            while (locked_theta < 0.0)
                locked_theta += 2 * Math.PI;

            double newWidth, newHeight;
            int nWidth, nHeight;

            #region Explaination of the calculations
            #endregion

            double adjacentTop, oppositeTop;
            double adjacentBottom, oppositeBottom;
            if ((locked_theta >= 0.0 && locked_theta < pi2) ||
                (locked_theta >= Math.PI && locked_theta < (Math.PI + pi2)))
            {
                adjacentTop = Math.Abs(Math.Cos(locked_theta)) * oldWidth;
                oppositeTop = Math.Abs(Math.Sin(locked_theta)) * oldWidth;

                adjacentBottom = Math.Abs(Math.Cos(locked_theta)) * oldHeight;
                oppositeBottom = Math.Abs(Math.Sin(locked_theta)) * oldHeight;
            }
            else
            {
                adjacentTop = Math.Abs(Math.Sin(locked_theta)) * oldHeight;
                oppositeTop = Math.Abs(Math.Cos(locked_theta)) * oldHeight;

                adjacentBottom = Math.Abs(Math.Sin(locked_theta)) * oldWidth;
                oppositeBottom = Math.Abs(Math.Cos(locked_theta)) * oldWidth;
            }

            newWidth = adjacentTop + oppositeBottom;
            newHeight = adjacentBottom + oppositeTop;

            nWidth = (int)Math.Ceiling(newWidth);
            nHeight = (int)Math.Ceiling(newHeight);

            Bitmap rotatedBmp = new Bitmap(nWidth, nHeight);

            using (Graphics g = Graphics.FromImage(rotatedBmp))
            {

                Point[] points;

                if (locked_theta >= 0.0 && locked_theta < pi2)
                {
                    points = new Point[] {
                                             new Point( (int) oppositeBottom, 0 ),
                                             new Point( nWidth, (int) oppositeTop ),
                                             new Point( 0, (int) adjacentBottom )
                                         };

                }
                else if (locked_theta >= pi2 && locked_theta < Math.PI)
                {
                    points = new Point[] {
                                             new Point( nWidth, (int) oppositeTop ),
                                             new Point( (int) adjacentTop, nHeight ),
                                             new Point( (int) oppositeBottom, 0 )
                                         };
                }
                else if (locked_theta >= Math.PI && locked_theta < (Math.PI + pi2))
                {
                    points = new Point[] {
                                             new Point( (int) adjacentTop, nHeight ),
                                             new Point( 0, (int) adjacentBottom ),
                                             new Point( nWidth, (int) oppositeTop )
                                         };
                }
                else
                {
                    points = new Point[] {
                                             new Point( 0, (int) adjacentBottom ),
                                             new Point( (int) oppositeBottom, 0 ),
                                             new Point( (int) adjacentTop, nHeight )
                                         };
                }

                g.DrawImage(image, points);
            }

            return rotatedBmp;
        }

    }
    Image image = Image.FromFile(Application.StartupPath + "\\markert.png");
    //location是坐标,image是market图片,max是旋转角度
    GMapMarkerDirection MyMarkss = new GMapMarkerDirection(location, image, max);
        GMapMarkerGoogleGreen gn = new GMapMarkerGoogleGreen(gMap_control.Position);
        MyMarkss.Markers.Add(gn);

        this.gMap_control.Overlays.Add(MyMarkss);
        gn.ToolTipMode = MarkerTooltipMode.Always;
        gn.ToolTipText = "提示信息"

5,在两点之间画线

    PointLatLng star = new PointLatLng();
    PointLatLng end= new PointLatLng();
    List<PointLatLng> list = new List<PointLatLng>();
    list.Add(star);
    list.Add(end);
    GMapOverlay routes = new GMapOverlay(this.gMap_control, "routes");
    this.gMap_control.Overlays.Add(routes);//添加到图层列表中
    GMapRoute route = new GMapRoute(list, "action");
    routes.Routes.Add(route);

6,计算A点在B点的方向

    double angleOfLine = Math.Atan2((end.Lng - star.Lng), (end.Lat - star.Lat)) * 180 / Math.PI;
        int max = (int)angleOfLine;
        if (max > 360)
        {
           max -= 360;
        }
        if (max < 0)
        {
           max += 360;
        }
时间: 2024-10-28 13:38:15

C# Gmap.net控件的使用的相关文章

GMAP.NET控件画圆

关于GMAP.NET地图控件在地图上操作的例子很多,但是关于画圆形的描述很少,我找到了GMAP官方的例子并在此基础上进行了部分的改动,实现了对GMAP地图控件的画圆操作. 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Drawing; 7 using System

WPF控件到图片的转换

在实际的项目开发中,经常需要将信息保存成图片的形式,如屏幕截图.地图快照等操作,我中最近一个项目中便有这样的需求,项目(WPF)中用到GMap.NET控件,中地图上展示一些信息,过程中可能用户需要将地图信息保存下来,也就是地图快照,我的界面如下所示: 网上查了GMap相关的资料,没有找到GMap怎么截图的方法,最后找到网友提供的方法:将WPF控件转换成图片. 具体实现如下: namespace QACDR2.Common { internal enum ImageType { Bmp, Gif,

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

前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 我们以Google地图为例,这章介绍下地图加载的原理. 投影(Projection) 谷歌地图采用的是墨卡托投影法,这里转载(http://www.cnblogs.com/willwayer/archive/2010/06/11/1756446.html) 下墨卡托投影的定义:墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地

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

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

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

GMAP.NET支持了Google, Bing, Ovi, Openstreetmap, Yahoo,GIS等多种地图,但国内的地图支持得比较少. 不过没有关系,我们可以为GMAP.NET添加百度地图的支持,只要了解了地图加载的原理,就很容易集成进来, 最重要的是,它是支持离线的,也就是说利用GMAP.NET,我们可以制作各种离线地图供我们桌面应用程序使用, 这也是我为什么称之为最强地图控件的原因. 如何在你的程序中使用GMAP.NET百度地图 整个代码已经提交到 http://ypmap.go

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

前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百度地图. 深入理解最强桌面地图控件GMAP.NET --- 初识 深入理解最强桌面地图控件GMAP.NET --- 初用 深入理解最强桌面地图控件GMAP.NET --- 百度地图 虽然地图在国内用得最多的是谷歌和百度,但任何互联网产品都绕不过“腾讯”, 这一章就介绍如何在GMAP.NET中支持搜搜地图. 如何在你的程序中使用GMAP.NET SOSO地图 国内的地图都差不多,我觉得做得最好的是高德,下一篇会结合理论章节讲讲为什么,至少

(转)深入理解最强桌面地图控件GMAP.NET ---搜狗(sougou地图)

这应该是我集成国内地图的最后一篇了,以后如果有精力会继续分析Google地图,Bing地图,Yahoo地图,Ovi地图. 同时,会尽快将离线地图的使用以及数据存储部分分享出来. 前面的相关文章链接: 深入理解最强桌面地图控件GMAP.NET --- 原理篇 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 深入理解最强桌面地图控件GMAP.NET --- 初用 深入理解最强桌面地图控件GMAP.NET --- 初识 如何在

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

这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很多政府项目.保密项目.或者由于种种原因不能上网的项目的需求. 本章主要分成三个方面介绍:演示.生成离线地图.Demo代码. 一.演示 地图显示 地图缩放后还可以显示 网络是断了的 二.生成离线地图 前面已经演示了Demo,这个部分说如何生成离线地图,也就是Data.gmdb.GMAP.NET提供了集中缓存方式,MySQL,SQLLite,MSSQL,Postgre等等, 默认是使用SQLLite的,这部分以后再分析. 1. 启

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

最进做项目要涉及到地图开发有关的知识,看到了很好的一篇博文,和大家分享下. 我们先看看GMap.NET的定义: GMap.NET是一个强大.免费.跨平台.开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现寻找路径.地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中. GMap.NET是一个开源的GEO地图定位和跟踪程序.就像谷歌地图.雅虎地