GIS程序设计 知识总结

GIS程序设计

简答

1. 开发模式,开发软件的特点,概念

  1. 独立开发:
    • 定义:不依赖于任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,如VC++、VB、Delphi、C++ Builder等,在一定的操作系统平台上编程实现。
    • 特点:
      • 无需依赖任何商业GIS工具软件,减少了开发成本
      • 综合程度和操作效率最高
  2. 单纯二次开发:
    • 定义:在宏语言中调用DLL库,定义GIS系统工具不提供或不支持的功能,
    • 特点:
      • 功能弱,程序不美观,开发收到限制
      • 增加学习负担
  3. 集成二次开发:
    • 定义:利用专业GIS工具软件或其提供的组件来实现GIS的基本功能,采用可视化开发工具,进行集成开发。集成二次开发目前主要有OLE/DDE方式和组件式方式两种。
    • 特点:
      • GIS工具软件能够提供成熟的功能。例如:空间数据库存储、空间分析等
      • 高效,便捷,不需要从底层学习具体的实现原理,易上手。
  1. 基于arcengine或者arcobject 
  2. 基于com(原理)

2. 接口及类:特,用,概,接口应用

接口的特点:

  1. 接口的多态性:许多不同的类可以支持相同的接口
  2. 接口的继承性:所有的子类都继承了父类的接口

面向接口编程:

  • 接口定义了能做什么,类定义了该怎么做。类实现了接口中的方法。
  • 接口描述了一系列外部可见操作
  • 接口具有类内置的一组属性和方法

Com类代码:

  • 接口模块:定义方法和属性
  • 类模块:实现方法和属性

COM 对象的接口是抽象的,接口与类不同。因为接口没有 任何的实现,所以不能通过自身实例化。因为接口没有任何的实现,所以不能通过自身实例化。接口由具体的类来实现由具体的类来实现,功能用接口抽象地模拟,并且用类去真正实现。

地图接口
  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中的地图输出到打印机以及其他设备文件中。

3. 对象模型图:类和关系,分别有什么特点

    • 抽象类:不能用于创建对象,对子类例程进行了规定(通过类型继承)。
    • 普通类:不能直接创建对象,但可以作为另一个类的属性或者通过另一个类的实例化来创建对象。
    • 组件类:可以直接创建对象。
  1. 关系

    • 关联关系:表示类之间的关系。关联的两端都定义了多样性。

    • 组成关系:是一种“整体类”对象控制着“部分类”对象的生命期关系。

    • 类型继承关系:定义共享父类的属性和方法,同时又具有了自己独特的属性和方法的特定对象类。

    • 实例化关系:表示某个类的对象具有创建另一个类的对象的方法。

    • N元关系:表示两个以上的类相互关联。在各个关联分支的交叉点上放置一个菱形。

    • 多样性关系:是对能于另一个对象关联的对象数目的一种限制。关联和组成关系的两端都定义了多样性。

    抽象类(AbstractClass):
    1. 不能创建或实例化

      1. 抽象类永远不能有实例
    2. 为子类定义了泛化(general)

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

      抽象类的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维灰色矩形

  2. AE控件有哪些,分类特点

    1. 制图控件: MapControl 和PageLayoutControl
    2. 框架控件: TOCControl(内容表控件) 和ToolbarControl(工具条控件)–(buddy控件捆绑)
    3. 许可控件:LicenseControl(启动时执行License初始化)
    4. 符号控件:SymbologyControl
    5. Reader Control: ReaderControl和ReaderControl
    6. 三维控件:GlobeControl和SceneControl
  3. 矢量数据集相关类的关系

    1. 矢量数据数据的加载,分析,查询

    接口:

      1. **IWorkspaceFactory**:创建工作工厂
    
      2. **IWorkspace**:工作化工作空间
         3. **IFeatureWorkspace**:接口转换为要素工作空间
         4. **IFeatureClass**:创建featureClass
         5. **IFeatureLayer**:创建要素图层
         6. **IMap**:接收AxMapControl中的地图对象
    

    类:

    1. ShapefileWorkspaceFactory:作为子类创建工作空间
    2. FeatureLayer:创建要素图层用于接收打开的shpfile文件的featureClass,作为图层,只是表现形式,真正的数据在FeatureClass中。
    3. FeatureClass是从Dataset继承过来的,FeatureClass是有空间数据字段的数据集。

程序流程(简答)

1. 数据访问,添加矢量

矢量加载:

  1. 获取文件路径和文件名称
  2. 创建地理空间工厂WorkspaceFactory(怎么创建)
  3. 实例化地理空间Workspace(怎么实例化)
  4. 获取FeatureClass
  5. 创建要素图层FeatureLayer
  6. 为要素图层定义数据集FeatureClass
  7. 添加至地图控件
  8. 刷新地图视图
2. 空间数据显示—图层渲染
  1. 抽象类:Symbol,MarkerSymbol,LineSymbol,FillSymbol
  2. 组件类:
         1. RgbColor:颜色
         2. SimpleMarkerSymbol,SimplelineSymbol,SimplefillSymbol:简单点线面符号
         3. SimpleRenderer:简单渲染
  1. 实例化ISimpleMarkerSymbol,提供简单点符号
  2. 实例化ISimpleRenderer,提供简单渲染器
  3. 获取渲染图层赋值给IGeoFeatureLayer,提供要素图层对成员控制地理特征渲染的入口,获取渲染图层
  4. 调用pGeoFeatureLayer.Renderer属性赋值渲染器
  5. 刷新地图视图
3. 元素添加至地图
  1. 获取pagelayerout对象、活动视图pActiveView、图形容器pGraphicsContainer、地图窗口MapFrame
  2. 创建UID对象,设置value
  3. 通过MapFrameCreateSurroundFrame(uid,null)方法创建mapSurroundFrame
  4. 实例化一个区域几何envelope(包裹元素的盒子)。通过PutCoords(xmin, ymin, xmax, ymax)方法设置地图上的位置
  5. 通过mapSurroundFrame获取Element,设置框架的几何体属性Geometry为区域几何对象envelope
  6. 通过图形容器pGraphicsContainerAddElement(Element,ZOrder)方法把地图要素添加地图布局。
  7. 刷新视图。

接口:

  1. IGraphicsContainer:管理map上的Element对象,获取图形容器
  2. IMapFrame:访问控制地图元素对象的成员
  3. IMapSurroundFrame:获取或更新存储在帧中的环绕对象(指北针、比例尺条或图例)
  4. IEnvelope:地物的外接矩形,用来放置元素。
  5. IElement:通过这一属性设置该元素的外接矩形在地图上的位置。所有图形元素和框架元素都实现的接口,可以确定元素的Geometry属性。

类:

  1. UID用来设置元素类型的编码
  2. MapFrame: 用于显示地图的图形元素。
  3. MapSurroundFrame:用于显示地图包围的图形元素。
  4. Envelope:包络线,是每个几何形体的最小外接矩形。每个Geometry都拥有一个Envelope
  5. Element:抽象类
public void add(string value,double xmin,double ymin, double xmax, double ymax)
{
    //获取图形容器
    IGraphicsContainer graphicsContainer = pageLayoutControl.PageLayout as IGraphicsContainer;
    
    //根据MapSurround的uid,创建相应的MapSurroundFrame和MapSurround
    UID uid = new UID();
    uid.Value = value;
    IMapFrame mapFrame = pageLayoutControl.PageLayout as IMapFrame;
    IMapSurroundFrame mapSurroundFrame = mapFrame.CreateSurroundFrame(uid, null);
    
    //为要素实例化一个区域几何。元素的外接矩形
    envelope = new Envelope() as IEnvelope;
    envelope.PutCoords(xmin, ymin, xmax, ymax);
       
    //获取Element,用来设置框架的几何体属性
    IElement eement = mapSurroundFrame as IElement;
    
    //geometry属性控制区域几何在地图上的位置
    element.Geometry = envelope;
    
    graphicsContainer.AddElement(element, 0);  
    activeView.Refresh();
    pagelayoutcontrol.Refresh();
}
4. 属性查询
步骤:
  1. 获取数据源FeatureClass
  2. 循环给每一列写字段名
  3. 获取查询返回的游标,null代表没有查询条件,返回整个表
  4. IFeature接收指针指向的数据
  5. 将指针指向第一个要素属性行
  6. 如果pFeature不为空则循环7,8,9步
  7. 获取表中的新行,并将引用赋值给DataRow
  8. 为每一个属性单元格赋值
  9. 游标指向下一行要素并重新赋值给pFeature
  10. DataTable赋值给dataGridView的数据源
类:
  1. QueryFilter:过滤数据通过属性值或者属性之间的关系
  2. QueryDef:代表了数据库中基于一个或多个表、要素类的进行的属性查询,通过这个对象,用户可以在多个表间建立连接,并且保证在这个连接基础上的查询可以实现。
  3. FeatureCursor:普通类,通过pFeatureClass.Search(filter, false);实例化
接口:
  1. IFeatureClass:数据源
  2. IQueryFilter:用于属性查询
  3. IFeatureCursor:查询返回的游标
  4. IFeature:要素,返回游标中要素集单位
5. 空间查询
步骤:
  1. 获取pFeatureLayer
  2. 实例化过滤器pSpatialFilter
  3. 创建geometry,用来装载框选范围
  4. 将框选几何geometry赋给pSpatialFilter
  5. 设置空间范围的查询条件(从空间查询窗体获得)
  6. 实例化查询接口pfeatureSelection
  7. 调用查询方法SelectFeatures(过滤器, esriSelectionResultEnum.esriSelectionResultNew, false);实现高亮
  8. 刷新图层
接口:
  1. IFeatureLayer:当前的要素图层,用于接口转换
  2. ISpatialFilter:过滤器,用来设置空间范围的查询条件
  3. IGeometry:几何类型,获取框选范围
  4. IFeatureSelection:查询接口,用于查询,没有返回值,实现高亮
类:
  1. FeatureLayer:组件类,要素图层
  2. SpatialFilter:组件类,过滤器
  3. Geometry:普通类,通过mapControl.TrackRectangle();实例化,几何类型

程序设计题

1. 面向接口的编程及接口转换

2. 接口的继承

3. 图层的显示及渲染

///
//Shp
///
OpenFileDialog pOpenfileDialog = new OpenFileDialog();
if (pOpenfileDialog.ShowDialog() == DialogResult.OK)
{
    string path = pOpenfileDialog.FileName;
    bool shp = path.EndsWith(".shp");
    if (shp)
        openShpFile(path);
}
private void openShpFile(string file)
{
    int index = 0;
    //获取最后一个“\\”时的索引位置
    index = file.LastIndexOf("\\");
    //获得shp文件的路径
    string filePath = file.Substring(0, index);
    //获得shp文件名
    string fileName = file.Substring(index + 1, file.Length - (index + 1));
    //由工作空间工厂创建shp工作空间工厂类
    IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
    //打开工作空间
    IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(filePath, 0);
    //转换工作空间为要素工作空间
    IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
    //打开要素类
    IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(fileName);
    //创建要素图层
    IFeatureLayer pFLayer = new FeatureLayer();
    //设置图层的featureclass为上面打开的文件
    pFLayer.FeatureClass = pFC;
    //设置图层的名称
    pFLayer.Name = pFC.AliasName;
    //转换featurelayer为layer
    ILayer pLayer = pFLayer as ILayer;
    IMap pMap = mapControl.Map;
    //添加图层
    pMap.AddLayer(pLayer);
    //刷新
    mapControl.ActiveView.Refresh();
}


///
//渲染
///

//简单渲染,点符号
public static void easy_point(string filename, IRgbColor point_rgb, int width)
{
     //实例化ISimpleFillSysmbol变量, 提供简单的填充符号类型
	ISimpleMarkerSymbol pSimplemarkerSymbol = new SimpleMarkerSymbol();
     pSimplemarkerSymbol.Color = point_rgb;
     pSimplemarkerSymbol.OutlineSize = width;
     //实例化简单渲染变量
     ISimpleRenderer pSimpleRender = new SimpleRenderer();
     //设置pSimpleRender的符号样式
     pSimpleRender.Symbol = pSimplemarkerSymbol as ISymbol;
	Render_tool(pSimpleRender, filename);
}
private static void Render_tool(ISimpleRenderer pSimpleRenderer, string filename)
{
      //提供要素图层对成员控制地理特征渲染的入口,获取渲染图层
      IGeoFeatureLayer pGeoFeatureLayer = getGeoLayer(filename);
      if (pGeoFeatureLayer != null)
          //调用Renderer属性, 具体说明如何通过图层要素渲染器渲染图层
          pGeoFeatureLayer.Renderer = pSimpleRenderer as IFeatureRenderer;
      mapControl.ActiveView.Refresh();
}
public static IGeoFeatureLayer getGeoLayer(string layerName)
{
      ILayer pLayer; //定义图层
      IGeoFeatureLayer pGeoFeatureLayer; //定义要素图层
      for (int i = 0; i < CSR_mapControl.LayerCount; i++)
      {
           pLayer = CSR_mapControl.get_Layer(i);
           //若当前图层不为空且与与layerName的值相同
           if (pLayer != null && pLayer.Name == layerName)
           {
                pGeoFeatureLayer = pLayer as IGeoFeatureLayer;
                return pGeoFeatureLayer;
           }
      }
      return null;
}

///
//Tiff
///

//工作空间实例化
IWorkspaceFactory pRasterWsF = new RasterWorkspaceFactory();
IWorkspace pWs = pRasterWsF.OpenFromFile(RasterPath, 0);
IRasterWorkspace pRasterWs = pWs as IRasterWorkspace;
IRasterDataset pRasterDS = pRasterWs.OpenRasterDataset(RasterName);
//影像金字塔的判断和创建
IRasterPyramid pRasterPyramid = pRasterDS as IRasterPyramid;
if ((pRasterPyramid != null) && (!pRasterPyramid.Present))
{
    pRasterPyramid.Create();
}
//新建栅格图层
IRasterLayer pRasterLayer = new RasterLayer();
pRasterLayer.CreateFromRaster(pRasterDS.CreateDefaultRaster());
IMap pmap = mapControl.Map;
//加载显示
pmap.AddLayer(pRasterLayer);
mapControl.ActiveView.Refresh();

4. 属性查询

public static DataTable getFeatureLayerTable(IFeatureLayer pFeatureLayer)
{
    //获取数据源FeatureClass
    IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
    DataTable dt = new DataTable();
    for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
    {
        //循环给每一列写字段名
    	dt.Columns.Add(pFeatureClass.Fields.get_Field(i).Name);
    }
    //获取查询返回的游标,null代表没有查询条件,返回整个表
    IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
    //将指针指向第一个要素属性行
    IFeature pFeature = pFeatureCursor.NextFeature();
    while (pFeature != null)
    {
        //获取表中的新行,并将引用赋值给DataRow
        DataRow dataR = dt.Rows.Add();
        for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
        {
            //为每一个属性单元格赋值
            if (pFeature.get_Value(j) == null)
                dataR[j] = pFeatureClass.ShapeType.ToString();
            else
                dataR[j] = pFeature.get_Value(j);
        }
        //游标指向下一行要素
        pFeature = pFeatureCursor.NextFeature();
    }
    return dt;
}

5. 空间查询

IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;

//实例化一个过滤器,用来设置空间范围的查询条件
ISpatialFilter pSpatialFilter = new SpatialFilter();
IGeometry geometry = mapControl.TrackRectangle();
//将几何范围赋值给pSpatialFilter
pSpatialFilter.Geometry = geometry;
//设置空间范围的查询条件
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
//实例化查询接口
IFeatureSelection pfeatureSelection = pFeatureLayer as IFeatureSelection;
//实现高亮
pfeatureSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
mapControl.Refresh();//地图刷新

分值

  1. 填空:1*15
  2. 选择:2*10
  3. 简答:基本概念、总结及功能流程 4*5
  4. 程序阅读:改错、对象模型图 5*3
  5. 程序设计:2*15
发布了208 篇原创文章 · 获赞 80 · 访问量 3万+

猜你喜欢

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