GIS设计与开发的学习笔记

目录

一、简答题

1.GeoDatabase数据模型结构类型与四种关系。

2.组件式GIS的基本思想是什么?

3.请简述创建空间书签的实现逻辑。

4.请问与地理要素编辑相关的类有哪些?(列举至少五个类)

5.利用ArcGIS Engine提供的栅格运算工具,请简述如何实现一个栅格计算器的思路?

6.请简述地理数据列表显示的实现逻辑。

7.请简述通过接口调用某一方法前需要做什么准备工作?

8.请简述图层的基本渲染的实现思路。

9.请简述如何创建一个Shapefile文件,要用到哪些类库文件?

三、功能实现题

10.现需要实现将一个要素类转换到地理空间数据库的某个要素类的这一功能,请参看FeatureDataConverter组件类图,要通过什么接口调用什么方法来达到这一目标?请写出关键的代码,并说明所调用的方法需要哪些输入参数。

11.如类库Workspacefactory与类Workspace关系图所示,要创建一个workspace对象应该如何实现,写出关键代码。

12.如类RasterHydrologyOp所示,现需计算对某一栅格数据图层进行流向计算,应该如何实现?请写出关键代码。(功能实现)

三、思考题

1.GIS开发有哪些开发模式?你是如何理解这些不同模式的开发?它们之间有联系吗?

2.围绕GIS系统开发为主题,阐述开发过程中需要涉及到的理论与思想,并结合目前GIS开发的最新前沿及应用需求,作为开发人员应该如何开发具有一定生命力、易于后期维护、人机交互友好型的GIS行业应用系统?


一、简答题

1.GeoDatabase数据模型结构类型与四种关系。

三个类

①抽象类:不能用以创建对象,但可以用来指定子类 。

②组件类:能够直接用new方法创建对象的类。

③普通类:自己不能创建对象,只能由别人创建它的对象的类。

四种关系

①依赖关系(可实例化):表示一个对象可以产生(实例化)另外一个对象。

②关联关系:指从一个类的对象访问到另外一个类的对象,它是一种松散的关系。

③组合关系:指其中的一个类对象是另外一个类对象的组成部分,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

④继承关系:同面向对象中的继承。父类不能直接产生类对象,只能通过派生子类的方法来实现自己,是一种比较强的关系。

2.组件式GIS的基本思想是什么?

把GIS的各种功能模块进行分类,划分为不同类型的控件,每个控件完成各自相应的功能;各个GIS控件之间以及GIS控件与其他非GIS控件之间可以方便地通过可视化的软件开发工具集成起来,形成满足用户特定功能需求的GIS应用系统。

3.请简述创建空间书签的实现逻辑。

①在主窗体添加“创建书签”的控件和添加用来保存已创建的书签名的组合框控件,并添加相应引用(Geometry)。

②在主窗体类中添加“创建书签”的函数CreateBookmark(string sBookmarkName),在函数中,通过IAOBookmark接口创建一个变量,用于保存当前地图的范围;通过IMapBookmarks接口访问当前地图,并向地图中加入新建书签;最后将书签名加入组合框中。

③添加“书签名称设置”窗体,添加设置“书签名称”的“文本框”控件和“确定”按钮控件,在此窗体中创建一个用于保存主窗体的对象,并在“确定”按钮的“点击”事件响应函数中调用CreateBookmark函数创建书签。

④为主窗体“创建书签”按钮生成“点击”事件响应函数,用于运行"书签名称设置"功能。

4.请问与地理要素编辑相关的类有哪些?(列举至少五个类)

①Point②Editor③Display④Geometry⑤Polygon⑥Polyline

5.利用ArcGIS Engine提供的栅格运算工具,请简述如何实现一个栅格计算器的思路?

①在主窗体创建一个名为“栅格计算器”的控件。

②添加“栅格计算器参数设置”窗体,并添加相应引用,添加“打开文件”按钮,用于选择输入的栅格文件,添加一个“文本框”,用于输入计算表达式,计算表达式可以是数学运算和函数运算 ,添加一个“计算”按钮,当用户点击该按钮时,程序会读取输入的计算表达式,使用RasterMathSupportOp类中的方法计算表达式的结果,并将返回结果存储为一个新的栅格文件。

③为主窗体“栅格计算器”按钮生成“点击”事件响应函数,用于运行“栅格计算器参数设置”功能。

6.请简述地理数据列表显示的实现逻辑。

①在主窗体添加“访问图层数据”的控件。

②添加“数据展示台”窗体,在此窗体添加用来显示表名的“文本框”控件和用来显示表格的“数据网格视图”。

③添加“数据操作”类,并添加相应引用(Carto,Geometry,Geodatabase,DataSourceFile),在此窗体中创建一个保存当前地图的对象。

④在“数据操作”类中添加“获取地图图层”功能,添加GetLayerByName(string sLayerName)函数得到指定的图层对象,添加GetDataTableByLayer()函数处理图层对象得到的DataTable对象。

⑤为“访问图层数据”控件生成“点击”事件响应函数,调用“数据操作”工具得到DataTable对象,然后调用“数据展示”工具传入DataTable对象,实现创建地理数据列表功能。

7.请简述通过接口调用某一方法前需要做什么准备工作?

①添加该接口的引用。

②获取调用该方法的对象。

③设置接口属性。

④调用接口方法,如果该方法需要的参数,则准备好需要的参数。

8.请简述图层的基本渲染的实现思路。

①在主窗体添加“简单渲染图层”的控件。

②添加“地图编制”类,添加相应引用(Carto,Geometry,Geodatabase,Display)。

③完善“地图编制”类,添加GetLayerByName(string sLayerName)函数用于获取指定的图层对象,添加GetSymbolFromLayer(ILayer layer)函数用于获取图层的符号信息,添加RenderSimplfy(ILayer layer,IColor color)函数用于设置指定图层符号的颜色,并进行简单渲染。

④为“简单渲染图层”控件生成“点击”事件响应函数,调用相应函数获取图层对象,再获取符号对象,设置颜色对象,调用简单渲染函数进行渲染。

9.请简述如何创建一个Shapefile文件,要用到哪些类库文件?

①在主窗体添加“创建Shapefile文件”的控件。

②添加“数据操作”类,并添加相应引用(Geodatabase,DataSourceFile),获取当前地图对象。

③在“数据操作”类中添加“创建shape文件”函数CreateShapfile(String sParentDirectory,String sWorkspaceName,String sFileName),通过指定的上级路径,包含shape文件的文件夹名,shape文件名,创建并编辑“序号”、“名称”和“形状”等字段,创建shape文件。

④为“创建Shapefile文件”控件添加“点击”事件响应函数,调用函数创建shape文件。

三、功能实现题

10.现需要实现将一个要素类转换到地理空间数据库的某个要素类的这一功能,请参看FeatureDataConverter组件类图,要通过什么接口调用什么方法来达到这一目标?请写出关键的代码,并说明所调用的方法需要哪些输入参数。

IFeatureDataConverter接口

ConvertFeatureClass()方法

关键代码:

//装载数据转换类,实现数据转换

IFeatureDataConverter fctofc = new FeatureDataConverterClass();

IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(

    sourceFeatureClassName, queryFilter, null, targetFeatureClassName,

    geometryDef, targetFeatureClassFields, "", 1000, 0);

//装载数据转换类,实现数据转换
IFeatureDataConverter fctofc = new FeatureDataConverterClass();
IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, null, targetFeatureClassName,geometryDef, targetFeatureClassFields, "", 1000, 0);

调用方法参数:

ConvertFeatureClasss(

    IFeatureClassName InputDatasetName,//输入数据集的名称

    IQueryFilter InputQueryFilter,//输入查询过滤器的名称

    IFeatureDatasetName outputFDatasetName,//输出数据集的名称

    IFeatureClassName outputFClassName,//输出特征类的名称

    IGeometryDef OutputGeometryDef,//输出的几何定义

    IFields OutputFields,//输出的字段

    string configKey,//配置键

    int FlushInterval,//刷新间隔

    int parentHWND//父窗口句柄

    )

ConvertFeatureClasss(IFeatureClassName InputDatasetName,//输入数据集的名称IQueryFilter InputQueryFilter,//输入查询过滤器的名称IFeatureDatasetName outputFDatasetName,//输出数据集的名称IFeatureClassName outputFClassName,//输出特征类的名称IGeometryDef OutputGeometryDef,//输出的几何定义IFields OutputFields,//输出的字段string configKey,//配置键int FlushInterval,//刷新间隔int parentHWND//父窗口句柄)

11.如类库Workspacefactory与类Workspace关系图所示,要创建一个workspace对象应该如何实现,写出关键代码。

要创建一个workspace对象,可以使用WorkspaceFactory类创建相应类型的工作空间工厂对象,然后再通过工作空间工厂对象调用相应的OpenFromFile方法打开指定的数据源,得到一个workspace对象。

IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();

IWorkspace sourceWorkspace = workspaceFactory.OpenFromFile(文件路径名称, 0);

IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();
IWorkspace sourceWorkspace = workspaceFactory.OpenFromFile(文件路径名称, 0);

首先通过调用ShapefileWorkspaceFactoryClass类的构造函数创建一个Shapefile工作空间工厂对象。然后,调用工作空间工厂对象的OpenFromFile方法,打开指定路径下的Shapefile数据源,返回一个IWorkspace接口对象,这个接口对象代表着打开的工作空间。

12.如类RasterHydrologyOp所示,现需计算对某一栅格数据图层进行流向计算,应该如何实现?请写出关键代码。(功能实现)

创建一个RasterHydrologyOp对象,指定输入栅格图层和输出流向图层。使用RasterHydrologyOp对象的FlowDirection方法计算流向。

using ESRI.ArcGIS.GeoAnalyst;

using ESRI.ArcGIS.Geodatabase;

// 获取RasterHydrologyOp对象

IRasterHydrologyOp hydrologyOp = new RasterHydrologyOpClass();

// 获取需要进行流向计算的栅格数据图层

// 获取WorkspaceFactory

IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();

// 打开栅格数据工作空间

IRasterWorkspace rasterWorkspace = workspaceFactory.OpenFromFile(rasterWorkspacePath, 0) as IRasterWorkspace;

// 打开栅格数据集

IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(rasterDatasetName);

// 将栅格数据集转换为GeoDataset

IGeoDataset geoDataset = rasterDataset as IGeoDataset;

// 定义是否创建落差栅格

bool createDrop = false;

// 定义是否在边缘强制流动

bool forceFlowAtEdge = true;

// 进行流向计算

IGeoDataset flowDirectionDataset = hydrologyOp.FlowDirection(geoDataset, createDrop, forceFlowAtEdge);

// 将结果保存为栅格数据图层

// 获取Dataset保存对象

IDatasetSaveAs datasetSaveAs = flowDirectionDataset as IDatasetSaveAs;

// 定义保存路径和名称

string savePath = @"D:\FlowDirection.tif";

// 保存栅格数据图层

datasetSaveAs.SaveAs(savePath, null, "TIFF");

using ESRI.ArcGIS.GeoAnalyst;
using ESRI.ArcGIS.Geodatabase;// 获取RasterHydrologyOp对象
IRasterHydrologyOp hydrologyOp = new RasterHydrologyOpClass();// 获取需要进行流向计算的栅格数据图层
// 获取WorkspaceFactory
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
// 打开栅格数据工作空间
IRasterWorkspace rasterWorkspace = workspaceFactory.OpenFromFile(rasterWorkspacePath, 0) as IRasterWorkspace;
// 打开栅格数据集
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(rasterDatasetName);
// 将栅格数据集转换为GeoDataset
IGeoDataset geoDataset = rasterDataset as IGeoDataset;// 定义是否创建落差栅格
bool createDrop = false;
// 定义是否在边缘强制流动
bool forceFlowAtEdge = true;
// 进行流向计算
IGeoDataset flowDirectionDataset = hydrologyOp.FlowDirection(geoDataset, createDrop, forceFlowAtEdge);// 将结果保存为栅格数据图层
// 获取Dataset保存对象
IDatasetSaveAs datasetSaveAs = flowDirectionDataset as IDatasetSaveAs;
// 定义保存路径和名称
string savePath = @"D:\FlowDirection.tif";
// 保存栅格数据图层
datasetSaveAs.SaveAs(savePath, null, "TIFF");

三、思考题

1.GIS开发有哪些开发模式?你是如何理解这些不同模式的开发?它们之间有联系吗?

①独立开发模式:不依赖于任何GIS工具软件,从空间数据的采集,编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计。

②单纯二次开发模式:指完全借助于GIS工具软件提供的开发语言进行应用系统开发。

③集成二次开发模式:指利用专业的GIS工具软件,如ArcInfo,MapInfo,SuperMap等,实现GIS的基本功能,以通用软件开发工具尤其是可视化开发工具,如C# .NET、Visual C++、Visual Basic、Java等为开发平台,进行二者的集成开发。目前有两种方式:①OLE/DDE,②GIS控件。

2.围绕GIS系统开发为主题,阐述开发过程中需要涉及到的理论与思想,并结合目前GIS开发的最新前沿及应用需求,作为开发人员应该如何开发具有一定生命力、易于后期维护、人机交互友好型的GIS行业应用系统?

COM标准,面向对象思想,组件式思想,

①需求分析

②软件分析:初步设计和详细设计

③总体设计:系统设计和结构设计

④低耦合,高内聚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恶劣天气对高速公路交通的影响

恶劣天气对高速公路交通的影响 高速低能见度会对安全驾驶造成以下影响: 降低驾驶员的感知能力:在低能见度条件下,驾驶员的视线距离缩短,难以看清周围的环境,包括道路状况、其他车辆和行人等。这会导致驾驶员对周围情况…

蓝桥杯 EDA 组 2023模拟+真题原理图解析

本文解析了标题内的原理图蓝桥杯EDA组真题,2021-2022 省赛真题/模拟题在上一篇文中。本文中重复或者是简单的电路节约篇幅不在赘述。 其中需要补充和计算原理图的题目解析都放在最下面 一、2023 年第十四届省赛模拟题1 1.1 Type-C 接口电路 通过 CH340N 将数据转化为…

解密Mysql数据库引擎:探究其背后的神秘力量(二)

本系列文章简介: 在本系列文章中,我们将从MySQL的基础知识入手,逐步深入到数据库引擎的内部机制。我们将详细介绍MySQL中常用的几种数据库引擎,包括InnoDB、MyISAM等,分析它们的优缺点以及适用场景。同时,我…

MySQL面试复习记录

一、mysql文章地址汇总 以下均为蓝云飘飘的文章: MySQL数据库(一)_写出sql语句,列出薪资比‘王海涛’的薪资高的所有员工,显示姓名,薪资-CSDN博客 MySQL数据库(二)_sql里的性别是什么代表-CSDN博客 ★★★★★ My…

Git Flow模型之美:优化团队协作开发流程

流程图 主要分支 master: 永远处在**即将发布(production-ready)状态**; develop: 最新的开发状态; 辅助分支 feature: 开发新功能的分支, 基于 develop, 完成后 merge 回 develop; release: 准备要发布版本的分支, 用来修复 bug. 基于 devel…

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密 上一篇某招聘软件的sig及sp参数被和谐掉了,所以懂得都懂啊! 因为web的api没有那么全,所以来看了下app的,ios的防护几乎没有,纸糊的一样,android端的有点复杂了,到最后我也没能完整的实现整个加密过程,我也只复现到DF…

Hadoop安装部署-单机版

Apache Hadoop是一个使用HDFS(Hadoop Distributed File System)分布式文件系统执行可靠的、规模化的分布式计算的开源项目,Hadoop是使用Java语言开发,其运行在Linux操作系统上集群规模最大支持几千个分布式节点,本文主…

【嵌入式——QT】QThread创建多线程

【嵌入式——QT】QThread创建多线程 概述主要函数图示代码示例 概述 QThread类提供不依赖于平台的管理线程的方法,一个QThread类的对象管理一个线程,一般从QThread继承一个自定义类,并重定义虚函数run(),在run()函数里实现线程需…

基于java的健身房管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本健身房管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

【MySQL】数据库的基础概念

👦个人主页:Weraphael ✍🏻作者简介:目前学习计网、mysql和算法 ✈️专栏:MySQL学习 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

Redis 更新开源许可证 - 不再支持云供应商提供商业化的 Redis

原文:Rowan Trollope - 2024.03.20 未来的 Redis 版本将继续在 RSALv2 和 SSPLv1 双许可证下提供源代码的免费和宽松使用;这些版本将整合先前仅在 Redis Stack 中可用的高级数据类型和处理引擎。 从今天开始,所有未来的 Redis 版本都将以开…

Vue.js前端开发零基础教学(二)

目录 前言 2.1 单文件组件 2.2 数据绑定 2.2.2 响应式数据绑定 2.3 指令 2.3.1 内容渲染指令 2.3.2 属性绑定指令 ​编辑 2.3.3 事件绑定指令 2.3.4 双向数据绑定指令 2.3.5 条件渲染指令 2.3.6 列表渲染指令 2.4 事件对象 2.5 事件修饰符 学习目标&am…

sentinel使用控制台实现

1、添加依赖 <!--整合控制台--><dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.8.0</version></dependency> 此项方法&#xff0…

HarmonyOS入门学习

HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…

JVM第八讲:GC - Java 垃圾回收基础知识

GC - Java 垃圾回收基础知识 本文是JVM第八讲&#xff0c; Java 垃圾回收基础知识。垃圾收集主要是针对堆和方法区进行&#xff1b;程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的&#xff0c;只存在于线程的生命周期内&#xff0c;线程结束之后也会消失&#xff0…

单片机第四季-第二课:uCos2源码-BSP

1&#xff0c;初始uCos2 文件中uC开头的为uCos相关的。 2&#xff0c;uCos2源码工程建立 建立Source Insight工程 寻找main函数 (1)RTOS其实就是一个大的裸机程序&#xff0c;也是从main开始运行的 (2)main之前也是有一个汇编的启动文件的 (3)main中调用了很多初始化函数 bsp部…

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…

Java常见的垃圾回收器GC

本节讲解一下常见的垃圾回收器。需要特别注意的是&#xff0c;每一种垃圾回收器都会存在用户线程&#xff08;即用户程序&#xff09;暂停的问题&#xff0c;只不过每种回收器用户线程暂停的时长优化程度不一样。在启动JVM时&#xff0c;可以通过“指定参数-xx:垃圾回收器名称”…

贵价茶叶产区成谜,竹叶青茶是“行业黑马”还是“韭菜镰刀”?

撰稿|行星 来源|贝多财经 近日&#xff0c;央视“315”晚会曝光了自诩“高端商务白酒”的听花酒。这款白酒号称拥有提升免疫力、改善睡眠、保障男性功能等多种保健功能&#xff0c;标准装售价5860元&#xff0c;精品装售价更是达到5.86万元&#xff0c;昂贵程度令人瞠目结舌。…

jmeter的函数助手使用方法

如某个上传文件接口&#xff0c;一个文件只能同时被一个接口调用&#xff0c;如果被并发同时调用就会报错 创建多个测试文件 比如50并发&#xff0c;创建更多的文件防止并发多时随机数生成重复 生成随机数函数 工具–函数助手-选择random-输入范围&#xff08;1-696&#…