DIY自己的GIS程序(1)——起航
一个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)——起航的更多相关文章
- DIY自己的GIS程序(2)——局部刷新
绘制线过移动鼠标程中绘制临时线段防闪烁 参考OpenS-CAD想实现绘制线的功能.希望实现绘制线的过程,在移动线的时候没有闪烁和花屏.但是出现了问题,困扰了2天,前天熬的太晚,搞得现在精力都没有恢复. ...
- 开源GIS软件初探
谈到GIS软件,首先让我们想到的便是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品,从最初接触的version 9.2到如今的version 10.1,其发展可谓风生水起.MapInfo软件也不 ...
- 开源GIS浅谈 【转】
http://blog.csdn.net/happyduoduo1/article/details/51773850 谈到GIS软件,首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS ...
- GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT
预热文章系列:<GIS历史概述与WebGis应用开发技术浅解>.<GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换>.<OGC标准WMTS ...
- c#基础汇总-------------封装
说到封装,其实是比较基础类的问题,它为程序设计提供了系统与系统,模块与模块,类与类之间交互的实现手段.在.Net中,一切看起来都已经被包装在.Net FrameWork这一复杂的网络中,提供给最终开发 ...
- 浅析WebGIS
浅析WebGIS 摘要:随着网络的发展,利用Web公布信息越来越普及化.而地理信息系统(GIS)与网络的结合就产生了万维网地理信息系统(WebGIS),它引起了地理信息公布的新的变革,对实现GIS信息 ...
- arcengine 开发经典帖
http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=25575&page=1&extra= 使用ArcGIS Engine 开发自定义 ...
- 怎样自适应ios设备大小
在编写移动端GIS程序的时候.常常要依据ios设备的大小来设置UI.曾经我在ios程序中,须要定义设备的值(如:宽度和高度),如: 可是假设是不同的设备.如iphone4.iphone5,甚至是 ...
- JTS(Geometry)(转)
原文链接:http://blog.csdn.net/cdl2008sky/article/details/7268577 空间数据模型(1).JTS Geometry model (2).ISO Ge ...
随机推荐
- AssetBundle中Unload()方法的作用
AssetBundle.Unload(false)的作用: 官网的解释是这样的: When unloadAllLoadedObjects is false, compressed file data ...
- mysql压力测试工具Mysqlslap
mysql 性能测试工具:The MySQL Benchmark Suite(不支持多CPU而且不是压力工具) 压力测试工具: MySQL super-smack:需要找能连接外网的机器,能连接外网的 ...
- 怎么解决MathType希腊字母无法显示的问题
MathType是一种常见的数学公式编辑软件,有些用户在编辑论文公式的时候发现,一些希腊字母在公式编辑器中无法打出来,上面显示一个“叉”号,面对这种MathType希腊字母无法显示的问题该如何解决呢? ...
- MFC ADO数据库操作
MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现 ...
- ADO连接数据库【msado15.dll】
Microsoft ActiveX Data Objects (ADO) 注册表查看ADO版本:HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess下有Ve ...
- mysqldump进行数据库的全备时,备份数据库的顺序是什么,就是先备份哪个库,然后再备份哪个库
需求描述: 今天在用mysqldump工具进行数据库的备份的时候,突然想了一个问题,比如我有10个库要进行备份 那么是先备份哪个,然后再备份哪个呢,所以,做了实验,验证下. 操作过程: 1.使用--a ...
- 九度 1500:出操队形(LIS变形)
题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较高的就要排在队尾.突然,有一天出操负责人想了一个 ...
- django restframwork教程之Request和Response
从这一篇文章开始,我们会覆盖整个REST framwork框架的核心,接下来让我们介绍一些基础的构建块 Request 对象 REST framework 引入了一个扩展HttpRequest的请求对 ...
- 让你变成ASP木马高手
.名称:如何制作图片ASP木马 (可显示图片) 建一个asp文件,内容为<!--#i nclude file="ating.jpg"--> 找一个正常图片ating.j ...
- synchronized同步方法
“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问的时候产生,产生的后果是脏读,也就是取到的数据是被更改过的.而“线程安全”就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象 ...