GIS基础算法实习报告电子.docx

上传人:牧羊曲112 文档编号:3157497 上传时间:2023-03-11 格式:DOCX 页数:7 大小:41.93KB
返回 下载 相关 举报
GIS基础算法实习报告电子.docx_第1页
第1页 / 共7页
GIS基础算法实习报告电子.docx_第2页
第2页 / 共7页
GIS基础算法实习报告电子.docx_第3页
第3页 / 共7页
GIS基础算法实习报告电子.docx_第4页
第4页 / 共7页
GIS基础算法实习报告电子.docx_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《GIS基础算法实习报告电子.docx》由会员分享,可在线阅读,更多相关《GIS基础算法实习报告电子.docx(7页珍藏版)》请在三一办公上搜索。

1、GIS基础算法实习报告电子实习一凸壳生成 实习目的 通过给定的离散点集,结合矢量的叉积、点积运算,获取对应凸壳。 结合上学期VC实习,了解VC/VS的类及绘图中基本坐标变换知识。 实习原理 离散点集的凸壳计算是很多运算的基础。凸壳,可以看作是点集合的边界,连接凸壳点所得到的凸多边形完全包含了空间中的所有点。 生成凸壳的方法非常多,这里取其中较为简单的一种思路即卷积法:首先找到一个y最小值点,以该点为起始点,做一条射线让射线从从水平方向开始逆时针旋转,该射线触碰到的第一个点即为下一个凸壳点,以该点为新的起始点,重复以上步骤,直到下一个凸壳点和y最小值点重合。值得注意的是从第二个点开始,射线的起始

2、方向不再是水平方向,而是上一凸壳点与当前点连线方向。 实习步骤 通过MFC AppWizard创建单文档工程文件 在工程中添加自定义凸壳类,该类的成员变量主要包括用于存储离散点集坐标串的pts,用于存储凸壳坐标串的Chpts,用于存储点集外接矩形的crWCRect。另外该类有两个方法,一个是用于获取点集凸壳的getConvexHull函数,另一个是用于绘制点集和凸壳的Draw函数。 在view部分添加凸壳类的对象,在doc部分添加数据读取函数,完成数据读取,在读取同时生成坐标范围并付给crWCect。 在view中添加OnPrepareDC实现坐标的变换和映射,并在OnDraw部分添加凸壳的绘

3、制函数。 完善凸壳获取和凸壳绘制函数。 实习分析 这一次实习有两个目的,第一就是了解MFC程序的基本框架,这个是之后所有实习的基础,也是GIS实习能教会我的最重要的东西之一。第二是实现凸壳函数,完善程序。从实习过程和结果来看,本次实习圆满完成了预定的目标。由于基本步骤老师已经给出程序,因此主要难点在于凸壳算法的实现。 MFC单文档中主要有CAboutDlg/CCGExeApp/CCGExeDoc/CCGExeView/CMainFrame五个基本类,其中Doc和View是在整个实习中需要较多接触修改的部分,其中Doc部分存有文件读取的函数,而一切需要绘制的内容都需要在View中完成。 对于一个

4、空白的工程,要实现我们的目的其核心步骤为“设置坐标变换与映射,实现WC-DC的过程”、“根据具体需求读取文件”、“自定义类并实现核心函数”、“在OnDraw中创建并调用相关对象,实现绘制”。由于对于MFC流程的不熟悉,我在完成这些工作上耗费了大量精力,不过最终掌握了这一套开发流程是值得的。在实习的途中,我还将使用的平台从VC变更为了VS体会到了两种平台的优势。 在实现凸壳算法时,我最终选定了卷积法。在实现途中,由于思路的不清晰和C+语法的不熟练,我浪费了大量时间。其中印象最为深刻的部分是:“从第二个点开始,射线的起始方向不再是水平方向,而是上一凸壳点与当前点连线方向。” 实习二图形裁切 实习目

5、的 通过对给定数据的窗口裁切,深入了解其内部快速排除机制、裁切实现、数据存储等 了解图形表达的主要方法 实习原理 其核心是剪裁函数的实现。剪裁的目的是“判断图形元素是否落在裁剪窗口之内并找出其位于内部的部分“,剪裁的处理基础是”图元关于窗口内外关系的判别“和”图元与窗口的求交“,剪裁的假定条件是”矩形剪裁窗口“和”待剪裁线段“。 这里采用Cohen-Sutherland直线裁剪算法,其基本算法思想是将每条线段P1P2按与窗口的关系,分成完全在、不完全在、完全不在三类。将不完全在线段分成两段,其中一段在窗口外可以丢弃,对另一端重复操作。 在判断线段关系的时候,采用区域码。区域码是表示直线端点相对

6、位置的4位二进制代码。四位依次为上下右左,其判别关系如下图所示。若code1=0且 code20,P1P2明显在窗口内,则“取”;若code1 & code20,P1P2明显在窗口外,则“弃”;对于两个条件都不满足的线段,在必定不完全在窗口内,这时求其余窗口边界的交点即可。 实习步骤 创建空间类系列,主要有CGeoMap,CGeoLayer,CGeoPolyline三个类,其从属关系为一个Map包含多个Layer,一个Layer包含多个Polyline,一个Polyline包含多个Point。处理了一些基本的成员变量外,这些类具有用于绘制原图及裁切后图形的draw方法、用于添加下级对象的add

7、方法、和利用给定矩形裁切图形的clip方法。 修改doc中的数据读取方法,读取的数据结构为”前两行为数据区域限制,之后为线段数据,线段数据包括线段组成点数和点坐标两个部分“。 实现clip和draw方法,完善细节。 在view中添加CGeoMap对象,在OnDraw中添加相关代码实现绘制。 编译运行并打开clipdata查看效果。 实习分析 虽然中途出现了不知名错误,但重做后完成了既定目标,实现了指定窗口的剪裁。本次实习的难点有两个,第一个是对数据结构的理解,第二个是裁切算法的时间。 通过这里理清的一个顺序是,在打开文件前系统就调用onPrepareDC设置映射,利用onFileOpen打开文

8、件后,再次执行onPrepareDC,而后执行OnDraw进行绘制。 由于存在世界坐标系到窗口坐标系的映射,因此在在每次改变窗口状态的时候,图像都强制重绘。在这里,由于图像较为复杂,因此重绘时间较长,连续改变窗口状态会造成死机。 从数据结构上讲,这一次实习开始出现了Map-Layer-Polyline的层状包含结构,在这种结构中,数据间的逻辑十分清晰。一个窗口可以打开一张地图,一张地图里面可以有多个图层,每个图层中含有多个折线,折线由多个点构成。值得注意的是这里的clipData的数据结构,该数据前两行为数据区域限制条件,之后的数据遵循“折线节点数“、”节点坐标“的形式存储,值得注意的是每个折

9、线的起始节点坐标与终止节点坐标相同。 从算法实现上来讲,印象最深刻的就是区域编码的实现方式。区域编码本身在记录时采用十进制即可,”&“运算符能够自动将十进制的区域编码转换成二进制的编码进行并运算。另外,求线段与窗口边界的运算我采用的是对两个端点分别计算,如果端点在窗口上侧就计算该线段与窗口上边界所在直线的交点,如果焦点在边界范围内就保留,否则舍弃,依次类推。这样虽然写起来略微复杂,但是思想上却相当的简单,很好实现。 另外,通过这次实习,我理清了一个顺序是,在打开文件前系统就调用onPrepareDC设置映射,利用onFileOpen打开文件后,再次执行onPrepareDC,而后执行OnDra

10、w进行绘制。同时,由于存在世界坐标系到窗口坐标系的映射,因此在在每次改变窗口状态的时候,图像都强制重绘。在这里,由于图像较为复杂,因此重绘时间较长,连续改变窗口状态会造成死机。 实习三地图投影 实习目的 给定球面坐标数据,经过投影变换到二维平面坐标,绘制相应的标准经纬线与投影后地图。 结合不同地图投影方法,比较不同投影得到图形之间的差异。 实习原理 地图投影是解决球面坐标到二维平面坐标变换的数学方法。 我国百万分之一地形图采用Lambert投影,两条标准纬线为25N和47N ,而中央经线为105E,其分幅原则与国际地理学会规定的全球统一使用的百万分之一地图投影保持一致;我国1:50万、1:25

11、万、1:10万、1:5万、1:2.5万、1:1万、1:5000采用高斯克吕格投影; 其中兰伯特投影在双标准纬线下是一种”等角正轴割投影“,而高斯克吕格投影则是一种”等角横切圆柱投影“。勃兰特投影的的正解公式为: 地理信息系统算法基础P63 实习步骤 建立地图数据结构,即创建CMap类用于地图数据存取、创建CGeoLayer类用于图层数据存取,创建CGeoObject类用于对地图目标存取。这三个类主要包含两个方法,一个是绘制方法,另一个是用于添加下一层级对象的方法。对于点坐标可以用CGeoPint类来存储,其主要方法为添加和获取坐标点的set/getPoint。 创建地图投影的投影基类CMapP

12、roject,以及对应的派生类CMapProjectionLambert,CMapProjectionMercator,CMapProjectionGK,CMapProjectionUTM。地图投影类中主要涉及的方法为”由经纬度坐标正解平面坐标X、Y”、“由平面坐标X、Y返回其对应的经纬度坐标”、“绘制经纬网”。 在view中更改文件读取函数,添加对应对象,更改Draw函数用于图像绘制。 编译运行,查看结果。 实习分析 这次实习,我并没有完全完成,就投影函数而言我只写了兰伯特投影和高斯投影,但是只有兰伯特投影能够正常运行,高斯投影无法正常运行。就经纬网绘制函数而言,我完成了经纬网绘制函数,和能

13、够绘制出经纬网的同学大体相同,但是该函数却不能正常运行。仔细检查却没有发现问题,而且本来能正常编译运行的程序不知道什么原因突然不能正常编译,更具错误列表的指示,发现错误出现在doc中,定位后却无论怎么更改也无法使之正常,无奈下我放弃寻找错。虽然这次实习没有完整的做完,但是我却依然在逐步摸索中学习到了很多东西。 我学习到的主要东西有如何编写地图投影函数,这在地图投影课程中对我起到了很大的帮助,认清了地图投影在程序上的体现实际上就是一个函数关系的事实,克服了对地图投影的恐惧。其次,这次实习让我加深了对整个MFC开发流程的理解,主要的其实就是分成两个部分,一个部分是我们自己创建自定义类实现自己想要的

14、功能,另一个则是在view中更改映射、文件读取、绘制等函数使得自定义功能能够正常运行。就地图数据结构而言,我掌握了地图、图层、地图对象三位一体的系统,其中值得注意的是地图对象可以是Point、Polyline或Polygon但是他们都可以统一成object,利用MapObject类可以派生出相对于的MapPoint,MapPolyline,MapPolygon要素类。 实习总结 匆匆地,大二下学期就这样过去了。非常开心在王明军老师的带领下学习了“地理信息系统基本算法这门课程”,这门课程实际上可以分成三个部分,第一个部分是刚开始的图形图像学,第二个部分是地理信息系统基本算法的理论基础,第三个部分

15、是用C+实现地理信息系统部分算法的实习。王明军老师总是强调这门课程的理论部分不是关键,实习部分才是真正重要的,实习中单个算法的实现与否无所谓,关键是要掌握算法实现和程序开发的基本体系和思路。对此我在刚开始时不以为意,而后随着实习的逐渐深入,我发现王老师讲的非常正确。接下来,我将从实习完成情况,个人收获,未来展望三个部分进行实习总结。 课堂中正式的实习总共是凸包、裁切、投影和索引四次。前两次实习我以极高的质量完成,并且在裁切部分中自主尝试了地图的拉框放大和双击缩小功能,投影部分我完成了兰伯特投影函数、高斯克吕格投影函数和经纬网绘制函数,但是仅有兰伯特投影能够正常运行,经纬网绘制部分我检查多次却依

16、然无法解决,最终意外损坏了整个文件。除开这四次实验室实习外,在讲解图形图像学的时候老师也布置了几次课外实习。其中我完成了三种直线绘制和圆的绘制,文字的显示与裁切,多边形的生成及其填充还有橡皮条技术和拉框绘制矩形。其中有一点给我印象深刻,在新的线条绘制前,原始线条会被取消,其取消方式是取反色重绘原始线条。 GIS实习是我学习到的东西可以分成两大类,一是思想精神上的,一是物质实践上的。思想上,我克服了编程的恐惧感,不论有多难敢做就行,同时接受了王老师的一套理论“这门课程的理论部分不是关键,实习部分才是真正重要的,实习中单个算法的实现与否无所谓,关键是要掌握算法实现和程序开发的基本体系和思路”,认识到编程需要多练。从物质实践上来讲,我掌握了三个”一”,一种语言,一种开发体系,一种实践能力。虽然在这次实习中由于种种原因我并没有做到尽善尽美,但这次实习依旧使我受益匪浅,并将帮助我更好的学习之后的专业课程。 对于未来,我认为有两点需要注意,一个是在课下持续练习编程,另一个是在课上认真听讲及时完成相关任务,高度重视每一次实习和课程。Giser的路刚刚启程,”路漫漫其修远兮,吾将上下而求索”。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号