《2022年GIS软件开发技术报告 .pdf》由会员分享,可在线阅读,更多相关《2022年GIS软件开发技术报告 .pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目录1项目内容 . 31.1项目目的 . 31.2项目任务 . 32GIS 软件底层开发. 32.1技术路线 . 32.1.1需求分析 . 32.1.2项目设计 . 42.1.3项目开发 . 52.2逻辑结构 . 52.3GIS 系统功能设计. 72.3.1功能概述 . 72.3.2功能模块 . 83C#.NET与 AE二次开发 . 14 3.1技术路线 . 14 3.1.1需求分析 . 14 3.1.2项目设计 . 15 3.1.3项目开发 . 15 3.2逻辑结构 . 15 3.3GIS 系统功能设计. 16 3.3.1功能概述 . 16 3.3.2功能模块 . 16 4总结 . 16 名
2、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 16 页 - - - - - - - - - GIS软件开发技术课程实习报告院(系)名称: XXXXXXX 班级名称: XXXXX 学生姓名: XXX XX年 X月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 16 页 - - - - - - - - - 1 项目内容1.1 项目目的进一步了解C+ 开发
3、的相关知识,掌握C+ 开发的基本技术,丰富C+开发的实战经验。拓展对 C#+AE 的二次开发的认识,对接口的调用有一定的了解,其次也是为了增强自己的团队协作意识,了解软件开发的思考角度和主要流程。1.2 项目任务实习一(底层开发) :解析 MIF 、MID 文件并绘制;提供图 -属性、属性 -图的检索;符号系统符合MapInfo 显示规范;构建空间索引,优化图形绘制和空间检索效率;实习二(二次开发) :SHP 数据 MIF 数据的格式转换2 GIS软件底层开发(详)2.1 技术路线2.1.1需求分析正文: (宋体小四,首行缩进2 字符,正文间行距固定为23 磅)1)任务概述:本次 GIS 的底
4、层开发任务是基于MFC的图形绘制和检索,要求在windows 环境下实现地图的读取、显示、基础操作(放大、缩小)、添加属性信息、地图目标物索引的建立和查询,根据个人需求使用vs/vc ,利用 c+语言(可包括部分 c 语言) 。要求软件能够正常运行, 并能够进一步做到优化和美化。2)数据描述:数据输入:系统所针对的数据主要包括mif 数据和 mid 数据两种类型,其中 mif 数据主要储存图形数据,mid 数据存储属性数据。数据输出: mif数据以点、线、面、特殊符号为对象以相应颜色矢量图形呈现在窗体中, mid 数据以文字形式呈现。3)功能需求:软件的功能模块划分为文件操作, 建立索引、索引
5、查询,符号绘制,图-属性、属性 -图的检索。几个模块均通过鼠标点击响应机制实现功能的操作和实现。4)性能需求:软件的性能尽量达到最优,包括数据的精确程度、响应时间、运行时间都尽可能地达到最优。5)运行需求:软件的运行在一般的电脑上均可正常运行,对于软件的运行错误及时检查和修复。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 16 页 - - - - - - - - - 2.1.2项目设计1)总体设计根据软件的需求分析进行系统总体设计,包括有系统设计阶段和结构设计阶段。其中
6、系统设计阶段主要是对组成系统的文件、程序、文档等进行设计,确定系统的模块组成以及模块之间的相互关系。结构设计则包括了功能结构、数据结构。系统需求根据系统的需求分析内容进行软件各个阶段和内容的设计。主要功能流程图:开始读取数据弹出对话框选择文件确定读取文件绘图是否建立索引是点击索引建立否拉框选择检索部分重绘是否拉框放大是在需要放大之处拉框鼠标松开重绘以放大否结束根据图层名称选取符号类库中的相应符号2)接口设计用户接口用户通过在PC机上打开软件 (要求运行环境为windows 系统),通过对软件功能的利用进行数据的交互处理。外部接口系统版本必须在Windows7 及以上。GisApp 主应用程序必
7、须安装在计算机上。必须留有足够的硬盘空间。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 16 页 - - - - - - - - - 内部接口通过打开文件方式获取数据信息,进行数据操作。软件的其他操作模块基于打开后显示的数据进行3)运行设计一般的处理流程是先打开数据,随后可使用其他功能模块系统运行时有较友好的界面,基本能够实现用户的数据处理要求系统响应时间应该符合用户的一般需求,响应时间都应该在10 秒之内2.1.3项目开发1)软件定义:要求实现的软件为基于底层开发的具
8、有地理数据读取和检索功能的基础地理信息软件。2)相关知识Mif 、mid 数据读取: MIF 由文件头和数据段组成,第一部分“文件头”定义了版本信息、字符集、投影参数坐标类型与表结构。第二部分为“数据段”,数据段包含 MAPINFO 定义的点、线、面、多义线、区域、圆弧、文本、矩形、圆角矩形和椭圆等实体。MID 属性数据文件按MIF 中定义的属性结构分别描述了每个图形对象的属性内容。网格索引:格网型空间索引的基本思想是将研究区域用横竖线条划分大小相等或不等的格网,记录每一个格网所包含的空间实体。当用户进行空间查询时,首先计算出用户查询对象所在格网,然后再在该网格中快速查询所选空间实体,这样一来
9、就大大地加速了空间索引的查询速度。四叉树索引:四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比较高的空间数据插入和查询效率。放大:图幅显示范围重新赋值和映射,目标重绘符号库:符号系统符合MapInfo 显示规范。3)项目计划:编写软件设计方案 理解 mif 、 mid 数据组织结构 掌握 C+/C 语言关于读取数据的函数和语句 设计地图数据存储结构建立符号库 绘制地图 建立索引类、索引管理类 初始化索引网格和网格动
10、态数组查询操作4)项目实施:根据软件设计书进行软件的编码与测试5)项目交付:第一阶段:数据的读取和绘制第二阶段:软件成果汇总2.2 逻辑结构程序的实现按照面向对象的算法进行设计,利用了类的封装、继承、多态性。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 16 页 - - - - - - - - - 1)地图数据存储的逻辑结构2)网格索引类3)建立索引CGeoMapCGeoLayer1CGeoLayer2CGeoObjectCGeoPointCGeoPolylineCGe
11、oPolygonCgeoAnno索引 域CSpatialIndexArea()变量函数对象 ID索引 idxID索引 域边界 indexBounding判断 矩形相 交IsPolygonInter判断 点在矩形内IsInside判断 线与矩形相 交IsPolylineInter查找 对象SearchIndexAreaObject绘制 索引格 Draw( CDC* pDC )添加 对象标 志AddID索引 管理CSpatialIndex()变量行列 数m,n索引 范围indexRect索引 数组idxAreas查找 索引域SIndexAreas函数绘制 Draw(CDC *pDC)创建 索引Cr
12、eateIndexArea()设置 索引SetSpatialIndex添加 索引域AddIndexArea查询 索引域SearchIndexArea名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 16 页 - - - - - - - - - 开始是否建立索引是是否建立网格索引是设置网格行列数、索引范围初始化网格将网格所覆盖的对象加入网格对象数组内否是否建立四叉树索引否结束否设置四叉树深度、索引范围初始化网格将处于叶节点的网格所覆盖的对象加入到网格的对象数组内4)索引查询开
13、始已选择格网索引否已选择四叉树索引否结束是鼠标绘制矩形框遍历所有网格找出与当前矩形区域有交集的网格对于以上结果网格逐一遍历其中对象,判断是否与当前矩形相交对于选中的目标进行重绘鼠标绘制矩形框从四叉树最顶端开始对父节点进行遍历,选出与矩形有交集的节点对每个选中的父节点遍历它们的子节点选出与矩形有交集的子节点以选中的子节点重新做为父节点进行以上相同遍历直到叶节点结束对于选中的叶节点遍历其中的对象,判断与矩形是否有交集选出有交集的对象进行重绘2.3 GIS系统功能设计2.3.1功能概述要求软件能够解析MIF 、MID 文件并进行绘制;提供图 -属性、 属性 -图的检索; 其次构建空间索引, 实现查询
14、操作, 优化图形绘制和空间检索效率;其中符号系统的设计要符合MapInfo 显示规范。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 16 页 - - - - - - - - - 2.3.2功能模块1)打开文件显示功能描述用于打开文件夹读取文件内容(这里为mif 、mid 数据),并显示出来性能根据数据量的多少,数据打开和绘制的时间会由实际情况的不同而有所不同。这里所用的数据显示时间不超过5 秒输入项目在输入文件中选择要输入打开的mif 、mia 文件输出项目这里只要求数
15、据以图形的形式显示出来,不要求进行其他的输出功能算法SHGetPathFromIDList(pList, szPath) / 把指定的文档或目录地点转换为文档系统路径OnOpenFolder(szPath);/通过路径打开文件夹MIFPaths.Add(finder.GetFilePath();/ 列举所有的在当前目录下的文件,并且将他们的文件名存储在数组里面ReadMIFData(MIFPaths.GetAt(i);/逐个读取文件_wfopen_s(&fp, MIFData, _T(r);/打开 mif 数据_wfopen_s(&fp1, MIDData, _T(r);/打开 mid 数据g
16、eomap.AddLayer(layer);/ 逐图层添加layer-AddObject(obj);/ 逐对象添加(CGeoPolyline *)obj)-AddPoint(CPoint(x1, y1);/线的坐标数据(CGeoPoint*)obj)-pt=CPoint(x1,y1);/点的坐标数据(CGeoPolygon*)obj)-AddPoint(CPoint(x1, y1);/面的坐标数据geomap.wcRect = mapRect;/获得图幅显示范围/ 画线void CGeoPolyline:Draw(CDC *pDC) pDC-MoveTo(pts.GetAt(0); pDC-L
17、ineTo(pts.GetAt(i); / 画线pDC-TextOut(pt.x, pt.y, ColumnName); pDC-Ellipse(pt.x - 1000, pt.y - 1000, pt.x + 1000, pt.y + 1000); / 画面void CGeoPolygon:Draw(CDC *pDC) pDC-Polygon(pts.GetData(),pts.GetSize(); 接口通过按钮和菜单进行相应函数的调用,进而完成数据打开和绘制功能的实现。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心
18、整理 - - - - - - - 第 8 页,共 16 页 - - - - - - - - - 开始读取数据浏览文件夹OnFileOpen()读取文件夹OnOpenFolder读取数据ReadMIFData读取目标对象数据和属性数据CGeoObject线(CGeoPolyline *)obj)-AddPoint点(CGeoPoint*)obj)-pt=CPoint面(CGeoPolygon*)obj)-AddPoint图层 layer-AddObject(obj)地图geomap.AddLayer(layer)画图geomap.Draw(pDC)geoLayers.GetAt(i)-Draw(
19、pDC)geoObjts.GetAt(i)-Draw(pDC)CGeoPoint:Draw(CDC* pDC)CGeoPolyline:Draw(CDC *pDC)CGeoPolygon:Draw(CDC *pDC)坐标映射OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)结束限制条件打开的数据量不能过大,否则会引起系统反应延时等情况;打开数据类型限制为mif 和 mid 数据。2)建立索引功能描述对于网格索引而言, 建立 m n 的格网(这里在程序内部赋值), 对每一个网格,遍历所有对象并进行判断,若对象与当前格网相交或包含于格网中,则将对象存储在网格的对象数组
20、中。对于四叉树索引, 设定子节点网格的对象数目阈值,要求每一个处于子节点的网格数组所包含的数量都不低于这个阈值,即每做一次网格的四象限划分都进行一次判断。性能格网索引适合于数据量较大的项目建立相应索引,建立的效率高; 四叉树索引适合于数据量一般,索引的建立略显麻烦。输入项目鼠标操作指令。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 16 页 - - - - - - - - - 输出项目索引的建立和绘制算法建立索引void CTESTGISView:OnGridIndex
21、() geomap.IntlzIdxArea(a, b);/ 传递索引行列数spatialIndex-SetSpatialIndex(wcRect, x, y);/ 设置索引参数geoLayer-InitlizeIdxArea();/ 初始化索引动态数组/点状目标if (area-IsPolygonInter(rectMIN,area-indexBounding)/判断目标与当前格网区域是否相交 area-AddObj(obj);/ 加入目标 /线状目标if (area-IsPolylineInter(pt1, pt2, area-indexBounding) area-AddObj(obj)
22、;/ 加入目标 /面状目标if (area-IsInside(pt, area-indexBounding) area-AddObj(obj);/ 加入目标 geomap.spatialIndex-Draw(pDC); 绘制网格接口通过按钮和菜单进行相应函数的调用,完成相应索引类型的建立名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 16 页 - - - - - - - - - 开始建立索引OnGridIndex ()初始化索引IntlzIdxArea()设置索引行列数
23、、范围SetSpatialIndex()初始化索引动态数组InitlizeIdxArea()创建索引CreateIndexArea()绘制索引窗格spatialIndex-Draw( pDC )限制条件格网索引的行列数和四叉树索引的深度都在程序内部实现了设置,大大缩小了程序的适用范围和使用适度3)索引查询功能描述获取鼠标在屏幕上绘制的矩形,对于网格索引, 逐一遍历网格, 判断矩形区域与当网格是否有交集,若有交集则对当前网格内所包含的所有对象逐一遍历,判断是否与矩形区域有交集,若有交集则对该目标进行重绘且颜色要有所改变以区分其他未被选中的目标;对于四叉树索引,由父节点开始, 若有交集, 则遍历此
24、父节点的子节点,对每一个子节点做同样的父节点处理,直到到达叶节点结束,对于所有与矩形区域有交集的子节点网格,逐一遍历其中的对象,判断是否与矩形区域有交集,若有交集则对该目标进行重绘且颜色要有所改变以区分其他未被选中的目标;性能网格索引查询适合于数据量大的项目,查询算法简单, 查询效率高, 四叉树索引适合数据量相对较小的项目,查询效率高输入项目根据鼠标在屏幕上的绘制输入框选矩形输出项目名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 16 页 - - - - - - - -
25、 - 对于被选中的目标进行重绘算法void CTESTGISView:BoxSelected() geomap.spatialIndex-SearchIndexArea(&rect); int size = geomap.spatialIndex-SIndexAreas.GetSize(); for (int i = 0; i SIndexAreas.GetAt(i); indexArea-SearchIndexObj(&rect, dc); /重绘点if (IsInside(pt, rect) (CGeoPoint*)obj)-Draw(pDC); /重绘线if (IsPolylineInt
26、er(pt1, pt2, rect) (CGeoPolyline*)obj)-Draw(pDC); /重绘面if (IsPolygonInter(rect1,rect) (CGeoPolygon *)obj)-Draw(pDC); 接口通过鼠标点击和菜单进行相应函数的调用,完成相应索引类型的建立名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 16 页 - - - - - - - - - 开始拉框BoxSelected()鼠标按下OnLButtonDown鼠标松开OnLB
27、uttonUp记录与矩形相交格网SearchIndexArea(CRect *rect)查询目标SearchIndexObj(CRect *rect, CDC *pDC)重绘obj)-Draw(pDC)限制条件目前程序只能满足拉框检索4)放大功能描述选择拉框放大菜单选项, 用鼠标在屏幕需要进行放大的地方绘制合适的矩形框,鼠标松开即可实现放大操作性能由于所显示的地图内容均为矢量数据,并且地图的放大操作是基于重绘实现的,所以放大操作所用的时间依赖于数据量的大小输入项目鼠标在屏幕绘制矩形框输出项目放大后得到的局部图像算法void CTESTGISView:OnEnlarge() if (isLarg
28、e) if (abs(pt1.x - pt2.x)2 | abs(pt1.y - pt2.y)pt2.x ? pt2.x : pt1.x; geomap.wcRect.right = pt1.xpt2.x ? pt2.x : pt1.x; geomap.wcRect.bottom = pt1.ypt2.y ? pt2.y : pt1.y; Invalidate(); 接口通过鼠标点击菜单选项和屏幕操作开始拉框放大OnEnlarge ()地图显示区域变换重绘Invalidate()结束限制条件只实现了拉框放大,其他放大功能未实现3 C#.NET与 AE二次开发(略)3.1 技术路线3.1.1需求
29、分析1)任务概述:本次 GIS的二次开发任务是基于C# 与 AE的数据格式转换,要求在windows 环境下实现 shp 数据的读取、 shp 数据转换为 mif 数据。2)数据描述:数据输入:输入 shp 数据数据输出:数据输出为mif 数据格式3)功能需求:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 16 页 - - - - - - - - - 软件的功能要求实现shp 数据的读取和 shp 数据转换为 mif 数据4)性能需求:软件的性能尽量达到最优,包括数据
30、的精确程度、响应时间、运行时间都尽可能地达到最优。5)运行需求:软件的运行在一般的电脑上均可正常运行,对于软件的运行错误及时检查和修复。3.1.2项目设计1)设计思想:二次开发使用vs 开发环境加以实现,并使用了ESRI interop 程序集,它服务于被放置在.NET 窗体上的、 位于 .NET 窗体控件中的ArcGIS 控件,这些程序集在托管的.NET 代码和非托管的COM 代码之间起了桥梁作用。2)主要功能流程:开始读取数据弹出对话框选择shp 文件确定保存选择保存路径及输入 mif 文件名确定转化结束3)接口设计:输入 shp文件路径OpenFileDialog () string f
31、ullpath = fd.FileName;/ 文件路径名Shapepath = System.IO.Path.GetDirectoryName(fullpath);/ 得到文件的路径名Shapename = System.IO. Path.GetFileNameWithoutExtension(fullpath);/ 不包括后缀的文件名textInShape.Text = fullpath; 输出 mif 文件路径SaveFileDialog() string fullpath = sf.FileName; Mifpath = System.IO.Path.GetDirectoryName(
32、fullpath); Mifname = System.IO.Path.GetFileNameWithoutExtension(fullpath); textOutMif.Text = fullpath; 格式转换StreamWriter myWrite = newStreamWriter (myStream);/写文件IWorkspace pWS = pWSF.OpenFromFile(fullpath, 0)/打开工作空间IFeatureClass pFeatureClass = pFWS.OpenFeatureClass(filename);/ 打开要素类IFeatureCursor p
33、FeatureCursor = pFeatureClass.Search(null , false );/逐一要素访问写文件头 / if (geotype = esriGeometryType .esriGeometryPoint)/点elseif (geotype = esriGeometryType .esriGeometryPolyline)/线elseif (geotype = esriGeometryType .esriGeometryPolygon)/面myWrite.WriteLine() ; 3.1.3项目开发3.2 逻辑结构名师资料总结 - - -精品资料欢迎下载 - - -
34、 - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 16 页 - - - - - - - - - 开始输入文件路径、名称Shapepath、Shapename输出文件路径、名称Mifpath 、Mifname开始转换打开工作空间IWorkspaceFactory写文件信息myWrite.WriteLine3.3 GIS系统功能设计3.3.1功能概述输入 shp文件路径,输出mif 文件路径,进行格式转换3.3.2功能模块根据软件的需求分析进行系统总体设计,包括有系统设计阶段和结构设计阶段。其中系统设计阶段主要是对组成系统的文
35、件、程序、 文档等进行设计,确定系统的模块组成以及模块之间的相互关系。结构设计则包括了功能结构、数据结构。1)读取 shp文件利用 Iworkspace 接口来对Gis 中的数据库文件进行操作,因为shp 文件是点集集合、数据集合和其索引文件的集合,所以需要通过专门的接口来实现。2)写入 mif 数据通过接口调用函数,判断读取信息类型,根据不同类型信息编辑数据4 总结本次实习我主要操作了底层开发的内容,从读取 mif 数据开始逐渐从基础学起,通过网上查阅和反复询问, 尝试和反复修改逐渐在编写程序的过程中理解其中的逻辑结构和语法,在实习的中段开始认识到一直困惑和为难的函数和语句的使用其实并非很关键,重要的是编程的思路要理清, 对类的封装和调用之间的关系要清楚,而需要用到哪些函数或功能可以查阅相关资料和示例,理解之后转换为自己的内容即可。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 16 页 - - - - - - - - -