ArcGIS Engine基础开发教程——地图和地图布局

转自http://bbs.esrichina-bj.cn/ESRI/thread-46577-1-1.html

 

ESRI BBS GIS大讲堂首发,转载请注明出处

本章是ArcGIS Engine基础开发教程的第三章,主要给大家大致讲解了,地图和地图布局的相关对象。这些对象非常重要,如果这些基本对象都不熟悉就开始搞ArcGIS Engine开发是不科学的也走不远的。

3地图和地图布局

3.1地图

3.1.1Map对象 

Map对象是ArcGIS Engine的主要对象,本章将给大家介绍地图组成结构,如何创建地图,如何对组成地图的对象进行操作,在介绍这些内容时尽量结合ArcMap学习效果会更好。

在Map对象上能显示的图形有两类一类是地理数据,一类是元素。地理数据包括矢量类型的要素数据,栅格数据,Tin等表面数据等,这些数据都保存在Geodatabase或数据文件如shapefile中,它们是用于GIS分析制图的源数据;


图1


而元素是另一种可以显示在Map上的对象,它分为两部分一类是图形元素,一类是框架元素,图形元素可以显示出来,而框架元素充当了“容器”的角色。在ArcMap中可以使用“Draw”工具在Map上直接绘制一个矩形,圆形,文本等对象,在布局视图上也可以给地图添加指北针,图例,比例尺等图形对象,这些都是图形元素。




图2


在ArcMap中Map对象是由MXDocument对象的MapFrame对象管理,MapFrame是一个框架元素。

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

Map对象主要实现的接口由IMap, IGraphicContainer, IActiveView, IMapBookmarks等接口。

IMap接口主要用于管理Map对象中的Layer对象,要素选择集对象,MapSourround对象,空间参考等对象。

Map对象可以显示图形元素(Graphics Element),Map对象通过IGraphicsContainer接口来管理这些元素对象,包括图形元素和框架元素。IGraphicsContainer返回的是Map对象中处于活动状态的Graphics layer引用指针,它可以是一个Basicgraphicslayer,也可以是CompositeGraphicsLayer中的一个图层,或者是一个FDOGraphicsLayer注记图层。

以下代码片段演示如何添加一个Element到Map上:

 

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

 

IActiveView接口定义了Map对象的数据显示功能。使用该接口可以改变视图的范围,刷新视图。
IActiveView的PartialRefresh(esriViewGeography, pLayer, null)用于刷新指定图层:
IActiveView的PartialRefresh(esriViewGeography, null, null) 用于刷新刷新所有图层:
IActiveView的PartialRefresh(esriViewGeoSelection, null, null) 用于刷新所选择的对象:
IActiveView的PartialRefresh(esriViewGraphics, null, null) 用于刷新图形元素:
IActiveView的PartialRefresh(esriViewGraphics, pElement, null) 用于刷新指定图形元素
IActiveView的PartialRefresh(esriViewGraphics, null, null) 用于刷新所有图形元素
IActiveView的PartialRefresh(esriViewGraphicSelection, null, null)用于刷新所选择的图元。
IMapBookmark接口用于管理所有的空间书签对象。

3.1.2图层对象

Map对象可以装载地理数据,这些数据是以图层的形式加载到地图对象上的,图层对象Layer作为一个数据的“中介”存在,它本身没有转载地理数据,而仅仅是获得了数据的引用,用于管理数据源的连接。地理数据始终保存在Geodatabase或者地理数据文件中。

由于地理数据的类型多样,所以Layer类也拥有众多子类(具体查看帮助),接下来主要给大家介绍要素图层—FeatureLayer对象。

3.1.3FeatureLayer对象

FeatureLayer类实现的常用主要接口如下图所示:IFeatureLayer,IFeatureLayerDefinition,FeatureSelection,IGeoDataset,IGeoFeatureLayer,IIdentify,ILayerEffects。






图3


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

IGeoFeatureLayer接口继承了ILayer和IFeatureLayer两个接口,用于控制要素图层的符号化和标注等。

IGeoDataset接口仅有两个属性,它们用于管理地理要素集。Extent可以返回当前数据集的范围,是一个IEnvelope类型的对象;
SpatialReference属性则可以让用户获得这个数据集的空间参考。

IFeatureSelection接口提供管理一个图层中的要素的选择集的方法和属性。 

以下代码片段演示如何获取要素图层符合条件获取选择集

  1. /// /// <summary>
  2.         /// 获取要素图层符合条件获取选择集
  3.         /// </summary>
  4.         /// <param name="pFeatureLayer">要素图层</param>
  5.         /// <param name="WhereClause">过滤条件</param>
  6.         /// <returns>返回选择集</returns>
  7.         private IFeatureSelection SelectLayersFeatures(IFeatureLayer pFeatureLayer, string WhereClause)
  8.         {
  9.             IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
  10.             if (pFeatureSelection == null) return null;
  11.             IQueryFilter pQueryFilter = new QueryFilterClass();
  12.             pQueryFilter.WhereClause = WhereClause;
  13.             pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
  14.             return pFeatureSelection;
  15.         }
复制代码

 

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


3.1.4矢量图层操作实例


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


比方说整个国土资源部有某一类型专题数据有若干图层,每个图层数据的范围是整个中国,这时国土资源部开发一套系统可能有这个需求,每个省只能加载本省的数据。以下函数即为按按行政区范围创建行政区范围的图层。


比方说我想获取河南省的数据只需传入行政区图层中河南省图元的Geometry即可。另外如果如果遇到行政区层必须用esriSpatialRelEnum. esriSpatialRelContains这个参数,否则行政区这个图层就不能只获取河南这个省份,它会把河南省的周围省份,河北,湖北,安徽,陕西,山东,山西等省份的图元也添加创建到新图层。

  1.          /// <summary>
  2.         /// 按行政区范围创建行政区范围的图层
  3.         /// </summary>
  4.         /// <param name="pFeatureLayer">源数据图层</param>
  5.         /// <param name="pGeometry">行政区范围</param>
  6.         /// <param name="bXZQ">图层是否为行政区</param>
  7.         /// <returns>新创建的图层</returns>
  8.         private 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.                         pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
  23.                         pQueryFilter = pSpatialFilter;                       
  24.                         pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
  25.                     }
  26.                     else
  27.                     {
  28.                         pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
  29.                         pQueryFilter = pSpatialFilter;                       
  30.                         if(pGeometry is IGeometryCollection)
  31.                         {
  32.                             for (int i = 0; i < (pGeometry as IGeometryCollection).GeometryCount; i++)
  33.                             {
  34.                                 pSpatialFilter.Geometry = (pGeometry as IGeometryCollection).get_Geometry(i); 
  35.                                 pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
  36.                             }
  37.                         }
  38.                     }                 
  39.                     IFeatureLayerDefinition pFLDefinition = pFeatureLayer as IFeatureLayerDefinition;
  40.                     IFeatureLayer pNewFeatureLayer = pFLDefinition.CreateSelectionLayer(pFeatureLayer.Name ,true, null, null);
  41.                     pNewFeatureLayer.MaximumScale = pFeatureLayer.MaximumScale;
  42.                     pNewFeatureLayer.MinimumScale = pFeatureLayer.MinimumScale;
  43.                     pNewFeatureLayer.Selectable = pFeatureLayer.Selectable;
  44.                     pNewFeatureLayer.Visible = pFeatureLayer.Visible;
  45.                     pNewFeatureLayer.ScaleSymbols = pFeatureLayer.ScaleSymbols;
  46.                     return pNewFeatureLayer;
  47.                 }
  48.                 else
  49.                 {
  50.                     return null;
  51.                 }
  52.             }
  53.             catch (Exception Err)
  54.             {
  55.                 MessageBox.Show(Err.Message, "获取SelectionLayer", MessageBoxButtons.OK, MessageBoxIcon.Information);
  56.                 return null;
  57.             }
  58.         }
复制代码



 

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.         private static 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.         }
复制代码

 

3.2地图布局


3.2.1PageLayout对象


PageLayout用以显示地图数据,并通过对地图数据进行整饰以便对地图打印输出满足不同行业对GIS出图功能的需求。PageLayout和Map这两个对象看起来非常相似,它们都是视图对象,可以显示地图;也都是图形元素的容器,可以容纳图形元素(Graphics Element)。但是所能够保存的图形类型却是有差别的。PageLayout除了保存图形元素外,还可以保存诸如MapFrame的框架元素(Frame Element)。PageLayout控件上的Map对象被PageLayout的MapFrame对象所管理的。


PageLayout类主要实现了IPageLayout接口,它定义了用于修改页面版式(layout)的方法和属性。


IPageLayout的方法ZoomToWhole方法可以让PageLayout以最大尺寸显示;


IPageLayout的ZoomToPercent方法可以按照输入的比例显示;


IPageLayout的ZoomToWidth方法可以让视图显示的范围匹配控件对象的宽度。


IPageLayout的Page属性用以获取Page对象


IPageLayout的RulerSettings属性用以获取RulerSettings对象


IPageLayout的HorizontalSnapGuides和VerticalSnapGuides属性用以获取SnapGuides对象
如下图所示:



 


图4


3.2.2Page对象

 Page对象主要来管理PageLayout对象中的页面,它用来加载地理数据,但不提供分析和查询功能。Page类的主要接口是IPage,它除了用于管理Page的颜色,尺寸和方向,还可以管理边框类型和打印区域等。例如通过IPage的FromID可以直接设置纸张大小类型(A4,A3等)。 

3.2.3SnapGrid对象

SnapGrid是PageLayout上用于摆放元素而设置的辅助点如图所示,这些点有规则呈网状排列,便于使用者对其元素,它可以直接通过IPageLayout的SnapGrid属性获得当前PageLayout使用的SnapGrid对象的引用。

SnapGrid类主要实现了ISnapGrid接口用于设置SnapGrid对象的属性,ISnapGrid的HorizontalSpacing 和VerticalSpacing属性用于设置网点之间的水平距离和垂直距离,ISnapGrid的Visible属性决定了这些网点是否可见,Draw方法将用于在Page对象上绘制一个SnapGrid对象。

以下代码片段演示如何在设置PageLayout控件上SnapGrid:

  1.        /// <summary>
  2.         /// 设置PageLayout上SnapGrid
  3.         /// </summary>
  4.         /// <param name="pPageLayout">PangeLayout对象</param>
  5.         private void SetwSnapGridOnPageLayout(IPageLayout pPageLayout)
  6.         {
  7.           
  8.            if(pPageLayout !=null)
  9.            {
  10.            ISnapGrid pSnapGrid=pPageLayout.SnapGrid;
  11.            pSnapGrid.VerticalSpacing =2;
  12.            pSnapGrid.HorizontalSpacing =2;
  13.            pSnapGrid.IsVisible =true;
  14.            IActiveView pActiveView=pPageLayout as IActiveView;
  15.            pActiveView.Refresh();
  16.            }           
  17.     }
复制代码

3.2.4SnapGuides对象

 SnapGuides是为了更好的放置地图而在Pagelayout上设置的辅助线如图所示,SnapGuides分为两种类型一种是水平辅助线通过IPageLayout的HorizontalSnapGuides属性获得,另一种是垂直辅助线通过IPageLayout的VerticalSnapGuides属性获得。每个SnapGuides都管理着一个Guide集合,即不同的类型的辅助线可以同时存在多条。

SnapGuides都实现了ISnapGuides接口,它定义了管理SnapGuide的属性和方法。

ISnapGuides的AreVisible设定SnapGuides是否可见。

ISnapGuides的GuideCount属性返回一个SnapGuides对象中的Guide的个数。而使用
ISnapGuides的Guide属性可以按索引值获得某个具体的Guide对象。

ISnapGuides的AddGuide方法将一个Guide放在指定位置上。

ISnapGuides的RemoveAllGuides和RemoveGuide方法分别可以清楚所有的Guide和按索引值清除Guide.

以下代码片段演示如何为PageLayout对象添加辅助线:

  1.        /// <summary>
  2.         /// 向PageLayout上指定位置添加辅助线
  3.         /// </summary>
  4.         /// <param name="pPageLayout">PageLayout对象</param>
  5.         /// <param name="pPoistion">位置</param>
  6.         /// <param name="bHorizontal">true为水平方向辅助线,False为垂直方向辅助线</param>
  7.         private void AddGuideOnPageLayout(IPageLayout pPageLayout,double pPoistion,bool bHorizontal)
  8.         {
  9.            try
  10.            {
  11.               if(pPageLayout !=null)
  12.               {
  13.                   ISnapGuides pSnapGuides=null;
  14.                   //如果是水平辅助线
  15.                   if(bHorizontal)
  16.                   {
  17.                      pSnapGuides=pPageLayout.HorizontalSnapGuides;
  18.                   }
  19.                   //如果是垂直辅助线
  20.                   else
  21.                   {
  22.                      pSnapGuides=pPageLayout.VerticalSnapGuides; 
  23.                   }
  24.                   if(pSnapGuides!=null)
  25.                   {
  26.                       //向PageLayout上添加辅助线
  27.                      pSnapGuides.AddGuide(pPoistion);
  28.                   }
  29.               }
  30.            }
  31.             catch(Exception Err)
  32.            {
  33.               MessageBox.Show(Err.Message,"提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  34.             }
  35. }
复制代码


3.2.5RulerSettings对象

标尺对象是为了辅助图形元素的放置而出现在PageLayout对象上方和左方的辅助尺如图所示,通过IPageLayout的RulerSettings属性可以获得PageLayout上的RulerSettings对象.

RulerSettings对象主要实现了IRulerSettings接口它只有一个SmallestDivision属性用于设置RulerSettings对象的最小刻度值属性。

3.2.6Element对象

在Map对象和PageLayout对象显示的数据除了地理数据之外,另一种即为元素数据如下图5所示。




 


图5


Element是一个非常庞大复杂的对象集合如图6所示,它主要分为两大部分:图形元素(GraphicElement)和框架元素(Frame Element)。

图形元素(GraphicElement)包LineElement, MarkerElement, TextElement, GroupElement, FillshapElement,PictureElement,MultiPatchElement等。它们都是作为图形的形式而存在,在地图视图或者PageLayout视图上时可见的。框架元素(Frame Element)包括MapFrameElement, MapSurroundElement等它们是作为不可见的容器而存在的。

Map对象或者PageLayout对象可以通过IGraphicsContainer接口来管理这些元素,使用IGraphicsContainer接口可以添加,删除和更新位于Map或PageLayout上的元素。使用GroupElement对象还可以将多个元素编组为单个实体来给用户使用。

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



 


图6


3.2.7MapGrid对象

MapGrid是布局视图中的一系列参考线和参考点用来帮助地图使用者快速地确定地图要素的位置如图7中的公里格网,MapGridBorder,MapGridLabel。MapGrid等。MapGrid对象由MapGrids来管理,一个MapGrids可以包含多个MapGrid对象。


 


 


 


图7


MapGrid是一个抽象类,它的子类有MeasuredGrid,IndexGrid,MgrsGrid,Graticule和CustomOverlayGrid五种,这些子类的对象由MapGridFactory对象创建。MapGride对象模型图如图8和图9所示

 


图8


 


 


图9


 


  1.           /// <summary>
  2.         /// 为PageLayout对象添加格网对象
  3.         /// </summary>
  4.         /// <param name="pPageLayout"></param>
  5.         private void AddMeasuredGridToPageLayout(IPageLayout pPageLayout)
  6.         {
  7.           try
  8.           {
  9.                //获取MapFrame对象
  10.                 IActiveView pAcitiveView= pPageLayout as IActiveView;
  11.                 IMap pMap = pAcitiveView.FocusMap;                      
  12.                 IGraphicsContainer pGraphicsContainer=pAcitiveView as IGraphicsContainer;
  13.                 IMapFrame pMapFrame = pGraphicsContainer.FindFrame(pMap) as IMapFrame;
  14.                 IMapGrids pMapGrids = pMapFrame as IMapGrids;
  15.                //创建一个MeasuredGrid对象
  16.                 IMeasuredGrid pMeasureGrid = new MeasuredGridClass();
  17.                 IMapGrid  pMapGrid = pMeasureGrid as IMapGrid;
  18.                 pMeasureGrid.FixedOrigin = true;
  19.                 pMeasureGrid.Units = pMap.MapUnits;
  20.                 pMeasureGrid.XIntervalSize = 1000;
  21.                 pMeasureGrid.YIntervalSize = 1000;
  22.                 pMeasureGrid.XOrigin = -180;
  23.                 pMeasureGrid.YOrigin = -90;
  24.                 //设置MeasuredGride投影属性
  25.                 IProjectedGrid pProGrid = pMeasureGrid as IProjectedGrid;
  26.                 pProGrid.SpatialReference = pMap.SpatialReference;
  27.                 pMapGrid.Name = "Measured Grid";
  28.                //创建一个CalibratedMapGridBorder对象并设置为pMapGrid的Border属性
  29.                 ICalibratedMapGridBorder pCalibratedBorder = new CalibratedMapGridBorderClass();
  30.                 pCalibratedBorder.BackgroundColor = GetRgbColor(255, 255, 255);
  31.                 pCalibratedBorder.ForegroundColor = GetRgbColor(0, 0, 0);
  32.                 pCalibratedBorder.BorderWidth = 0.1;
  33.                 pCalibratedBorder.Interval = 72;
  34.                 pCalibratedBorder.Alternating = true;
  35.                 pMapGrid.Border = pCalibratedBorder as IMapGridBorder;
  36.                //创建一个FormattedGridLabel对象
  37.                 IFormattedGridLabel pFormattedGridLabel = new FormattedGridLabelClass();
  38.                 IGridLabel pGridLabel = pFormattedGridLabel as IGridLabel;
  39.                 stdole.StdFont pFont = new stdole.StdFont();
  40.                 pFont.Name = "Arial";
  41.                 pFont.Size = 6;
  42.                 pGridLabel.Font = pFont as stdole.IFontDisp; ;
  43.                 pGridLabel.Color = GetRgbColor(0, 0, 0);
  44.                 pGridLabel.LabelOffset = 4;
  45.                 pGridLabel.set_LabelAlignment(esriGridAxisEnum.esriGridAxisLeft, false);
  46.                 pGridLabel.set_LabelAlignment(esriGridAxisEnum.esriGridAxisRight, false);
  47.                 INumericFormat pNumericFormat = new NumericFormatClass();
  48.                 pNumericFormat.AlignmentOption = esriNumericAlignmentEnum.esriAlignRight;
  49.                 pNumericFormat.RoundingOption = esriRoundingOptionEnum.esriRoundNumberOfSignificantDigits;
  50.                 pNumericFormat.RoundingValue = 0;
  51.                 pNumericFormat.ShowPlusSign = false;                
  52.                 pNumericFormat.ZeroPad = true;
  53.                pFormattedGridLabel.Format = pNumericFormat as INumberFormat;
  54.                 //设置pMapGrid的LabelFormat属性
  55.                 pMapGrid.LabelFormat = pGridLabel;
  56.                //添加格网
  57.                 pMapGrids.AddMapGrid(pMapGrid);
  58.           }
  59.           catch(Exception Err)
  60.           {
  61.              MessageBox.Show(Err.Message,"提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  62.           }
  63.            
  64.         }
复制代码

 

3.2.8MapSurround对象


MapSurround对象是与一个地图对象关联的用于修饰地图的辅助图形元素对象如图所示。它的形状或内容会随着Map属性的变化而自动改变。如Map视图范围改变后比例尺(ScaleBar)也会自动调整比例,比例尺文本(ScaleBarText)也会相应改变它的比例值。


MapSurround对象由MapSurroundFrame 对象管理,所有的MapSurround对象添加在布局视图上,每一个MapSurround对象可以通过IMap接口的MapSurrounds属性的索引值所获取。也可以通过IMap接口的MapSurroundCount来遍历布局视图上的所有MapSurround对象。


所有的MapSurround对象都实现IMapSurround接口,使用IMapSurround接口的Name属性可以获得MapSurround对象的名称,通过IMapSurround的FitToBound方法可以设置一个MapSurround对象的大小。


同时MapSurround类也实现了IMapSurroundEvents接口,可以用来触发MapSounrround相关事件如:AfterDraw,BeforeDraw,ContensChanged。


 


 


10


下图是MapSurround对象模型


 


 


11


如下代码演示如何为PageLayout添加Legend:


  1. /// <summary>
  2.        /// 为PageLayout对象添加图例对象
  3.        /// </summary>
  4.        /// <param name="pPageLayout">PageLayout对象</param>
  5.        /// <param name="pEnvelope">图例添加的位置</param>
  6.        private void AddLegendToPageLayout(IPageLayout pPageLayout,IEnvelope pEnvelope)
  7.        {
  8.          try
  9.          {
  10.             IActiveView pActiveView=pPageLayout as IActiveView;
  11.             IMap pMap = pActiveView.FocusMap;                      
  12.             IGraphicsContainer pGraphicsContainer=pActiveView as IGraphicsContainer;
  13.             IMapFrame pMapFrame = pGraphicsContainer.FindFrame(pMap) as IMapFrame;
  14.             UID pUID = new UID(); 
  15.             pUID.Value = "{7A3F91E4-B9E3-11d1-8756-0000F8751720}";
  16.             ISymbolBackground pSymbolBackground = new SymbolBackgroundClass();
  17.             IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
  18.             ILineSymbol pLineSymbol = new SimpleLineSymbolClass();
  19.             pFillSymbol.Color = GetRgbColor(255, 255, 255);
  20.             pLineSymbol.Color = GetRgbColor(255, 255, 255);
  21.             pFillSymbol.Outline = pLineSymbol;
  22.             pSymbolBackground.FillSymbol = pFillSymbol;
  23.             IMapSurroundFrame pMapSurroundFrame = pMapFrame.CreateSurroundFrame(pUID, null);
  24.             pMapSurroundFrame.Background = pSymbolBackground;
  25.             IElement pElement = pMapSurroundFrame as IElement;
  26.             pElement.Geometry = pEnvelope;
  27.             IMapSurround pMapSurround = pMapSurroundFrame.MapSurround;
  28.             ILegend pLegend = pMapSurround as ILegend;
  29.             pLegend.ClearItems();
  30.             pLegend.Title = "图例";
  31.             ITextSymbol pTextSymbol = new TextSymbolClass();
  32.             pTextSymbol.Size = 10;
  33.             pTextSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft;
  34.             ILegendItem pLegendItem = null;
  35.             
  36.             for (int i = 0; i < pActiveView.FocusMap.LayerCount; i++)
  37.             {
  38.                 ILayer pLayer = pActiveView.FocusMap.get_Layer(i);
  39.                 if (pLayer is IFeatureLayer)
  40.                 {
  41.                     IFeatureLayer pFLayer = pLayer as IFeatureLayer;
  42.                     IFeatureClass pFeatureClass = pFLayer.FeatureClass;
  43.                     if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)
  44.                     {
  45.                         continue;
  46.                     }
  47.                     else
  48.                     {
  49.                         pLegendItem = new HorizontalLegendItemClass();
  50.                         pLegendItem.Layer = pLayer;
  51.                         pLegendItem.Columns = 1;
  52.                         pLegendItem.ShowDescriptions = false;
  53.                         pLegendItem.ShowHeading = false;
  54.                         pLegendItem.ShowLabels = true;
  55.                         pLegendItem.LayerNameSymbol = pTextSymbol;
  56.                         pLegend.AddItem(pLegendItem);
  57.                     }
  58.                 }
  59.             }                         
  60.          }        
  61.          catch(Exception Err)
  62.          {
  63.            
  64.          }
  65.        }
复制代码

 

 

结果如下图所示:

 


 


 


12

你可能感兴趣的:(ArcGIS Engine基础开发教程——地图和地图布局)