GMap —— 绘制点集

来源:互联网 发布:离线看书软件 编辑:程序博客网 时间:2024/06/05 10:38

将在地图上用鼠标左键点击的点绘制出来(两点之间用直线连接),并且能够随地图一起实现等比例缩放和拖拽。

GMap主要涉及到几个坐标的转换:

经纬度与GPoint的转换:GPoint是gMapControl控件坐标,坐标原点(0,0)位于控件的左上角,这个转换用函数FromLatLngToLocal()完成。

GPoint与经纬度的转换:将控件坐标转换成经纬度,用函数FromLocalToLatLng完成。

GPoint与Graphics绘图坐标转换:Graphics是OnRender的形参,用来绘制地图显示内容的,Graphics坐标系的原点在地图控件的对称中心点。所以如果直接将GPoint绘制出来会出现偏移,即:GPoint(0, 0)点在控件上其实是在(mapControl.Size.Width / 2,mapControl.Size.Width / 2)处。

注:在地图进行缩放时,如果控件的MouseWheelZoomType属性是MousePositionAndCenter,鼠标会自动跳到控件的对称中心点。


这里主要是用自定义类GmapMarkerRoute,这个类继承自GMapMarker。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing;using GMap.NET;using GMap.NET.WindowsForms;namespace GMap{    class GmapMarkerRoute : GMapMarker    {        //用户绘制在视窗中的点,是将经纬度转换成GPoint再加上偏移处理后的点        private List<Point> Point = new List<Point>();        //需要绘制的经纬度点集        private List<PointLatLng> PointLL = new List<PointLatLng>();                // 是否有新的点加入        private bool HasNewPoint = false;        //新加入点的经纬度        private PointLatLng NewPointLatLng;        /// <summary>        /// 图层缩放比例是否变化        /// </summary>        public bool IsZoomChanged = false;        /// <summary>        /// 拖拽地图后图层原点与视窗原点的偏差向量        /// </summary>        public Point OriginOffset = new Point();        /// <summary>        /// 视窗原点相对于图层原点的像素偏差向量        /// 视窗原点默认是视窗中心点        /// 图层原点默认是视窗左上角的点        /// </summary>        public Point Origin = new Point();        /// <summary>        /// 绘制点集的pen        /// </summary>        public Pen pen = new Pen(Color.Red,1);                public GmapMarkerRoute(GMap.NET.PointLatLng p):base(p)        {                    }        public override void OnRender(Graphics g)        {            GPoint gp = new GPoint();            //地图拖拽            if (this.Overlay.Control.IsDragging)            {                 pen.Color = Color.Green;            }            //地图缩放比例改变后需要重新计算Point                else if (IsZoomChanged)            {                pen.Color = Color.Black;                OriginOffset.X = 0;                OriginOffset.Y = 0;                if (PointLL.Count > 1)                {                    Point.Clear();                    {                        foreach (PointLatLng p in PointLL)                        {                            gp = this.Overlay.Control.FromLatLngToLocal(p);                            Point.Add(new Point((int)(gp.X - Origin.X), (int)(gp.Y - Origin.Y)));                        }                    }                }                IsZoomChanged = false;            }            //其他事件            else             {                pen.Color = Color.Red;            }            //判断是否有新的点加入,如果有将其添加进Point点集            //同时也添加相应的经纬度到相关点集            if (HasNewPoint)            {                gp = this.Overlay.Control.FromLatLngToLocal(NewPointLatLng);                Point.Add(new Point((int)gp.X - Origin.X - OriginOffset.X, (int)gp.Y - Origin.Y - OriginOffset.Y));                PointLL.Add(NewPointLatLng);                HasNewPoint = false;            }            if (Point.Count > 1)            {                g.DrawLines(pen, Point.ToArray());            }        }        public void AddPoint(PointLatLng p)        {            NewPointLatLng = p;            HasNewPoint = true;        }    }}

主界面代码

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using GMap.NET;using GMap.NET.WindowsForms;using GMap.NET.MapProviders;using GMap.NET.WindowsForms.Markers;using System.IO;namespace GMap{    public partial class Form1 : Form    {        private GMapOverlay RouteMark = new GMapOverlay("RouteMark");//放置区域标记图层        /// <summary>        /// 路径轨迹        /// </summary>         private List<PointLatLng> RoutePoints = new List<PointLatLng>();        private GmapMarkerRoute Route = null;        private Point RightBDPoint;        private string CurrentDir = new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName;        private Timer blinkTimer = new Timer();        private Point BeforeZoomChangeMousePoint = new Point();        public Form1()        {            InitializeComponent();            mapControl.Manager.Mode = AccessMode.CacheOnly;            //mapControl.CacheLocation = CurrentDir + "\\GMapCache\\mapdata.gmdb"; //缓存位置            mapControl.Manager.ImportFromGMDB(CurrentDir + "\\GMapCache\\mapdata.gmdb");            //mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图            mapControl.MapProvider = GMapProviders.OpenStreetMap;            mapControl.MinZoom = 2;  //最小比例            mapControl.MaxZoom = 17; //最大比例            mapControl.Zoom = 14;     //当前比例            mapControl.ShowCenter = false; //不显示中心十字点            mapControl.DragButton = System.Windows.Forms.MouseButtons.Right; //右键拖拽地图            mapControl.Position = new PointLatLng(30.6658229803096, 104.0647315979); //地图中心位置            mapControl.OnMapZoomChanged += new MapZoomChanged(mapControl_OnMapZoomChanged);            mapControl.MouseDown += new MouseEventHandler(mapControl_MouseDown);            mapControl.MouseUp += new MouseEventHandler(mapControl_MouseUp);            mapControl.MouseMove += new MouseEventHandler(mapControl_MouseMove);            mapControl.Overlays.Add(RouteMark);        }        void mapControl_MouseMove(object sender, MouseEventArgs e)        {            PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y);            BeforeZoomChangeMousePoint.X = e.X;            BeforeZoomChangeMousePoint.Y = e.Y;        }        /// <summary>        /// 地图拖拽向量        /// 在进行地图的缩放后需要将该偏移量清零        /// </summary>        private int DragOffsetX = 0, DragOffsetY = 0;        void mapControl_MouseUp(object sender, MouseEventArgs e)        {            if (e.Button == System.Windows.Forms.MouseButtons.Right)            {                                //在拖拽地图后地图原点和视窗原点的偏移量                DragOffsetX = DragOffsetX + e.X - RightBDPoint.X;                DragOffsetY = DragOffsetY + e.Y - RightBDPoint.Y;                if (Route != null)                {                    //设置Route的中心偏移                    Route.OriginOffset.X = DragOffsetX;                    Route.OriginOffset.Y = DragOffsetY;                }            }        }        void mapControl_MouseDown(object sender, MouseEventArgs e)        {            if (e.Button == System.Windows.Forms.MouseButtons.Left)            {                PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y);                if (Route == null)                {                    Route = new GmapMarkerRoute(point);                    Route.Origin.X = mapControl.Size.Width / 2;                    Route.Origin.Y = mapControl.Size.Height / 2;                    Route.OriginOffset.X = DragOffsetX;                    Route.OriginOffset.Y = DragOffsetY;                    RouteMark.Markers.Add(Route as GMapMarker);                }                Route.AddPoint(point);            }            else if (e.Button == System.Windows.Forms.MouseButtons.Right)            {                //记录鼠标按下位置                RightBDPoint.X = e.X;                RightBDPoint.Y = e.Y;            }        }        void mapControl_OnMapZoomChanged()        {            //在进行地图的缩放后,视图的原点会重新回到MapControl控件的中心点            DragOffsetX = 0;            DragOffsetY = 0;            if (Route != null)            {                Route.IsZoomChanged = true;            }        }    }}



0 1