地理信息系统GIS二次开发程序设计
实验报告
班级:10级测绘1班学号:
姓名:
指导教师:
面向接口编程
一、实验目的:
1.理解接口编程、面向对象编程的思想,两者的区别,以及各自的优缺点;
2.掌握AE接口实现图层加载的方法:
IworkspaceFactory-->Workspace->IfeatureWorkSpace->IFeatrueClass->IFeature();
3.理解并掌握使用UI进行属性查询和空间查询;
二.实验内容:
1. 利用IWorkSpace接口在Map中增加一个GeoDatabase图层;
2. 利用Imap的SelectBy*实现简单选择;
3. 利用IQueryFilter实现简单空间查询。
(未实现)
三、实验过程
1.接口、面向接口编程基本知识点。
(1)接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则;是在一定粒度视图上同类事物的抽象表示。
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
接口应有两类:第一类是对一个体的抽象,它可对应为一个抽象体(abstract class);第二类是对一个体某一方面的抽象,即形成一个抽象面(interface);
一个体有可能有多个抽象面。
(2)面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法;是与“面向过程”即“我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现”相对应的。
面向对象实现了对象属性与行为的分离,对象之间通过消息进行通信;具有同一属性和行为的对象被抽象成类,每一个类是相同或相似属性和方法的封装;类与类之间具有继承和派生关系。
(3)面向接口与面向对象的区别:
接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)是针对编程开发的对象而言的,不是同一感念。
interface关键字用来声明一个接口,它可以产生一个完全抽象的类,并且不提供任何具体实现。
2.GeoDatabase的数据加载:
(1)理解
Workspace是一个容器,包含了空间和非空间数据集,如feature class,raster dataset,table。
提供了一系列创建和操作数据集的方法。
FeatureClass 是空间事物的顶级类,类似与C#中的Object类,提供了一系列属性和方法。
在同一个FeatureClass中的Feature具有相同的属性字段。
FeatureLayer是一个基于矢量数据的图层,典型的数据包括Geodatabase、coverage和shapefile等,FeatureLayer可以直接在MapControl中显示。
它们之间的关系如下:
IworkspaceFactory->IworkSpace->IfeatureWorkSpace-->IFeatrueClass-->IFeature()
IfeatureLay--->ILayer----->IMap (2)方法一:调用IWorkspace接口实现
1)创建一个类工厂ClassFactory
2)使用类工厂创建要使用的工作区。
3)使用工作区打开并得到FeatureClass 。
4)把FeatureClass装载到新建的图层实例。
5)把图层加载到MapControl控件。
代码实现
private void addShpToolStripMenuItem_Click(object sender,
EventArgs e)
{
//显示一个打开对话框
string filePath=string.Empty;
OpenFileDialog addShape=new OpenFileDialog();
addShape.Filter="Add Shape File|*.shp";
addShape.Title="Add Shape";
//点击确定按钮
if(addShape.ShowDialog()==DialogResult.OK)
{
//构造ShapeWorkspace工厂
IWorkspaceFactory factory=new
ShapefileWorkspaceFactory();
//利用工厂建立Workspace
IFeatureWorkspace
fileSpace=factory.OpenFromFile(addShape.FileName.Replace(addSha
pe.SafeFileName, string.Empty), 0) as IFeatureWorkspace;
//打开workspace中的一个图层(FeatureClass) IFeatureClass
featureClass=fileSpace.OpenFeatureClass(addShape.SafeFileName);
//建立一个Layer,并初始化。
IFeatureLayer layer=new FeatureLayer();
layer.FeatureClass=featureClass;
=featureClass.AliasName;
//将Layer加载到Mapcontrol中
this.axMap.Map.AddLayer(layer);
//刷新mapcontrol
this.axMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriView
Geography, layer, null);
}
}
(3)方法二:调用ICommand 接口加载数据:
private void addDataToolStripMenuItem_Click(object sender, EventArgs e) {
ICommand pCmd = new
ESRI.ArcGIS.Controls.ControlsAddDataCommandClass (); pCmd.OnCreate(this .axMapControl1.Object); pCmd.OnClick(); }
注意问题:
其中ICommand 接口需要有namespace ,通过Help 查找 Using system.windows.input ;
实现效果:
图1
图2
3.实现属性查询
(1)建立属性表:在主窗体增加控件:dataGridViewTable用来显示属性信息。
图3
(2)构建属性查询对话框,界面如下:
图4
(3)写属性查询对话框的触发事件
图5 (4)实现菜单Attribute Query功能:
图6 执行查询功能,结构如下:
图7
四、实验总结
通过此次实验,加强我对二次开发的理解,对于程序编写出错的地方,尤其要注意,这些问题可能在于你对窗体名称的混淆。
在操作过程中遇到很多问题,需要不断地调试程序,也体会到了程序员的艰辛。
同时我的VB 知识也忘了许多,在以后的学习中,还学要进一步加强VB 知识的学习。