gmap绘制路径_cad画可见点

gmap绘制路径_cad画可见点将在地图上用鼠标左键点击的点绘制出来(两点之间用直线连接),并且能够随地图一起实现等比例缩放和拖拽。GMap主要涉及到几个坐标的转换:经纬度与GPoint的转换:GPoint是gMapControl控件坐标,坐标原点(0,0)位于控件的左上角,这个转换用函数FromLatLngToLocal()完成。GPoint与经纬度的转换:将控件坐标转换成经纬度,用函数FromLocalToL

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

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;
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209964.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 数据滤波算法集合「建议收藏」

    数据滤波算法集合「建议收藏」由于要进行数据处理,就利用网络资源总结各种滤波方法以便日后查阅。一、限幅滤波法实现步骤:根据经验法选择最大偏差值E。|value_now-value_before|&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;=E,value_now有效,否则其无效且将其舍弃,最后令value_now=value_before。实现程序:#defineE10//value取值范围为90~110intv

    2022年5月3日
  • 编程分苹果问题_分析解决问题有关总结

    编程分苹果问题_分析解决问题有关总结分苹果问题分析及程序*n只奶牛坐在一排,每个奶牛拥有ai个苹果,*现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同*,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,*问最少需要移动多少次可以平分苹果,如果方案不存在输出-1。

    2022年10月11日
  • js获取当前日期并格式化_json格式怎么打开

    js获取当前日期并格式化_json格式怎么打开js获取当前时间并转化格式效果图:代码:vara=newDate()varb=a.toLocaleTimeString();//输出时分秒varc=a.toLocaleDateString();//输出年月日vard=c.split(“/”);if(d[1]<10){d[1]=’0’+d[1]}co

    2022年9月14日
  • 偷窃转基因玉米种子引发中美打农业官司

    偷窃转基因玉米种子引发中美打农业官司

    2021年11月28日
  • 2017 上海车牌(沪牌)标书购买攻略

    2017 上海车牌(沪牌)标书购买攻略本文介绍 上海车牌上海牌照标书购买的攻略,本文会一直跟随政策而更新, 希望对大家有所帮助本文2017年4月更新阅读目录第一步:确认自己是否有资格购买标书一定要确认自己的

    2022年7月3日
  • 关于EVE模拟器思科交换机无法启动问题「建议收藏」

    关于EVE模拟器思科交换机无法启动问题「建议收藏」今天碰到一个问题,用eve模拟器模拟思科的交换机,发现设备起不来,点了启动以后过一会自己就会关闭,检查了文件的权限以后发现没有问题,开始以为是镜像的问题,后来换了镜像也不对,最后发现是license的问题,重新换了个一个license解决此问题…

    2022年6月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号