zoukankan      html  css  js  c++  java
  • ArcEngine 9.3 学习笔记(四):地图和地图布局(Map对象,FeatureLayer对象,矢量图层操作实例)

    3.1 地图

    3.1.1 Map 对象

      Map对象:在Map对象上能显示的图形有两类,一类是 地理数据,一类是 元素。
      地理数据包括 矢量类型的要素数据、栅格数据、Tin等表面数据等;这些数据都保存在Geodatabase或数据文件如shapefile中,它们是用于GIS分析制图的源数据。
      元素,是一种可以显示在Map上的对象,它分为:图形元素框架元素。图形元素可以显示出来;而框架元素充当了“容器”的角色。  

      在Map上所画的 圆形、矩形、在布局视图上添加的 指北针、图例、比例尺等图形对象,都是图形元素;在ArcMap中Map对象是由MXDocument对象的MapFrame对象管理,MapFrame是一个框架元素

      Map对象有双重身份:一方面是数据的管理容器,可以加载地理数据和图形元素,扮演了数据管理器的角色;另一方面,它又可以让用户看到这些数据,即扮演了数据显示器的角色。当加载数据到Map对象的时候,Map对象是数据的管理者;当改变视图范围,刷新地图的时候他是数据的显示者。

      Map对象主要实现的接口有:IMap,IGraphicContainer,IActiveVIew,IMapBookmark等接口。
      IMap接口主要用于管理Map对象中的Layer对象,要素选择集对象,MapSourround对象,空间参考等对象。
      Map对象可以显示图形元素(Graphics Element),Map对象通过IGRaphicsContainer接口来管理这些元素对象,包括图形元素和框架元素。
      IGRaphicsContainer 返回的是Map对象中处于活动状态的GRaphics Layer引用指针,它可以是一个Basicgraphicslayer,也可以是CompositeGraphicsLayer中的一个图层;或者是一个FDOGraphicsLayer注记图层。
      以下代码片段压实如何添加一个Element到Map上

     1         /// <summary>
     2         /// 添加临时元素到地图窗口上
     3         /// </summary>
     4         /// <param name="pMapCtrl">地图控件</param>
     5         /// <param name="pEle">单个元素</param>
     6         /// <param name="pEleColl">元素集合</param>
     7         public void AddTempElement(AxMapControl pMapCtrl, IElement pEle, IElementCollection pEleColl)
     8         {
     9             try
    10             {
    11                 IMap pMap = pMapCtrl.Map;
    12                 IGraphicsContainer pGCs = pMap as IGraphicsContainer;
    13 
    14                 if (pEle != null)
    15                 {
    16                     pGCs.AddElement(pEle, 0);
    17                 }
    18                 if (pEleColl != null)
    19                 {
    20                     if (pEleColl.Count > 0)
    21                     {
    22                         pGCs.AddElements(pEleColl, 0);
    23                     }
    24                 }
    25                 IActiveView pAV = (IActiveView)pMap;
    26                 // 需要刷新才能即时显示
    27                 pAV.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pAV.Extent);//PartialRefresh 局部刷新
    28             }
    29             catch (Exception)
    30             {
    31                 throw;
    32             }
    33         }
    View Code

      IActiveView接口定义了Map对象的数据显示功能。使用该接口可以改变视图的范围,刷新视图;
      IActiveView 的PartialRefresh方法的不同参数,所代表的不同功能(刷新视图):
            1)PartialRefresh(esriViewGeography,pLayer,null);// 用于刷新 --指定图层--
            2)PartialRefresh(esriViewGeography,null,null);// 用于刷新 --所有图层--
            3)PartialRefresh(esriViewGeoSelection,null,null);// 用于刷新 --所选对象--
            4)PartialRefresh(esriViewGraphicSelection,null,null);// 用于刷新 --所选择的图元--
            5)PartialRefresh(esriViewGraphics,pElement,null);// 用于刷新 --指定图形元素--
            6)PartialRefresh(esriViewGraphics,null,null);// 用于刷新 --所有图形元素--

      IMapBookmark接口用于管理所有的空间书签对象

    3.2.1 图层对象

             Map对象可以装载地理数据,这些数据以图层的形式加载到地图对象上的,图层对象Layer作为一个数据的“中介”存在,它本身没有转载地理数据;
             而仅仅是获得了数据的引用,用于管理数据源的连接。地理数据始终保持在Geodatabase或者地理数据文件中。
             由于地理数据的类型多样,所以Layer类拥有众多子类。接下来主要给大家介绍要素图层--FeatureLayer对象。

    3.1.3 FeatureLayer对象

      FeatureLayer类实现的常用主要接口有:IFeatureLayer, IFeatureLayerDefinition, FeatureSelection, IGeoDataset, IGeoFeatureLayer, IIdentify, ILayerEffects。

             IFeatureLayer接口主要用于设置要素图层的数据源(FeatureClass),IFeatureLayer的DataSoruceType获取FeatureLayer对象的数据源类型。此外通过Search方法,可以查询要素图层上符合某一条件的要素集。

             IGeoFeatureLayer即可继承了ILayer和IFeatureLayer两个接口,用于控制要素图层的符号化和标注等
             IGeoDataset接口仅有两个属性,它们用于管理地理要素集。
             1)Extent可以返回当前数据集的范围,是一个IEnevelope类型的对象;
             2)SpatialReference属性则可以让用户获得这个数据集的空间参考

             IFeatureSelection接口提供管理一个图层中的要素的选择集的方法和属性
             以下代码片段演示了如何获取要素图层符合条件的选择集:

     1         /// <summary>
     2         /// 获取要素图层符合条件的选择集
     3         /// </summary>
     4         /// <param name="pFeatureLayer">要素图层</param>
     5         /// <param name="whereClause">过滤条件</param>
     6         /// <returns></returns>
     7         public IFeatureSelection SelectLayersFeatures(IFeatureLayer pFeatureLayer, string whereClause)
     8         {
     9             IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
    10             if (pFeatureSelection == null)
    11             {
    12                 return null;
    13             }
    14 
    15             IQueryFilter pQueryFilter = new QueryFilterClass();
    16             pQueryFilter.WhereClause = whereClause;
    17             // pFeatureSelection由pFeatureLayer QI 获得,包含pFeatureLayer中的所有要素,
    18             // 通过过滤器 将满足条件的 要素过滤出来,执行完SelectFeatures后,pFeatureLayer中就剩下满足条件的要素了
    19             pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
    20             return pFeatureSelection;
    21         }
    View Code

      IFeatureLayerDefinition接口定义了CreateSelectionLayer方法,可以将一个图层选择集中的要素转换为一个单独的要素图层。

    3.1.4 矢量图层操作实例

      以下代码片段演示按行政区加载图层数据的功能,以此理解IFeatureLayerDefinition 的CreateSelectionLayer方法的使用。

      使用IFeatureLayerDefinition的CreateSelectionLayer方法,将选择集生成一个新图层。

     1         /// <summary>
     2         /// 按行政区范围创建行政区范围的图层
     3         /// </summary>
     4         /// <param name="pFeatureLayer">源数据图层</param>
     5         /// <param name="pGeometry">行政区范围</param>
     6         /// <param name="bXZQ">图层是否为行政区</param>
     7         /// <returns>新创建的图层</returns>
     8         public IFeatureLayer GetSelectionLayer(IFeatureLayer pFeatureLayer, IGeometry pGeometry, bool bXZQ)
     9         {
    10             try
    11             {
    12                 if (pFeatureLayer != null && pGeometry != null)
    13                 {
    14                     IQueryFilter pQueryFilter;
    15                     ISpatialFilter pSpatialFilter = new SpatialFilterClass();// 空间过滤器
    16                     IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;// 将源数据 当做一个选择集,再从中筛选出需要的
    17                     pSpatialFilter.GeometryField = pFeatureLayer.FeatureClass.ShapeFieldName;// 设置图形域为源数据要素类的图形域
    18                     pFeatureSelection.Clear();
    19                     if (!bXZQ)
    20                     {
    21                         pSpatialFilter.Geometry = pGeometry;// 设置图形过滤器的形状
    22                         // 如果遇到行政区层,必须设置此参数,否则这个行政区图层就不能只获取指定的省份,会把相邻的省份也添加创建到新图层
    23                         // 应该是去掉相邻行政区的意思
    24                         pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIndexIntersects;
    25                         pQueryFilter = pSpatialFilter;
    26                         // 进行过滤,貌似必须使用IQueryFilter接口,才能进行IFeatureSelection的过滤,但是需要图形过滤器来设置参数
    27                         pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
    28                     }
    29                     else
    30                     {
    31                         pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
    32                         pQueryFilter = pSpatialFilter;
    33                         if (pGeometry is IGeometryCollection)
    34                         {
    35                             for (int i = 0; i < (pGeometry as IGeometryCollection).GeometryCount; i++)
    36                             {
    37                                 pSpatialFilter.Geometry = (pGeometry as IGeometryCollection).get_Geometry(i);
    38                                 pFeatureSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
    39                             }
    40                         }
    41                     }
    42 
    43 
    44                     IFeatureLayerDefinition pFLDefinition = pFeatureLayer as IFeatureLayerDefinition;
    45                     // 由于之前 将pFeatureLayer QI 到了 pFeatureSelection, 而之后对pFeatureSelection进行了过滤,
    46                     // 因此目前  pFeatureLayer中的要素已经是经过了过滤的结果了;在QI 到pFLDefinition ,执行CreateSelectionLayer 创建新图层
    47                     IFeatureLayer pNewFeatureLayer = pFLDefinition.CreateSelectionLayer(pFeatureLayer.Name, true, null, null);
    48                     pNewFeatureLayer.MaximumScale = pFeatureLayer.MaximumScale;
    49                     pNewFeatureLayer.MinimumScale = pFeatureLayer.MinimumScale;
    50                     pNewFeatureLayer.Selectable = pFeatureLayer.Selectable;
    51                     pNewFeatureLayer.Visible = pFeatureLayer.Visible;
    52                     pNewFeatureLayer.ScaleSymbols = pFeatureLayer.ScaleSymbols;
    53 
    54                     return pNewFeatureLayer;
    55                 }
    56             }
    57             catch (Exception)
    58             {
    59                 return null;
    60             }
    61             return null;
    62         }
    View Code

      IIdentify 接口定义了获得要素图层单个要素的属性
      ILayerFields接口可以直接获取一个要素图层的要素类字段集合
      ILayerEffects接口用来设置一个要素图层的亮度,透明度,对比度。以下代码片段延时如何设置要素图层特效。

     1         /// <summary>
     2         /// 设置图层特效
     3         /// </summary>
     4         /// <param name="pFeatureLayer">要素图层</param>
     5         /// <param name="brightness">亮度</param>
     6         /// <param name="contrast">对比度</param>
     7         /// <param name="transparency">透明度</param>
     8         public void SetLayerEffects(IFeatureLayer pFeatureLayer, short brightness, short contrast, short transparency)
     9         {
    10             ILayerEffects pLayerEffect = pFeatureLayer as ILayerEffects;
    11             pLayerEffect.Brightness = brightness;
    12             pLayerEffect.Contrast = contrast;
    13             pLayerEffect.Transparency = transparency;
    14         }
    View Code
  • 相关阅读:
    LINUX 新手 入门 教程
    mysql 新手入门 官方文档+官方中文文档附地址
    Git常用命令
    修改dotnet运行.netcore web程序默认端口
    centos7.6下部署.netcore3.1web程序
    supervisor安装及使用(转载)
    linux(CentOS7.6)下安装mysql8.0并使用navicat远程访问
    uni-app为组件uni-icons增加自定义图标(超简单)
    常用正则表达式收录(持续更新)
    CentOS7.6安装SQL SERVER 2017
  • 原文地址:https://www.cnblogs.com/cloud915/p/3116213.html
Copyright © 2011-2022 走看看