GIS程序设计期中复习

填空(2*10)

1. COM组件原理

将单独的、庞大而复杂的应用程序分成多个模块,但每一个模块不再是一个简单的代码集,而是一个自给自足的组件(component)。这些组件模块可以运行在同一台机器上,也可以运行在网络上的不同机器上。

优点:

  1. 组件易替换
  2. 适应业务需求更改
  3. 可实现二进制代码重用
  4. 有助于并行开发

在WINDOWS平台上,一个COM组件可以是一个DLL(Dynamic Linking Library)文件,也可以是一个EXE文件。

一个组件程序可以包含多个COM对象,并且每个COM对象可以实现多个接口。

  • 一个对象拥有一个或多个接口
  • 接口是定义了一组方法和属性的逻辑关系
  • 与对象的通信是通过接口来进行的

实例化:

COM规范(微软,1995)着重强调以下四点:

  1. 接口不是类。接口不能实例化自身,因为其上没有实现。
  2. 接口不是对象。接口是一个相关功能组,是客户和对象之间通信的二进制标准。
  3. 接口具有很强的类型性。每个接口都有自己的接口标识符,因此消除了具有人们易读相同名字接口间可能的冲突。
  4. 接口是不变的。接口从来没有版本。一旦接口被定义和公布就不能改变。

2. 面向接口编程

组件之间通信的基础,软件组件应遵守统一的标准。COM不仅提供了组件之间的接口标准,还引进了面向对象的思想。对象是其中的一个重要元素,称为COM对象。

接口定义了一组方法和属性。

面向对象编程三大特性:

  • 封装
  • 多态
  • 继承

3. 常用控件

  1. 制图控件: MapControl 和PageLayoutControl
  2. 框架控件: TOCControl(内容表控件) 和ToolbarControl(工具条控件)–(buddy控件捆绑)
  3. 许可控件:LicenseControl(启动时执行License初始化)
  4. 符号控件:SymbologyControl
  5. Reader Control: ReaderControl和ReaderControl
  6. 三维控件:GlobeControl和SceneControl
1. MapControl对应于ArcMap中的数据视图,它封装了Map对象,并提供了额外的属性、方法、事件用于:
1. 管理控件的外观、显示属性和地图属性;
2. 添加并管理控件中的数据层(data layers);
3. 装载Map文档(mxd)到控件中;
4. 从其它应用程序拖放数据到控件中;
5. 绘制几何图形;
6. 暴露鼠标和绘制事件,用户可对这些事件进行响应。
2. TOCControl目录树
1. 目录树控件用来显示伙伴控件的地图、图层和符号体系等内容的交互式视图,并保持其内容与伙伴控件自动同步。
2. 显示所有的图层和符号
3. Simple symbols, renderers
4. Group layers
5. 控制图层可视性
6. 必须调用SetBuddyControl
3. ToolbarControl
1. 工具条控件不能单独使用。为伙伴控件提供了一系列可以直接使用的命令按钮,功能菜单等。
2. 自定义commands, tools 和menus的容器
3. 允许命令和以下控件对象进行交互
4. Map, PageLayout, Scene, 和Globe
5. 用户可在界面设计时通过工具条控件的属性页设置,也可调用SetBuddyControl方法。

控件特性

  1. 可嵌入到已有的应用程序,增加地图功能
  2. 属性页
  3. 封装组件通过粗粒度的封装,简化开发过程,同时提供细粒度的组件访问,是开发的起点
  4. 对交互操作和自身事件进行响应
  5. 同伴控件
数据访问
  • 检查MXD文件存在不存在:CheckMxFile;
  • 导入MXD文件:LoadMxFile;
  • 读MXD文件:ReadMxMaps;
数据加载需要先打开相应的工作空间。
  1. 工作空间是一个普通类,创建?

Iworkspace接口:定义了访问工作空间各种属性的方法,如工作空间连接属性等。

IFeatureWorkspace接口:管理要素的数据集

  1. 工作空间工厂(workspaceFactory)抽象类,创建?

IWorkspaceFactory接口:定义了创建、打开工作空间的方法和对工作空间工厂信息成员的访问。

  1. Layer 是抽象类: 能否创建?

通过子类创建: TinLayer, FeatureLayer, RasterLayer, etc.

4. 矢量数据添加涉及到的接口

步骤:

  1. 获取文件路径和文件名称(这里和打开文档不同,为什么)
  2. 创建地理空间工厂WorkspaceFactory(怎么创建)
  3. 实例化地理空间Workspace(怎么实例化)
  4. 获取FeatureClass
  5. 创建要素图层FeatureLayer
  6. 为要素图层定义数据集FeatureClass
  7. 添加至地图

5. 图层渲染和符号化涉及到的接口

IGeometry:几何图形
IPoint:点状图形,继承IGeometry
IEnvelope:矩形,继承IGeometry
IPolygon:多边形,继承IGeometry
IPolyline:线,继承IGeometry

ISymbol:符号
IMarkerSymbol:点状符号
ILineSymbol:线状符号(线型)
IFillSymbol:填充符号(填充图案)

  • 矢量图层:

      - IFeatureRenderer;
      - IGeoFeatureLayer.Renderer; 
    

    设置新的Renderer后刷新

      layer.Renderer = Render as IFeatureRenderer;
      axmapControl.ActiveView.Refresh();
      axtocControl.Update();
    
    • ISimpleRenderer:简单渲染(所有要素采用相同的渲染方式)
    • IUniqueValueRenderer:唯一值分类渲染
    • IClassBreaksRenderer:连续值分级渲染
  • 栅格图层
    IRasterRenderer
    IRasterLayer.Renderer;
    设置新的Renderer后刷新
    renderer.Update();
    layer.Renderer = renderer;
    m_mapControl.ActiveView.Refresh();
    m_tocControl.Update();

    • IRasterUniqueValueRenderer:唯一值分类渲染
    • IRasterClassifyColorRampRenderer:连续值分级渲染

6. 元素

ArcGIS中可以显示在视图上的图形分为两种,地理数据和元素( Element)数据。元素是一个地图中除去要素数据外的部分,即在一幅地图中,除了保存在数据库中的地理数据外,其余的对象全部是元素。

Map只能保存图形元素(Graphic Element)数据;
PageLayout能保存图形元素和框架元素(Frame Element);
PageLayoutControl 上的Map对象被PageLout的MapFrame对象所管理;
地图总是包含在Map对象中,而Map对象是由一个MapFrame所持有,PageLayout对象至少拥有一个MapFrame对象,而每个MapFrame中也拥有一个Map。

元素——Element对象
  • IElement是所有图形元素(GraphicElement)和框架元素(Frame Element)都实现的接口,通过IElement接口可以确定Element对象的Geometry属性,同时IElement接口也提供了用于查找和绘制元素的方法。
  • Element是抽象类,开发中必须明确指定使用的Element类型。
  • IElement和ILineElement, ITextElement等并不是父子关系,后者没有Geometry属性,只有IElement有Geometry属性。

  • 图形元素(Graphic Element)

    Line, polygon, marker
    Text and pictures

    做为图形的形式存在,在视图上可见 :

    • MarkerElement
    • LineElement
    • TextElement
    • FillShapeElement
    • GroupElement
    • PictureElement
    LineElement和 MarkerElement对象(组件类)

    MarkerElement和ILineElement是最简单的图形元素。在数据视图或布局视图上表现为线和点的形式。ILineElement接口的Symbol属性设置线的符号。 IMarkerElement接口的Symbol属性设置点的符号。

    以LineElement为例,把它添加到视图需要两个接口IElement和ILineElement。

    IElement用于确定线元素的Geometry;

    ILineElement用于确定Symbol。

    注意:Symbol与Geometry不能混用。LineElement元素只能使用Line或Polyine作为Geometry,使用通过LineSymbol类型作为Symbol;MarkerElement使用的是Marker类型的point作为它的Geometry 。

    TextElement 对象(组件类)

    地图的标注有两种形式:一种是保存在地理数据库中以标注类的形式存在,另一种是使用文字元素。

    TextElement 对象实现了ITextElement接口,提供了3个属性;

    .ScaleText属性 设置TextElement的文字尺寸

    .Text属性 设置TextElement的字符

    .Symbol属性 设置TextElement的文字符号

    FillShapeElement对象(抽象类)

    子类有:

    RectangleElement (矩形要素);

    CircleElement (圆形要素);

    EllipseElement (圆形要素);

    PolygonElement (多边形要素);

    这些对象的共同特点是它们的Geometry属性都是一个二维的封闭图形

    FillShapeElement类实现了IFillShapeElement接口,通过接口提供的Symbol属性设置元素的样式,Symbol必须是IFillSymbol对象。

    GroupElement对象(组建类)

    GroupElement对象可以将多个元素编为一组作为一个实体使用。如果用户需要对多个要素进行相同的操作,如同时移动多个要素的时候,可以将它们编为一组。

    GroupElement类实现IGroupElement接口,它定义了操作GroupElement的方法和属性。AddElement方法:把一个元素添加GroupElements对象中,ClearElements: 清空GroupElement中的所有元素;DeleteElement;ElementCount:返回GroupElement中的元素数目。

    PictureElement对象(抽象类)

    该对象有7个子类,如BmpPictureElement, GifPictureElement JpgPictureElement TifPictureElementEmfPictureElement,它们分别用于往版式视图中插入bmp, gif,Jpg, tif和emf文件。

    每个子类都实现的接口IPictureElement,使用它可以用于操作一个图片元素。

  • 框架元素(FrameElements )在PageLayout上使用

    Mapframes
    North arrows, legends, scale bars
    Table frames

    1. MapFrame: 地图框架是Map的容器,用来管理框架中的地图对象
      IMapFrame::CreateSurroundFrame

    2. MapSurroundFrame: 地图修饰框架,MapSurrounds对象的容器,管理MapSurround对象
      IMapSurroundFrame::MapFrame

    3. MapSurrounds:是指图例、指北针、比例尺等对象,形状或内容会随着Map属性的变化而自动改变,MapSurround并不是直接被加入到页面布局中去的,而是被加入到某一特定类型的框架元素中,这一框架元素称为MapSurroundFrame。MapSurround 对象由MapSurroundFrame 对象管理,所有的MapSurround 对象添加在布局视图上。

      IMapSurround ::Name 获得MapSurround 对象的名称;``:: FitToBound 设置大小

    4. MapSurroundFrame: 属于 PageLayout 的附属,MapSurrounds对象的容器 (Scalebars)

    5. Legend图例对象

      • ILegend::Item
      • ILegend::AutoAdd
      • ILegend::AddItem
      • ILegend::ClearItems
      • ILegend::RemoveItem
    6. MakerNorthArrow指北针(组建类):继承NorthArrow抽象类,用于指示地图空间方位的图形,是一个MapSurround对象。实现了两个接口:IMarkerNorthArrow 和INorthArrow;

      • IMarkerNorthArrow:设置指北针对象的一般属性,如颜色,尺寸和位置等;
      • INorthArrow:定义一个属性MarkSymbol ,用于设置指北针的符号;

添加元素流程

用IGraphicsContainer::AddElement把图形元素添加到视图并显示
主要步骤:

  1. 产生一个新的元素对象;
  2. 确定元素显示时使用的Symbol(符号)和Geometry(几何对象);
  3. 用IGraphicsContainer::AddElement把图形元素添加到视图并显示
  4. 刷新视图,让添加的元素可以显示出来。

7. 加载地图文档( mxd文件)

  1. 使用IMapControl接口的LoadMxFile方法
    1. 打开文件对话框选择要打开的文档;openFileDialog(请查询各信息,并写全)
    2. CheckMxFile 方法检查是否为有效地图文档 LoadMxFile(string mxPath,object mapnameorindex,object password)
  2. 通过ImapDocument接口加载
    1. 打开文件对话框选择要打开的文档;openFileDialog
    2. 通过mapDocument打开地图文档
    3. 通过ActiveView属性的FocusMap属性赋予当前的Map对象

简答(6*5)

1. 流程及接口,类

地图接口
  1. ILayer接口:所有图层类都可以实现该接口,定义了所有图层公共的方法和属性。
    • Name属性:返回图层名称;
    • MaximumScale属性:显示或设置图层可以出现的最大比例尺;
    • MinmumScale属性:显示或设置图层可以出现的最小比例尺;
    • ShowTips属性:指示当鼠标放在图层中某个要素上时,是否出现Tips;
    • SpatialReference属性:设置图层的空间参考。
  2. IFeatureLayer接口:主要用于设置要素图层的数据源(FeatureClass)
    • DataSourceType属性:返回图层的数据源类型;
    • Search方法:通过2个参数,过滤器(IQueryFilter类型的对象)和布尔值(用于返回要素游标是否循环,返回一个Icursor对象)

IFeatureLayer接口继承自Ilayer接口,IFeatureClass接口继承自Iclass接口。

FeatureLayer可以创建自己的对象,FeatureClass不行

  1. Version类库:ArcEngine 10.0新出的类库,包含里将独立应用程序绑定到特定的ArcGIS系列产品的函数和方法。
  2. System:ystem库是ArcGIS框架中最底层的一个库,它包含了一些被其他库使用的一些基础组件。
  3. SystemUI:SystemUI库定义了一些在ArcGIS中被用户界面组件使用的类型。象ICommand和ITool这样的接口就在这里定义。
  4. Geometry:几何库包含了核心的几何对象,比如点,面,线等。在几何库中还定义和实现了空间参考的对象,包括投影坐标系和几何坐标系。
  5. Display:显示库包含了支持在输出设备上显示图形的组件,屏幕显示、符号、颜色、显示交互(Feedback)等都在这个库中定义。
  6. Server:提供了连接、管理ArcGIS Server的核心类,如IServerObjectManager、IServerObject等,其他类库的对象可以通过ArcGIS Server的IServerContext进行远程创建。
  7. Output:提供了将MapControl和PagelayoutControl中的地图输出到打印机以及其他设备文件中。

2. 对象模型图分析

总结:

  • 抽象类:不能用于创建对象,对子类例程进行了规定(通过类型继承)。
  • 普通类:不能直接创建对象,但可以作为另一个类的属性或者通过另一个类的实例化来创建对象。
  • 组件类:可以直接创建对象。
  • 关联关系:表示类之间的关系。关联的两端都定义了多样性。
  • 组成关系:是一种“整体类”对象控制着“部分类”对象的生命期关系。
  • 类型继承关系:定义共享父类的属性和方法,同时又具有了自己独特的属性和方法的特定对象类。
  • 实例化关系:表示某个类的对象具有创建另一个类的对象的方法。
  • N元关系:表示两个以上的类相互关联。在各个关联分支的交叉点上放置一个菱形。
  • 多样性关系:是对能于另一个对象关联的对象数目的一种限制。关联和组成关系的两端都定义了多样性。

抽象类(AbstractClass):
  1. 不能创建或实例化
  2. 抽象类永远不能有实例
  3. 为子类定义了泛化(general)
  4. 子类集成了抽象类的接口

抽象类的OMD 符号: 2维灰色矩形

普通类/可实例化类 (Class)
  1. 不能创建或实例化

  2. 抽象类永远不能有实例

  3. 为子类定义了泛化(general)

  4. 子类集成了抽象类的接口

    IRow pNewRow;
    ITable pTable;
    pNewRow = pTable.CreateRow();
    IRow row = table.CreateRow();

实例化类的OMD符号: 3维白色的矩形

组件类/可创建的类(CoClass)
  1. 可以创建:使用 New关键字

     IMap pmap = new Map();
    
  2. 实例化: 从其它对象获得

      Imap pMap;
      pMap = m_MapDocument.get_Map(i);
    

可创建类的OMD符号:3维灰色矩形

3. 代码出错纠正及原因分析

  1. “The specified path is invalid”

考虑有没有AxMapContorl或者AxLicesenContorl

  1. 没有绑定许可ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

上机

1. 窗体设计+控件使用

2. 窗体及用户控件互相调用及显示

3. ao编程

4. 窗体及用户空间传值

发布了208 篇原创文章 · 获赞 80 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/DanBo_C/article/details/102940677