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标准,面向对象思想,组件式思想,

①需求分析

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

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

④低耦合,高内聚

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电玩体验店怎么计时,佳易王ps5计时计费管理控制系统操作教程

电玩体验店怎么计时,佳易王ps5计时计费管理控制系统操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费管理系统软件V17.9为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、电玩体验馆管理软件在计时的同时可以设置定时提醒&…

大模型第一讲笔记

目录 1、人工智能基础概念全景介绍... 2 1.1 人工智能全景图... 2 1.2 人工智能历史... 2 1.3 人工智能——机器学习... 3 监督学习、非监督学习、强化学习、机器学习之间的关系... 3 监督学习... 4 无监督学习... 5 强化学习... 5 深度学习... 6 2、语言模型的发展及…

视频素材库app推荐的地方在哪里找?

视频素材库app推荐的地方在哪里?这是很多短视频创作者都会遇到的问题。别着急,今天我就来给大家介绍几个视频素材库app推荐的网站,让你的视频创作更加轻松有趣! 蛙学网:视频素材库app推荐的首选当然是蛙学网啦&#xf…

OKR如何与组织的整体战略和计划相结合?

OKR(Objectives and Key Results,目标与关键成果)作为一种流行的目标管理方法,正逐渐成为组织实现战略目标的重要手段。本文将探讨OKR如何与组织的整体战略和计划相结合,从而推动组织的持续发展。 首先,我…

dlib:人脸识别的魔法工具箱

引言 在数字化的世界中,人脸识别技术已经不再是科幻小说的专利,而是我们日常生活中的一部分。从解锁手机到机场安检,人脸识别技术正在逐步改变我们与世界的互动方式。而在这个领域中,有一个名为dlib的英雄,以其强大的功…

LLM之RAG实战(三十三)| 探索RAG在Table的应用

实现RAG是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时,对于扫描的文档或图像格式的文档来说尤其困难。这些挑战至少有三个方面: 扫描文档或图像文档的复杂性,如其多元化的结构、非文本元素以及手写和打印内容的组合&…

前端基础篇-深入了解 Ajax 、Axios

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据。异步交互是指,可以在不…

InnoDB存储引擎中的锁(整理)

目录 什么是锁 InnoDB存储引擎中的锁 锁的类型 锁的兼容性 一致性非锁定读 一致性锁定读 锁的算法 行锁的三种算法 Phantom Problem(幻像问题) 锁问题 脏读 不可重复读 丢失更新 死锁 什么是锁 在数据库中锁是为了解决资源争抢的问题&…

Linux操作系统——多线程

1.线程特性 1.1线程优点 创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量在等待慢速I/O操作结束的同时,程序可执行其他的计…

先进的人工智能促进更好的业务沟通

提升商务沟通效率:了解SaneBox智能电子邮件管理工具 在现代商业环境中,有效的沟通至关重要。 先进的人工智能技术,特别是在电子邮件管理方面,正在改变企业处理沟通的方式,提高效率和个性化。 下面,我们深入…

【1】THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER

0x01 问题描述 连接COM口连接不上,出现THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER.如下图 0x02 问题解决 1、分析后,因为是windows 11 系统,就装一下驱动。右键单击--》属性 2、更新驱动程序--》浏览我的电脑以查找驱动程序…

电脑中了.[nicetomeetyou@onionmail.org].faust勒索病毒,关于数据恢复

文件后缀变成.[nicetomeetyouonionmail.org].faust了怎么办? 当文件后缀变成.[nicetomeetyouonionmail.org].faust时,通常意味着你的计算机系统已经受到了Faust勒索病毒的攻击。这种病毒会利用先进的加密算法对你的文件进行加密,并将文件后缀…

整合qq邮箱发送

目录 &#x1f32e;1.获取qq授权码 &#x1fad3;2.引入依赖 &#x1f9c8;3.配置mail信息 &#x1f95e;4.创建实现类 &#x1f956;5.测试 1.获取qq授权码 点击开启服务&#xff0c;发送信息获取授权码 2.引入依赖 <!--邮件--><dependency><groupId&…

my2sql —— go语言版binlog解析及闪回工具

之前学习过python语言版binlog解析及闪回工具 MySQL闪回工具简介 及 binlog2sql工具用法 最近听同事介绍有了新的go语言版的my2sql。优点是不需要安装一大堆依赖包&#xff0c;直接可以安装使用&#xff0c;并且解析更高效&#xff0c;试用一下。 一、 下载安装 1. 软件下载 …

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个&#xff08;Liu&#xff0c;2015&#xff09;。华为为此次转型成立了一个专门的团队&#xff0c;从大约20人开始&#xff0c;他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

minio 文件分片上传和下载

文件下载 文件分片下载&#xff1a; 计算文件开始字节位置&#xff0c;计算文件结束字节位置添加头部信息: Range:bytes0-2000表示开始字节位置&#xff0c;200表示结束字节位置 文件上传 生成

1058:求一元二次方程

【题目描述】 利用公式 求一元二次方程axbxc0的根&#xff0c;其中a不等于0。结果要求精确到小数点后5位。 【输入】 输入一行&#xff0c;包含三个浮点数a,b,c&#xff08;它们之间以一个空格分开&#xff09;&#xff0c;分别表示方程axbxc0的系数。 【输出】 输出一行&…

三款.NET代码混淆工具比较分析:ConfuserEx、Obfuscar和Ipa Guard

随着.NET应用程序的广泛应用&#xff0c;保护知识产权和防止逆向工程的需求逐渐增长。本文将详细介绍三款知名的.NET代码混淆工具&#xff1a;ConfuserEx、Obfuscar和Ipa Guard&#xff0c;帮助读者全面了解其功能特点和应用场景。 一、ConfuserEx ConfuserEx是一个.NET代码混…

SpringCloud-Nacos配置管理

在nacos中添加配置文件 如何在nacos中管理配置呢&#xff1f; 然后在弹出的表单中&#xff0c;填写配置信息&#xff1a;如&#xff1a;userservice-dev.yaml 注意&#xff1a;项目的核心配置&#xff0c;需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置…

【解决】Github Pages搭建的网页访问加载缓慢

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 文章目录 一、CDN技术简介二、基于Cloudflare平台使用CDN服务&#xff08;一&#xff09;添加网站&#xff08;二&#xff09…