目录
一、简答题
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标准,面向对象思想,组件式思想,
①需求分析
②软件分析:初步设计和详细设计
③总体设计:系统设计和结构设计
④低耦合,高内聚