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

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

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

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

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

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

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

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

  方法二: 

 int x = Math.Min((int)m_start_x,(int)e.X);
int y = Math.Min((int)m_start_y,(int)e.Y);
int w = Math.Abs((int)(e.X-m_start_x));
int h = Math.Abs((int)(e.Y-m_start_y)); Rectangle clip_rect = new Rectangle(x-,y-,w+,h+); switch(m_draw_mode)
{ case DrawingMode.Line:
{ Invalidate(clip_rect);
Update();
graph.DrawLine(pen,(int)m_start_x,
(int)m_start_y,
(int)e.X,
(int)e.Y);
}
break; case DrawingMode.Rectangle:
{
Invalidate(clip_rect);
Update();
graph.DrawRectangle(pen,x,y,w,h);
}
break; case DrawingMode.Polygon:
{ if(m_current_polygon.Count>)
{
Invalidate(clip_rect);
Update();
m_current_polygon[m_current_polygon.Count-] = new PointF(e.X,e.Y); Point[] points = new Point[m_current_polygon.Count];
for(int i=; i<m_current_polygon.Count; i++)
{
int x1 = (int)((PointF)m_current_polygon[i]).X;
int y1 = (int)((PointF)m_current_polygon[i]).Y;
points[i] = new Point(x1,y1);
}
graph.DrawLines(pen,points);
}
}
break;
}

  这里可以展示一下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完成绘制

局部刷新    

移动画布

绘制中移动

移动图形

                                              

DIY自己的GIS程序(1)——起航的更多相关文章

  1. DIY自己的GIS程序(2)——局部刷新

    绘制线过移动鼠标程中绘制临时线段防闪烁 参考OpenS-CAD想实现绘制线的功能.希望实现绘制线的过程,在移动线的时候没有闪烁和花屏.但是出现了问题,困扰了2天,前天熬的太晚,搞得现在精力都没有恢复. ...

  2. 开源GIS软件初探

    谈到GIS软件,首先让我们想到的便是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品,从最初接触的version 9.2到如今的version 10.1,其发展可谓风生水起.MapInfo软件也不 ...

  3. 开源GIS浅谈 【转】

    http://blog.csdn.net/happyduoduo1/article/details/51773850 谈到GIS软件,首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS ...

  4. GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT

    预热文章系列:<GIS历史概述与WebGis应用开发技术浅解>.<GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换>.<OGC标准WMTS ...

  5. c#基础汇总-------------封装

    说到封装,其实是比较基础类的问题,它为程序设计提供了系统与系统,模块与模块,类与类之间交互的实现手段.在.Net中,一切看起来都已经被包装在.Net FrameWork这一复杂的网络中,提供给最终开发 ...

  6. 浅析WebGIS

    浅析WebGIS 摘要:随着网络的发展,利用Web公布信息越来越普及化.而地理信息系统(GIS)与网络的结合就产生了万维网地理信息系统(WebGIS),它引起了地理信息公布的新的变革,对实现GIS信息 ...

  7. arcengine 开发经典帖

    http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=25575&page=1&extra= 使用ArcGIS Engine 开发自定义 ...

  8. 怎样自适应ios设备大小

       在编写移动端GIS程序的时候.常常要依据ios设备的大小来设置UI.曾经我在ios程序中,须要定义设备的值(如:宽度和高度),如: 可是假设是不同的设备.如iphone4.iphone5,甚至是 ...

  9. JTS(Geometry)(转)

    原文链接:http://blog.csdn.net/cdl2008sky/article/details/7268577 空间数据模型(1).JTS Geometry model (2).ISO Ge ...

随机推荐

  1. 学习 TList 类的实现[1]

    最近整理了一些函数列表, 算是一个宏观的安排; 等以后再碰到一些函数时就可以放置的更有次序一些. 我对函数与类的理解是: 函数是一个功能模块, 类是一个更强大的功能模块; Delphi 已经提供了很多 ...

  2. mysql通过mysqldump工具,对某个库下的表进行备份

    需求描述: 使用mysqldump工具对某个库下的表进行备份的方法. 操作过程: 1.通过mysqldump工具完成此目的 [mysql@redhat6 MysqlDb_Backup]$ mysqld ...

  3. 如何在 React Native 中写一个自定义模块

    https://my.oschina.net/jpushtech/blog/983230

  4. 几张图轻松理解String.intern()

    https://blog.csdn.net/soonfly/article/details/70147205 在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String.inte ...

  5. c# JsonHelper类

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  6. 1-0 superset的安装和配置

    Superset安装及教程官网(http://airbnb.io/superset/installation.html)讲解的已经够详细的了,本篇以官网教程为蓝本进行说明. 入门 Superset目前 ...

  7. 线程间通信:Queue

    线程间使用队列来互相交换数据,数据可以是字符串 .列表 .元组等,Queue 是提供队列操作的模块,常见的队列如下: FIFO:First In First Out 先进先出队列,也就是最先放进去的数 ...

  8. 关于android定位的坐标系问题

    按照正常的思路,我们通过GPS或者基站定位等方式获取到经纬度信息后,把它放到地图上,就能够完成定位.但实际上,我们很有可能会在实际操作中发现,我们的定位出现了较大的偏移.这是因为我国出于国家安全(或者 ...

  9. K-mean和k-mean++

    (1)k-mean聚类 k-mean聚类比较容易理解就是一个计算距离,找中心点,计算距离,找中心点反复迭代的过程, 给定样本集D={x1,x2,...,xm},k均值算法针对聚类所得簇划分C={C1, ...

  10. (1.1.6)UVA 10978 Let's Play Magic!(直叙式模拟)

    /* * UVA_10978.CPP * * Created on: 2013年10月6日 * Author: Administrator */ #include <iostream> # ...