一个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. Ubuntu 12.04/13.04 安装 Oracle11gR2:该笔记已经陈旧!请参考后续的笔记

    注意点: 在 ubuntu的 /bin 下建立以下几个基本命令的链接: basename awk sh->bash | sh -> ksh 安装以下几个必须的包: binutils bui ...

  2. C/C++ 控制台演示彩色输出进度

    #include <stdio.h> #include <windows.h> BOOL SetConsoleColor(WORD wAttributes); int main ...

  3. Java精选笔记_Filter(过滤器)

    Filter(过滤器) Filter入门 什么是Filter Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前 ...

  4. Effective C++ Item 13 Use object to manage resources

    1. Always use object to manage resource! If you delete a pointer or release a handler manually by yo ...

  5. ios开发之--UICollectionView的使用

    最近项目中需要实现一种布局,需要用到UICollectionView,特在此整理记录下! 贴上最终实现的效果图: 1,声明 @interface FirstViewController ()<U ...

  6. Android Tab切换

    ViewPager+FragmentStatePagerAdapter 页面切换案例详解 http://blog.csdn.net/u010203181/article/details/4462963 ...

  7. HTTP 代理

    HTTP 代理: (1) 如果我们一直用同一个IP去爬取同一个网站上的网页,久了之后可能会被该网站服务器屏蔽,因此我们可以使用代理IP来爬取,代理实际上指的就是代理服务器(2) 当我们使用代理IP爬取 ...

  8. Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器[摘抄]

    [文章作者:张宴 本文版本:v6.3 最后修改:2010.07.26 转载请注明原文链接:http://blog.s135.com/nginx_php_v6/] 前言:本文是我撰写的关于搭建“Ngin ...

  9. 【微信开发】PC端 微信扫码支付成功之后自动跳转

    场景: PC端   微信扫码支付 结果: 支付成功 自动跳转 实现思路: 支付二维码页面,写ajax请求支付状态,请求到结果,无论成功还是失败,都跳转到相应的结果页面 具体实现方法: html部分: ...

  10. 我觉得epoll和select最大的区别

    最近在用epoll,网速资料很多,大家都说epoll和select的区别比较大,而且select要不停遍历所有的fd,效率要低,而且fd有限制. 但是我认为二者最大的区别在于 先看代码 while ( ...