gmap绘制路径_cad画可见点

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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

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

Jetbrains全家桶1年46,售后保障稳定

主界面代码

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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