DotSpatial 自定义MapFunction_mapMain中绘制线(未添加到图层中)

using DotSpatial.Controls;
using DotSpatial.Symbology;
using GeoAPI.Geometries;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DotSpatial20Test.LzqOP
{
    public class Lzq_FunctionClipPolygon : MapFunction
    {
        #region 定义变量

        private List<Coordinate> _coordinates;//折线段的集合
        private System.Drawing.Point _mousePosition;//鼠标位置
        private List<List<Coordinate>> _previousParts;//这次绘制前折线段点集合
        private bool _standBy;//判断是否注销当前工具       

        #endregion
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="map"></param>
        public Lzq_FunctionClipPolygon(IMap map) : base(map)
        {
            _previousParts = new List<List<Coordinate>>();//初始化
            _coordinates = new List<Coordinate>();
            YieldStyle = YieldStyles.LeftButton | YieldStyles.RightButton;

            if (map != null)
            {
                (map as Control).MouseLeave += MapMouseLeave;
            }
            Name = "绘制线";
        }
        /// <summary>
        /// 鼠标离开控制区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MapMouseLeave(object sender, EventArgs e)
        {
            Map.Invalidate();
        }

        /// <summary>
        /// 激活Function
        /// </summary>
        protected override void OnActivate()
        {
            if(!_standBy) //非注销状态
            {
                _previousParts = new List<List<Coordinate>>();
                _coordinates = new List<Coordinate>();
            }
            _standBy = false;
            base.OnActivate();
        }
        /// <summary>
        /// 注销
        /// </summary>
        protected override void OnDeactivate()
        {
            if(_standBy)
            {
                return;
            }
            _standBy = true;
            Map.Invalidate();
            //base.OnDeactivate();
        }
        /// <summary>
        /// 鼠标移动
        /// </summary>
        /// <param name="e"></param>
        protected override void OnMouseMove(GeoMouseArgs e)
        {
            //注销后,跳过
            if(_standBy)
            {
                return;
            }

            //无坐标时,跳过
            if(_coordinates==null||_coordinates.Count==0)
            {
                return;
            }

            //鼠标位置点
            Coordinate c1 = e.GeographicLocation;

            //当点数大于0时
            if(_coordinates.Count>0)
            {
                //将地理坐标转换为屏幕坐标
                List<Point> points = _coordinates.Select(coord => Map.ProjToPixel(coord)).ToList();
                //获取鼠标上一个位置和最后一个点的矩形区域
                Rectangle oldRect = SymbologyGlobal.GetRectangle(_mousePosition, points[points.Count - 1]);
                //获取鼠标和左后一个点矩形区域
                Rectangle newRect = SymbologyGlobal.GetRectangle(e.Location, points[points.Count - 1]);
                //合并区域
                Rectangle invalidRect = Rectangle.Union(newRect, oldRect);
                //刷新区域
                invalidRect.Inflate(220, 20);
                Map.Invalidate(invalidRect);
            }
            //设置鼠标位置
            _mousePosition = e.Location;

            base.OnMouseMove(e);
        }

        /// <summary>
        /// 鼠标弹起
        /// </summary>
        /// <param name="e"></param>
        protected override void OnMouseUp(GeoMouseArgs e)
        {
            //注销,跳过
            if (_standBy)
            {
                return;
            }

            //右键结束此次操作,开始下次操作
            if(e.Button ==MouseButtons.Right)
            {
                _coordinates = new List<Coordinate>();//坐标点集清空
                //Map.Invalidate();
                //base.OnDeactivate();
            }
            else
            {
                _coordinates.Add(e.GeographicLocation);//将当前鼠标点添加至坐标点集中
                Map.Invalidate();
            }

            base.OnMouseUp(e);
        }
        /// <summary>
        /// 绘制地图
        /// </summary>
        /// <param name="e"></param>
        protected override void OnDraw(MapDrawArgs e)
        {
            //当前鼠标在屏幕坐标系下的坐标
            Point mouseTest = Map.PointToClient(Control.MousePosition);
            //鼠标是否在地图内
            bool hasMouseInMapCtrl = Map.ClientRectangle.Contains(mouseTest);

            #region 定义绘图工具 画笔等

            //画笔——红色
            Pen penRed = new Pen(Color.Red, 2F);
            //画笔——蓝色
            Pen penBlue = new Pen(Color.Blue, 2F);
            //画刷——红色
            Brush brushRed = new SolidBrush(Color.Red);
            //画刷——蓝色
            Brush brushBlue = new SolidBrush(Color.FromArgb(60, 0, 0, 255));
            //字体
            Font drawFont = new Font("Arial", 12);
            //抗锯齿
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            #endregion

            //点序列
            List<Point> points = new List<Point>();

            //绘制当前点集
            if(_coordinates!=null)
            {
                //获取此次绘制的所有点
                foreach(Coordinate coord in _coordinates)
                {
                    points.Add(Map.ProjToPixel(coord));//地理坐标转屏幕坐标
                }

                //点集数量>1
                if(points.Count>1)
                {
                    //绘制折线、节点
                    for(int i=0;i<points.Count-1;i++)
                    {
                        Point cp = points[i];
                        Point np = points[i + 1];
                        e.Graphics.DrawLine(penBlue, cp, np);
                        e.Graphics.FillRectangle(brushRed, new Rectangle(cp.X - 2, cp.Y - 2, 4, 4));
                    }
                }

                //点击数量>0时,绘制鼠标移动所构成的那条线
                if (points.Count > 0 && _standBy == false && hasMouseInMapCtrl)
                {
                    e.Graphics.DrawLine(penRed, points[points.Count - 1], _mousePosition);
                }
            }
            //释放变量
            penBlue.Dispose();
            penRed.Dispose();
            brushRed.Dispose();
            brushBlue.Dispose();
            drawFont.Dispose();
            base.OnDraw(e);
        }
    }
}

  

调用方法:

mapMain.Cursor = Cursors.Cross;
            var lzqFunctionClipPolygon = new Lzq_FunctionClipPolygon(mapMain);
            mapMain.ActivateMapFunction(lzqFunctionClipPolygon);

原文地址:https://www.cnblogs.com/kogame/p/12330628.html

时间: 2024-10-10 03:46:53

DotSpatial 自定义MapFunction_mapMain中绘制线(未添加到图层中)的相关文章

初学js---获取输入框中的内容并添加到表格中

按下添加按钮将输入框中的内容添加到表格中: 这里涉及到的动态创建表格单元的已讲略过 只讲获取数据添加到表格:通过getElementById(*).value分别获取输入框中的值,通过以上代码将其加入到表格中 完整代码:(注释部分为更复杂的方法) <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>取值填入表格</ti

在Linux中怎么把用户添加到组中

(1)添加用户test,初始密码123456,该用户的主目录为/home/share,用户的基本组为root,用户的shell为/bin/tcsh,要求将该用户加到mail和new组中.请问该怎么做啊???useradd -m -d /home/share -g root -s /bin/tcsh test 建立test用户 passwd test 系统会提示你为test输入密码 你输入123456 回车即可 usermod -G mail test 加入mail组 usermod -G new

计算机图形学DDA画线法+中点画线法+Bresenham画线法

#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> void line1(){ line(100, 100, 200, 400); line(100, 400, 200, 100); line(0, 200, 300, 300); line(0, 300, 300, 200); } void lineDDA(int x0, int y0, int x1,

Button 文字阴影,自定义图片,代码绘制样式,添加音效的方法

1.Button自己在xml文件中绑定监听器 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&qu

在android 自定义listView中绘制矩形

我想在android 在listview中绘制自定义的形状,我在网上找了代码但是没有运行通过,我现在有一个可以绘制矩形的 DrawView.java类,我想在我的自定义listView中展示这个对象. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 DrawView.java package com.example.h

Docker安全--将用户添加到Docker组中进行启动容器与未添加到Docker组中的sudo执行的研究

/*************************************** * Author : Samson * Date : 08/25/2015 * Test platform: * gcc 4.8.2 * GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu) * Docker version 1.7.1 * Debian GNU/Linux 7 * *************************************/ 结论: 对

iOS Quartz2D绘制线、矩形、弧、圆、文字、图片

利用Quartz2D中提供的图层上下文 Layer Graphics Context,进行简单绘制线.矩形.弧.圆.文字.图片 在storyBoard中得拖入控制器,添加多个UIView控件,并把各个UIView的class修改为自定义的类. 如: 绘制线: // // HJLineView.m // 画线三角矩形圆 // // Created by HJiang on 15/1/2. // Copyright (c) 2015年 HJiang. All rights reserved. //

我的Android进阶之旅------&gt; Android为TextView组件中显示的文本添加背景色

通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article/details/46916963) 我们学会了在TextView中显示图片的方法,现在我们来学习如何为TextView组件中显示的文本添加背景色.要求完成的样子如图所示: 首先来学习使用BackgroundColorSpan对象设置文字背景色,代码如下: TextView textView=(TextV

DirectX 11游戏编程学习笔记之7: 第6章Drawing in Direct3D(在Direct3D中绘制)(重点回顾+勘误)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题欢迎联系[email protected]         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候,会使用章节号而非页码.同样的情况适合于"龙书"第二版. 上一期的地址: DX 11游戏编程学习笔记之6 这一章应该是本书最长的一章了,可能也是最难的一章,所以大家一定要好好消化,仔细学习!这一章大致相当于"龙书"第二版的第7章和第8章,还添加了一些别的东西. 由于这一