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 ...
随机推荐
- Ubuntu 12.04/13.04 安装 Oracle11gR2:该笔记已经陈旧!请参考后续的笔记
注意点: 在 ubuntu的 /bin 下建立以下几个基本命令的链接: basename awk sh->bash | sh -> ksh 安装以下几个必须的包: binutils bui ...
- C/C++ 控制台演示彩色输出进度
#include <stdio.h> #include <windows.h> BOOL SetConsoleColor(WORD wAttributes); int main ...
- Java精选笔记_Filter(过滤器)
Filter(过滤器) Filter入门 什么是Filter Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前 ...
- 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 ...
- ios开发之--UICollectionView的使用
最近项目中需要实现一种布局,需要用到UICollectionView,特在此整理记录下! 贴上最终实现的效果图: 1,声明 @interface FirstViewController ()<U ...
- Android Tab切换
ViewPager+FragmentStatePagerAdapter 页面切换案例详解 http://blog.csdn.net/u010203181/article/details/4462963 ...
- HTTP 代理
HTTP 代理: (1) 如果我们一直用同一个IP去爬取同一个网站上的网页,久了之后可能会被该网站服务器屏蔽,因此我们可以使用代理IP来爬取,代理实际上指的就是代理服务器(2) 当我们使用代理IP爬取 ...
- Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器[摘抄]
[文章作者:张宴 本文版本:v6.3 最后修改:2010.07.26 转载请注明原文链接:http://blog.s135.com/nginx_php_v6/] 前言:本文是我撰写的关于搭建“Ngin ...
- 【微信开发】PC端 微信扫码支付成功之后自动跳转
场景: PC端 微信扫码支付 结果: 支付成功 自动跳转 实现思路: 支付二维码页面,写ajax请求支付状态,请求到结果,无论成功还是失败,都跳转到相应的结果页面 具体实现方法: html部分: ...
- 我觉得epoll和select最大的区别
最近在用epoll,网速资料很多,大家都说epoll和select的区别比较大,而且select要不停遍历所有的fd,效率要低,而且fd有限制. 但是我认为二者最大的区别在于 先看代码 while ( ...