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

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

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

(0)
上一篇 2025年7月30日 下午5:15
下一篇 2025年7月30日 下午5:43


相关推荐

  • sql-connectionStrings「建议收藏」

    sql-connectionStrings「建议收藏」<connectionStrings><addname=”ClassReservatConnectionString”connectionString=”server=localhost;userid=root;password=123456;database=classreservat;”providerName=”System.Data.SqlClient…

    2022年5月11日
    43
  • 关闭对话框,OnClose和OnCancel

    关闭对话框,OnClose和OnCancel

    2021年12月4日
    50
  • veryCD名言「建议收藏」

    veryCD名言「建议收藏」电骡文化:1.快并快乐着!2.共享世界,有你才精彩!3.你共享一小文件,对于你来说是一小文件,但对于世界上的骡友来说是一个大文件。来自VeryCD 的原创(VeryCD 名人名言):(!)4.分享互联网5.梦里寻她千百度,蓦然回首,那资源竟在VeryCD 下载处。●———————————————————————————————————————————————————…

    2022年8月10日
    10
  • asp数组随机排序

    asp数组随机排序功能 将一个数组打乱它的顺序 显示出来 让每一次显示出来的顺序都不一样 Dimtttt Split 1 2 3 4 5 6 随机排序 nbsp nbsp leng UBound tt randomize nbsp nbsp forii 0toleng 1 nbsp nbsp nbsp b int rnd leng nbsp nbsp nbsp temp tt b nbsp nbsp nbsp tt b tt ii nbsp nbsp nbsp tt ii tempNext nbsp For

    2025年8月20日
    6
  • UltraEdit 注册机使用激活方法

    UltraEdit 注册机使用激活方法(转)UltraEdit注册机使用激活方法UltraEdit 注册机使用激活方法: 1、断开网络连接,运行UltraEdit软件后,点击“帮助”—“注册/激活”; 2、许可证ID填写“zd423”、密码填写:“zdfans”;后点击“激活”,会自动弹出“连接错误”窗口,然后点击“脱机激活”,弹出脱机激活窗口后,记录“用户码1、用户码2”; 3、运行UltraEdit注册机“IDMA…

    2025年6月29日
    5
  • maven中的groupId和artifactId到底指的是什么?「建议收藏」

    ———2017.12.01修改———-下面标黄的位置应该修改为cn.snowin.testProj,感谢网友xiaoqidela指出。—————原文——————-转载自百度知道一位网友的回答(略修改)地址:https://zhidao.baidu.com/question/1639120287056394340.h…

    2022年4月18日
    56

发表回复

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

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