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


相关推荐

  • CSS3 opacity 属性介绍

    CSS3 opacity 属性介绍CSS3opacity属性定义和用法opacity属性设置元素的不透明级别。默认值: 1 继承性: no 版本: CSS3 JavaScript语法: object.style.opacity=0.5 语法opacity:value|inherit;值 描述 value 规定不透明度。从0.0(完全透明)到…

    2022年5月26日
    22
  • java集合详解完整版(超详细)「建议收藏」

    java集合详解完整版(超详细)「建议收藏」联合整理https://blog.csdn.net/feiyanaffection/article/details/81394745https://www.cnblogs.com/linliquan/p/11323172.html一、集合大纲1、集合与数组的区别2、集合常用方法3、常用集合分类Collection接口的接口对象的集合(单列集合)├——-List接口:元素按进入先后有序保存,可重复│—————-├LinkedList接口实现类,链表,插入删除,没有

    2022年5月4日
    47
  • Django接口_小米电视spdif接口

    Django接口_小米电视spdif接口前言在RESTful规范中,有关版本的问题,用restful规范做开放接口的时候,用户请求API,系统返回数据。但是难免在系统发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。因此,改动升

    2022年7月30日
    12
  • 【LeetCode】Linked List Cycle

    【LeetCode】Linked List Cycle

    2022年1月6日
    54
  • 安装SQLServer2008失败「建议收藏」

    安装SQLServer2008失败「建议收藏」由于操作系统不同(64位与32位)和可能安装的环境不一样再或者在安装SQL2008的时候已经安装SQLServer相关其他版本,因此可能会遇到问题。  问题1:安装sqlserver2008R2,安装过程中提示错误:此计算机上安装了MicrosoftVisualStudio2008的早期版本。请在安装SQLServer2008前将Microsoft…

    2025年9月7日
    8
  • 自定义html下拉选择框,CSS自定义select下拉选择框的样式(不用其他标签模拟)

    自定义html下拉选择框,CSS自定义select下拉选择框的样式(不用其他标签模拟)今天群里有人问到怎么自定义 select 下拉选择框的样式 于是群里就展开了激烈的讨论 刚开始一直就是考虑怎样使用纯 CSS 实现 把浏览器默认的样式覆盖掉 但最后均因兼容问题处理不好而失败告终 最后的解决方案就是用其他的元素 如 ul li 模拟下拉菜单 或者是使用网上一些现成的插件 其实 select 这个东西只靠纯 CSS 是不能解决这个自定义样式问题的 但既然折腾了这么久 还是说一下 CSS 实现的思路吧 首

    2026年3月18日
    2

发表回复

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

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