博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DIY自己的GIS程序(1)——起航
阅读量:6751 次
发布时间:2019-06-25

本文共 2390 字,大约阅读时间需要 7 分钟。

  一个GIS系统最重要的功能是绘制图形和关联属性,这里研究二维点线面的绘制过程:

  对于一个绘图系统设计,图形的绘制涉及两个重要的方面。

  • 1.一个是绘制或者重新绘制,重绘过程出现在下面情况:

  a 界面初始化的时候(全部刷新)

  b 窗体大小变化的时候(全部刷新)

  c 编辑图形的过程中,增加、删除、修改(移动图形和移动节点)。这里需要思考是整个画布刷新还是局部刷新。如果画布没有发生变化就应该保持画布上已有的东西,通过缓存图片的方式,局部刷新变化的(新绘制、修改)的部分。否则会出现整个画布闪烁现象。

  所谓局部刷新就是只对变化的部分刷新。这里的一种解决方法是,获取缓存图片受影响范围,在此范围重新绘制图形。

  方法一:dc.DrawImage(m_staticImage, r, r, GraphicsUnit.Pixel);

  方法二: 

1 int x = Math.Min((int)m_start_x,(int)e.X); 2             int y = Math.Min((int)m_start_y,(int)e.Y); 3             int w = Math.Abs((int)(e.X-m_start_x)); 4             int h = Math.Abs((int)(e.Y-m_start_y)); 5  6             Rectangle clip_rect = new Rectangle(x-6,y-6,w+12,h+12); 7  8             switch(m_draw_mode) 9             {10 11                 case DrawingMode.Line:12                 {13                     14                     Invalidate(clip_rect);15                     Update();16                     graph.DrawLine(pen,(int)m_start_x,17                         (int)m_start_y,18                         (int)e.X,19                         (int)e.Y);20                 }21                     break;22             23                 case DrawingMode.Rectangle:24                 {                    25                     Invalidate(clip_rect);26                     Update();        27                     graph.DrawRectangle(pen,x,y,w,h);    28                 }29                     break;30 31                 case DrawingMode.Polygon:32                 {33             34                     35                     if(m_current_polygon.Count>1)36                     {                        37                         Invalidate(clip_rect);38                         Update();39                         m_current_polygon[m_current_polygon.Count-1] = new PointF(e.X,e.Y);40                     41                         Point[] points = new Point[m_current_polygon.Count];42                         for(int i=0; i
View Code

  这里可以展示一下ArcGIS中的图片,左图为移动,右图为编辑节点。可以看出蓝色部分为缓存的图片,右图更加明显,由蓝色部分移动到下方后又往回移动,下方的为缓存图片的显示。同样,移动画笔,放大,缩小都是采用缓存图片来绘制,提升用户体验的效果。

  d 选中图形后。(局部刷新)

  e 画布移动的过程中。(整体刷新,最好能够界面保持技术,局部刷新)

  • 2.另一个是编辑,编辑过程涉及大量的鼠标事件、键盘事件MouseDown、MouseMove、MouseUp
    MouseDown MouseMove MouseUp   DoubleClick
点             绘制点。完成单点绘制      
线

绘制点

n=1

n>1

局部刷新,绘制新增的线段   完成绘制

绘点

n=1绘点

n=2绘线

n>2绘制面

局部刷新   完成绘制
矩形

绘制点

n=1

局部刷新

绘制矩形

绘制矩形  
圆弧

n=1

n=2

n=3 完成绘制

     

中点-半径

n=1

n=2 完成绘制

三点

n=1

n=2

n=3完成绘制

局部刷新    

移动画布

绘制中移动

移动图形

                                              

 

转载地址:http://jfvho.baihongyu.com/

你可能感兴趣的文章
Xamarin Android项目真机测试闪退
查看>>
Linux字符集的查看及修改
查看>>
AD采样模块采集带模拟量真空表值的实验
查看>>
安全-分析深圳电信的新型HTTP劫持方式
查看>>
pycharm快捷键 - 官方全
查看>>
SaltStack项目实战(七)
查看>>
MyEclipse无法删除项目下的文件
查看>>
如何使用Android studio打开eclipse项目
查看>>
开源镜像站汇总
查看>>
Win10系统安装Tomcat8
查看>>
leetcode 669. Trim a Binary Search Tree
查看>>
图像滤镜艺术---(Punch Filter)交叉冲印滤镜
查看>>
利用Python进行数据分析(1) 简单介绍
查看>>
Silverlight WCF RIA服务(三十)身份验证、角色、个性化 1
查看>>
python 复习之 可变参数
查看>>
[官方文档] oracle官方文档总汇(9i,10g,11gR1, 11gR2)
查看>>
zz linux下用 SCP 命令进行网络传输
查看>>
Oracle 死锁的检测查询及处理
查看>>
[LeetCode] Partition List
查看>>
文件选择用zstack实现自己的sample--点灯
查看>>