您好,欢迎来到尔游网。
搜索
您的当前位置:首页GIS软件开发技术报告

GIS软件开发技术报告

来源:尔游网
G IS软件开发技术报告

项目内容 .............................. 1.1项 目

5 1.2项 目

6

GIS 软件底层开发 ...................... 2.1技 术 路 线 6

2.1.1需 求 分 析 6 2.1.2项 目

7 2.1.3项

5.的

6

目录1

29 2.2逻 辑 结 构

11

2.3GIS 系 统 功 能 设 计 13

2.3.1功 能 概 述13 2.3.2功 能 模 块 14

C#.NET与 AE 二次开发 ................. 3.1技 术 路 线

26

3.1.1需 求 分 析 26 3.1.2项 目

27 3.1.3项 目

28 3.2逻 辑 结 构

28

3.3GIS 系 统 功 能 设 计

2 6

3 28

3.3.1功 28 3.3.2功 能

4 总结28

9

2.

................................... GIS软件开发技术课程

实习报告

院(系)名 称: XXXXXXX 班称 : XXXXX 学 生 姓 名 : 名XXX

级 XX年 X 月 1 项目内容

1.1 项目目的

进一步了解 C++ 开发的相关知识,掌握 C++ 开 发的基本技术, 丰富 C++ 开发的实战经验。 拓展 对 C#+AE 的二次开发的认识,对接口的调用有 一定的了解,其次也是为了增强自己的团队协作 意识,了解软件开发的思考角度和主要流程

1.2 项目任务 实习一

(底层开发) 制; 检索;

:解析 MIF 、MID 文件并绘 提供图 ->属性、属性 ->图的

符号系统符合 MapInfo 显

示规范;

构建空间索引,优化图形绘

制和空间检索效率; 实习二(二次开发):SHP 数据→ MIF 数据的格 式转换

2 GIS 软件底层开发(详)

2.1 技术路线

2.1.1 需求分析 正文:(宋体小四,首行缩进 2 字

符,正文间行 距固定为 23 磅)

1) 任务概述:

本次 GIS 的底层开发任务是基于 MFC的图形绘制和检索,要求在 windows 环境下实现地图的读取、显示、基础操作(放大、缩小) 、添 加属性信息、 地图目标物索引的建立和查询, 根据个人需求使用 vs/vc , 利用 c++语言(可包括部分 c 语言)。要求软件能够正常运行,并能够 进一步做到优化和美化。

2) 数据描述: 数据输入:系统所针对的数据主要包括 mif 数据和

mid数据两种类型, 其中 mif 数据主要储存图形数据, mid 数据存储属性数据。

数据输出: mif 数据以点、线、面、特殊符号为对象以相应颜色矢量图形呈 现在窗体中, mid 数据以文字形式呈现。 3) 功能需求:

软件的功能模块划分为文件操作, 建立索引、 索引查询,符号绘制, 图-属性、属性-图的检索。几个模块均通过鼠标点击响应机制实现功能 的操作和实现。

4) 性能需求: 软件的性能尽量达到最优,包括数据的精确程度、响应时间、运行 时间都尽可能地达到最优。

5) 运行需求:

软件的运行在一般的电脑上均可正常运行, 对于软件的运行错误及 时检查和修复。

2.1.2 项目设计

1) 总体设计 根据软件的需求分析进行系统总体设

计,包括有系统设计阶段和结构设计阶段。 其中系统设计阶段主要是对组成系统的文 件、程序、文档等进行设计,确定系统的模 块组成以及模块之间的相互关系。 结构设计 则包括了功能结构、数据结构。

系统需求 根据系统的需求分析内容进行软件各

个阶段和内容的设计。

主要功能流程图:

开始

部分重绘

读取数据

鼠标松开重绘拉框选择检索

以 放大

弹出对话框

点击索引建在需要放大之立

处 拉框

选择文件

确定读取文件

绘图

根据图层名称选取符 号类库中的相应符号

2) 接口设计

用户通过在 PC机上打开软件(要求运 行环境为 windows 系统),通过对软件 功能的利用进行数据的交互处理。

系统版本必须在 Windows7 及以上。

GisApp 主应用程序必须安装在计算机

上。

必须留有足够的硬盘空间 内部接口

结束

用户接口外部接口通过打开文件方式获取数据信息, 进行 数据操作。

软件的其他操作模块基于打开后显示 的数据进行

3) 运行设计 一般的处理流程是先打开数据,

随后可 使用其他功能模块 系统运行时有较友好的界面,基本能够 实现用户的数据处理要求 系统响应时间应该符合用户的一般需 求,响应时间都应该在 10 秒之内

2.1.3 项目开发

1) 软件定义: 要求实现的软件为基于底层开发的

具有地 理数据读取和检索功能的基础地理信息软 件。

2) 相关知识

Mif 、mid 数据读取: MIF 由文件头和数据段

组成,第一部分“文件头”定义了版本信息、 字符集、投影参数坐标类型与表结构。第二 部分为“数据段”,数据段包含 MAPINFO 定 义的点、线、面、多义线、区域、圆弧、文 本、矩形、圆角矩形和椭圆等实体。 MID 属 性数据文件按 MIF 中定义的属性结构分别描 述了每个图形对象的属性内容。 网格索引:格网

型空间索引的基本思想是将研 究区域用横竖线条划分大小相等或不等的格 网,记录每一个格网所包含的空间实体。当 用户进行空间查询时,首先计算出用户查询 对象所在格网,然后再在该网格中快速查询 所选空间实体,这样一来就大大地加速了空 间索引的查询速度。 四叉树索引:四叉树索引的基本思想是将地理 空间递归划分为不同层次的树结构。它将已 知范围的空间等分成四个相等的子空间,如 此递归下去,直至树的层次达到一定深度或 者满足某种要求后停止分割。四叉树的结构 比较简单,并且当空间数据对象分布比较均 匀时,具有比较高的空间数据插入和查询效 率。

放大:图幅显示范围重新赋值和映射 ,目标 重绘

符号库:符号系统符合 MapInfo 显示规范。

3) 项目计划:

编写软件设计方案 →理解 mif 、mid 数据组 织结构 →掌握 C++/C 语言关于读取数据的 函数和语句 → 设计地图数据存储结构 → 建 立符号库 →绘制地图 → 建立索引类、索引 管理类 →初始化索引网格和网格动态数组

→查询操作

4) 项目实施: 根据软件设计书进行软件的编码与测

5) 项目交付: 第一阶段:数据的读取和绘制 第二

2.2 计,阶段:软件成果汇总

逻辑结构 程序的实现按照面向对象的算法进行设

利用 了类的封装、继承、多态性。

1) 地图数据存储的逻辑结构 2) 网格索引类

对象 ID

索引 域边界 indexBounding

索引 idxID

判断 点在矩 形内

IsInside

函数

查找 对象

SearchIndexAreaObjec

判断 线与矩 形

相 交

IsPolylineInter

索引 域 CSpatialIndexArea

3) 建立索引

开始

是否建立索 是

引是

是否建立网 格索引

设置网格行列 数、索引范围

初始化网格

将网格所覆盖 的对象加入网 格对象数组内

是否建立四 叉树索引

设置四叉树深

度、索引范围

初始化网格 将处于叶节点 的网格所覆盖 的对象加入到 网格的对象数 组内

结束

4) 索引查

开始

已选择格网索引

已选择四叉树索引 鼠标绘制矩形框

从四叉树最顶端开始

鼠标绘制矩形框

结束

遍历所有网格找出与当

矩形区域有交集的网格

对父节点进行遍历,选

与矩形有交集的节点

选出有交集的对象进行重 绘 对于以上结果网格逐一遍 历其中对象,判断是否与 当前矩形相交

对每个选中的父节点遍历 它们的子节点选出与矩形

有交集的子节点

对于选中的目标进行重绘

对于选中的叶节点遍历其 中的对象,判断与矩形是 否有交集 以选中的子节点重新做

父节点进行以上相同遍

直到叶节点结束

2.3 GIS系统功能设计

2.3.1 功能

概述

要求软件能够解析 MIF MID 文件并进行

绘制;提供图 ->属性、属性 ->图的检索;其次构 建空间索引, 实现查询操作, 优化图形绘制和空 间检索效率;其中符号系统的设计要符合

MapInfo 显示规范。

2.3.2 功能模块

1) 打开文件显示

功能描述 用于打开文件夹读取文件内容(这里为

mif 、mid 数据),并显示出来

性能 根据数据量的多少,数据打开和绘制的时 间会由实际情况的不同而有所不同。 这里 所用的数据显示时间不超过 5 秒 输入项目

在输入文件中选择要输入打开的 mif 、

mia 文件

输出项目 这里只要求数据以图形的形式显示出

来, 不要求进行其他的输出功能 算法

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 数据

geomap.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->MoveTo(pts.GetAt(0)); pDC->LineTo(pts.GetAt(i));

/////////////// 画线 pDC->TextOut(pt.x, pt.y,

*pDC)

ColumnName);

pDC->Ellipse(pt.x - 1000, pt.y -

1000, pt.x + 1000, pt.y + 1000);

//////////////

CGeoPolygon::Draw(CDC

void *pDC)

pDC->Polygon(pts.GetData(),pts.GetSize ());

接口

通过按钮和菜单进行相应函数的调用, 进 而完成数据打开和绘制功能的实现

开始

读取数据

ReadMIFData

坐标映射

OnPrepareDC(CDC* pDC, CPrintInfo*

pInfo)

读取数据

((CGeoPoint*

)obj)- >pt=CPoint

读取目标对象数 据和属性数据 CGeoObject 线

((CGeoPolyline

*)obj)- >AddPoint

((CGeoPolygo n*)obj)- >AddPoint

aw(pDC)

geoLayers.GetAt (i)->Draw(pDC)

浏览文件夹 OnFileOpen()

图层 layer- >AddObject(obj)

geoObjts.Get At(i)- >Draw(pDC) 地图

geomap.AddLayer

(layer)

CGeoPoint::D raw(CDC* pDC)

CGeoPolyline: :Draw(CDC *pDC) CGeoPolygon: :Draw(CDC *pDC)

读取文件夹

画图

OnOpenFolder

结束

条件

打开的数据量不能过大, 否则会引起系统 反应延时等情况;

打开数据类型为 mif 和 mid 数据。

2) 建立索引 功能描述 对于网格索引而言, 建

立 m×n的格网(这 里在程序内部赋值) ,对每一个网格,遍 历所有对象并进行判断, 若对象与当前格 网相交或包含于格网中, 则将对象存储在 网格的对象数组中。

对于四叉树索引,设定子节点网格的对象 数目阈值,要求每一个处于子节点的网格 数组

所包含的数量都不低于这个阈值, 即 每做一次网格的四象限划分都进行一次 判断。 性能 格网索引适合于数据量较大的项目建立 相应索引,建立的效率高; 四叉树索引适 合于数据量一般,索引的建立略显麻烦。 输入项目

鼠标操作指令。 输出项目 索引的建立和绘制 算法 建立索引

void

CTESTGISView::OnGridIndex()

geomap.IntlzIdxArea(

a, b);// 传递索引行列数

spatialIndex->SetSpa

tialIndex(wcRect, x, y);// 设置索引 参

geoLayer->InitlizeId

xArea();// 初始化索引动态数组

////////////////////

点状目标

if

(area->IsPolygonInter(rectMIN,area->index Bounding))// 判断目标与当前格网区域是否相 交

{

area->AddObj(obj);// 加入目标

}

////////////////////

线状目标 if (area->IsPolylineInter(pt1,

pt2, area->indexBounding))

{

area->AddObj(obj);// 加入目标

}

////////////////////

面状目标 if (area->IsInside(pt,

area->indexBounding))

area->AddObj(obj);// 加入目标

geomap.spatialIndex-

>Draw(pDC);绘制网格

接口 通过按钮和菜单进行相应函数的调

用, 完

成相应索引类型的建立

开始

建立索引

OnGridIndex ()

设置索引行列

数、 范围 创建索引 CreateIndexArea SetSpatialInde

x()

初始化索引 IntlzIdxArea

()

绘制索引窗格

spatialIndex >Draw( pDC) ( )初始化索引动态

数 组

InitlizeIdxAre

a() 条件 格网索引的行列数和四叉树索引的深度 都在程序内部实现了设置, 大大缩小了程 序的适用范围和使用适度

3) 索引查询

功能描述

获取鼠标在屏幕上绘制的矩形, 对于网格 索引,逐一遍历网格, 判断矩形区域与当 网格

是否有交集,若有交集则对当前网格 内所包含的所有对象逐一遍历, 判断是否 与矩形区域有交集,若有交集则对该目标 进行重绘且颜色要有所改变以区分其他 未被选中的目标; 对于四叉树索引, 由父节点开始, 若有交 集,则遍历此父节点的子节点, 对每一个 子节点做同样的父节点处理, 直到到达叶 节点结束,对于所有与矩形区域有交集的 子节点网格, 逐一遍历其中的对象, 判断 是否与矩形区域有交集, 若有交集则对该 目标进行重绘且颜色要有所改变以区分 其他未被选中的目标;

性能 网格索引查询适合于数据量大的项目, 查 询算法简单,查询效率高, 四叉树索引适 合数据量相对较小的项目,查询效率高 输入项目 根据鼠标在屏幕上的绘制输入框选矩形 输出项目

对于被选中的目标进行重绘 算法

void

CTESTGISView::BoxSelected()

geomap.spatialIndex->SearchIn

dexArea(&rect);

int

);

for (int i = 0; i < size; i++)

{

size =

geomap.spatialIndex->SIndexAreas.GetSize(

indexArea =

geomap.spatialIndex->SIndexAreas.GetAt(i)

indexArea->SearchIndexObj(&rect,

dc);

}

//////////////////////

// 重绘点

if (IsInside(pt, rect))

{

((CGeoPoint*)obj)->Draw(pDC);

}

//////////////////////

// 重绘线

if (IsPolylineInter(pt1, pt2,

rect))

{

((CGeoPo

lyline*)obj)->Draw(pDC);

}

//////////////////////

/// 重绘面 if

(IsPolygonInter(rect1,rect))

((CGeoPolygon *)obj)->Draw(pDC); 接口

通过鼠标点击和菜单进行相应函数的调 用,完成相应索引类型的建立

开始

鼠标松开 OnLButtonUp

拉框 BoxSelected()

查询目标 SearchIndexOb j(CRect *rect, CDC *pDC) 鼠标按下

OnLButtonDown

记录与矩形相

交 格网

SearchIndexAr ea(CRect *rect)

重绘 obj)- >Draw(pDC)

条件

目前程序只能满足拉框检索

4)放大

功能描述

选择拉框放大菜单选项, 用鼠标在屏幕需 要进行放大的地方绘制合适的矩形框, 鼠 标松开即可实现放大操作 性能

由于所显示的地图内容均为矢量数据, 并 且地图的放大操作是基于重绘实现的, 所 以放大操作所用的时间依赖于数据量的 大小 输入项目

鼠标在屏幕绘制矩形框 输出项目

{

- pt2.y)<2) return;

pt2.x : pt1.x;

pt2.x : pt1.x;

pt2.y : pt1.y;

pt2.y : pt1.y;

放大后得到的局部图像 算法 void

CTESTGISView::OnEnlarge() if (isLarge)

if (abs(pt1.x - pt2.x)<2 || abs(pt1.y

geomap.wcRect.left = pt1.x>pt2.x ?

geomap.wcRect.right = pt1.xgeomap.wcRect.bottom = pt1.ygeomap.wcRect.top = pt1.y>pt2.y ?

Invalidate();

}

接口

通过鼠标点击菜单选项和屏幕操作

开始

拉框放大

OnEnlarge ()

地图显示区域变

重绘 Invalidate () 结束 条件 只实现了拉框放大,其他放大功能未实现

3 C#.NET与 AE 二次开发(略)

3.1 技术路线 3.1.1 需求分析

1) 任务概述:

本次 GIS 的二次开发任务是基于 C#与 AE的数据格式转换,要求在 windows 环境下实现 shp 数据的读取、 shp 数据转换为 mif 数据。

2) 数据描述: 数据输入:输入 shp 数据 数据输出:数据输出为

mif 数据格式

3) 功能需求: 软件的功能要求实现 shp 数据的读取和 shp 数据转

换为 mif 数据

4) 性能需求: 软件的性能尽量达到最优,包括数据的精确程度、响应时间、运行 时间都尽可能地达到最优。

5) 运行需求:

软件的运行在一般的电脑上均可正常运行, 对于软件的运行错误及 时检查和修复。

3.1.2 项目设计

1) 设计思想:二次开发使用 vs 开发环境加以实

现,并使用了 ESRI interop 程序集,它服务 于被放置在 .NET 窗体上的、位于 .NET 窗体

控件中的 ArcGIS 控件,这些程序集在托管 的.NET 代码和非托管的 COM 代码之间起了 桥梁作用。

2) 主要功能流程: 开始→读取数据→弹出对话框

→选择 shp 文件→确定→保存→选择保存路径及输入 mif 文件名→确定→转化→结束

3) 接口设计: 输入shp文件路径

OpenFileDialog ()

string fullpath = 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(fullpath);

Mifname = System.IO. Path .GetFileNameWithoutExtension(fullpath); textOutMif.Text = fullpath;

格式转换

StreamWriter myWrite = new StreamWriter (myStream);// 写文件 IWorkspace pWS = pWSF.OpenFromFile(fullpath, 0)//

打开工作空间

// 打开要素

IFeatureClass pFeatureClass = pFWS.OpenFeatureClass(filename);

IFeatureCursor pFeatureCursor = pFeatureClass.Search(

null , false );// 逐一

要 素访问

写文件头 /////////// if (geotype == esriGeometryType .esriGeometryPoint)// 点

else if (geotype == esriGeometryType .esriGeometryPolyline)// else if (geotype == esriGeometryType .esriGeometryPolygon)// myWrite.WriteLine () ;

3.1.3 项目开发 3.2 逻辑结构

开始

开始转换

输入文件路

径、名称

打开工作空间 写文件信息

IWorkspace Factory myWrite.Wr iteLine

Shapepath 、Shapename 输出文件路 径、名称 Mifpath 、 Mifname

3.3 GIS系统功能设计

3.3.1 功能概述

输入 shp 文件路径,输出 mif 文件路径, 进

行格式转换

3.3.2 功能模块 系统设计阶段和结构设计阶段。

其中系统设计阶 段主要是对组成系统的文件、 程序、文档等进行 设计,确定系统的模块组成以及模

块之间的相互 关系。结构设计则包括了功能结构、数据结构。

根据软件的需求分析进行系统总体设计, 包括有

1) 读取 shp文件

利用 Iworkspace 接口来对 Gis 中的数据库 文件进行操作,因为 shp 文件是点集集合、 数据集合和其索引文件的集合,所以需要 通过专门的接口来实现。

2) 写入 mif 数据 通过接口调用函数,判断读取

信息类型, 根据不同类型信息编辑数据

4 总结 本次实习我主要操作

了底层开发的内容, 从读取 mif 数据开始逐渐从基础学起,通过网上查阅和 反复询问,尝试和反复修改逐渐在编写程序的过 程中理解其中的逻辑结构和语法, 在实习的中段 开始认识到一直困惑和为难的函数和语句的使 用其实并非很关键,重要的是编程的思路要理 清,对类的封装和调用之间的关系要清楚, 而需 要用到哪些函数或功能可以查阅相关资料和示

例,理解之后转换为自己的内容即可

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务