Element分类
Element ->|Graphic Element(图形元素) | ->|TextElement | |MarkerElement | |LineElement | |PolygonElement | |GroupElement | |DataElement | |PictureElement | |FillShapeElement ->|FrameElement(框架元素) ->|MapFrame(数据框) |MapSurroundFrame(指北针、比例尺和图例) |OLEFRAME(用于放置其它应用程序对象,如Word对象) |TableFrame(其他类型,可以放置一个表格对象)
ARCGIS_ENGINE10开发手册word版:https://max.book118.com/html/2017/1213/143983980.shtm
制作图例
private void MakeLegend(IActiveView activeView,IPageLayout pageLayout) { //定义图例UID对象 UID uid = new UIDClass(); uid.Value="esriCore.Legend"; //设置图例存放的坐标位置 //定义单位 pageLayout.Page.Units = esriUnits.esriCentimeters; //得到草图容器对象 IGraphicsContainer container = pageLayout as IGraphicsContainer; //得到当前地图的框架 IMapFrame frameElement = container.FindFrame(activeView.FocusMap) as IMapFrame; IElement mapElement = frameElement as IElement; IEnvelope mapEnv = mapElement.Geometry.Envelope; IEnvelope envelope = new EnvelopeClass(); //通过当前地图框架得到相对位置 envelope.PutCoords(mapEnv.XMin, mapEnv.YMin, mapEnv.XMin + 6.5, mapEnv.YMin + 0.8); IMapSurroundFrame frame = frameElement.CreateSurroundFrame(uid, null); ILegend legend = frame.MapSurround as ILegend; ILegendFormat format = new LegendFormatClass(); format.TitlePosition = esriRectanglePosition.esriTopSide; format.LayerNameGap=0.0; format.TextGap=0.0; format.TitleGap=0.0; format.HeadingGap=0.0; format.HorizontalItemGap=0.0; format.VerticalItemGap=0.0; format.ShowTitle=true; ITextSymbol symbol = new TextSymbolClass(); symbol.Text="图例"; System.Drawing.Font ft = new System.Drawing.Font("宋体", 5); IFontDisp iFontDispFromFont = (IFontDisp)OLE.GetIFontDispFromFont(ft); symbol.Font=iFontDispFromFont; symbol.Size = 11.5; IRgbColor color = (IRgbColor)ESRI.ArcGIS.ADF.Converter.ToRGBColor(Color.Black); symbol.Color = color; //文字水平方向的对齐方式 symbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHACenter; format.TitleSymbol=symbol; legend.Format=format; legend.Title="图例"; legend.FlowRight = true; legend.ClearItems(); IMap map = activeView.FocusMap; for (int i = 0; i < map.LayerCount; i++) { IFeatureLayer layer = (IFeatureLayer)map.get_Layer(i) as IFeatureLayer; ILegendItem item = new HorizontalLegendItemClass(); item.Columns=(short)map.LayerCount; item.NewColumn=true; ITextSymbol symbolItem = new TextSymbolClass(); symbolItem.Size = 11.5; ILegendClassFormat legClsFormat = new LegendClassFormatClass(); legClsFormat.LabelSymbol = symbolItem; legClsFormat.PatchHeight = 40; legClsFormat.PatchWidth = 50; item.LegendClassFormat = legClsFormat; item.Layer=layer; item.KeepTogether=false; legend.AddItem(item); } frame.MapSurround.Name="myLegend"; IFrameProperties properties = frame as IFrameProperties; ISymbolBorder border = new SymbolBorderClass(); border.Gap=0.0; border.CornerRounding=0; IBorder border2 = border; properties.Border=border2; IFrameDecoration decoration = new SymbolBackgroundClass(); IRgbColor color1 = (IRgbColor)ESRI.ArcGIS.ADF.Converter.ToRGBColor(Color.LightSeaGreen); color1.Transparency = 50; decoration.Color = color1; decoration.CornerRounding=0; decoration.HorizontalSpacing=0.0; decoration.VerticalSpacing=0.0; properties.Background=((IBackground)decoration); IElement element = frame as IElement; element.Geometry=envelope; element.Activate(activeView.ScreenDisplay); container.AddElement(element, 0); activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); }
更新比例尺
在AE中,更新Mxd文档的比例尺,比较特殊。写代码以记录,更新比例尺代码如图所示:
[DllImport("User32.dll")] public static extern int GetDesktopWindow(); /// <summary> /// 更新比例尺 /// </summary> /// <param name="pNewMxdFile"></param> private void UpdataScale(string pNewMxdFile) { IMapDocument tMapDocument2 = new MapDocumentClass(); tMapDocument2.Open(pNewMxdFile); IPageLayout pageLayout = tMapDocument2.PageLayout; IActiveView activeView2 = (IActiveView)pageLayout; IMap map = activeView2.FocusMap; activeView2.Activate(GetDesktopWindow()); map.MapScale = _MapScale; activeView2.Refresh(); tMapDocument2.Save(true, false); tMapDocument2.Close(); }
注意事项:在这个方法中,好像只能用于更新比例尺的操作。除此之外,如果做其他操作,就会造成莫名奇妙的错误。例如:先让Map缩放到一个特性的Envelope中后,再更新一个比例尺,就有问题。Mxd打开图后,就看不见数据了。相当奇怪,不知道其他的操作会造成什么影响。主要怀疑是函数GetDesktopWindow在作怪。
所以一般把修改比例尺放到一个单独的函数中。如果Mxd中有多个Map,都要更新比例尺,则代码如下所示:
private void UpdataScale(string pNewMxdFile) { IMapDocument mapDocument = new MapDocumentClass(); mapDocument.Open(pNewMxdFile); IPageLayout pageLayout = mapDocument.PageLayout; IActiveView activeView = (IActiveView)pageLayout; IMap map = activeView.FocusMap; activeView = (IActiveView)mapDocument.PageLayout; activeView.Activate(GetDesktopWindow()); map.MapScale = _MapScale; activeView.Refresh(); pageLayout.FocusNextMapFrame(); pageLayout = mapDocument.PageLayout; activeView = (IActiveView)pageLayout; map = activeView.FocusMap; activeView = (IActiveView)mapDocument.PageLayout; activeView.Activate(GetDesktopWindow()); map.MapScale = _MapScale; activeView.Refresh(); mapDocument.Save(true, true); }
更改范围
更新Mxd的范围代码如下:
/// <summary> /// 更新缩放范围 /// </summary> /// <param name="pNewMxdFile"></param> private void UpdataExtend(string pNewMxdFile,IEnvelope pEnvelope) { IMapDocument tMapDocument2 = new MapDocumentClass(); tMapDocument2.Open(pNewMxdFile); IPageLayout pageLayout = tMapDocument2.PageLayout; IActiveView activeView2 = (IActiveView)pageLayout; IEnvelope pEnv = activeView2.Extent; pEnv = pEnvelope; //pEnv.CenterAt(point) //指向中心点 activeView2.Extent = pEnv; activeView2.Refresh(); tMapDocument2.Save(true, false); tMapDocument2.Close(); }
PageLayout 对象
PageLayout 用以显示地图数据,并通过对地图数据进行整饰以便对地图打印输出满足不同行业对GIS 出图功能的需求。PageLayout 和Map 这两个对象看起来非常相似,它们都是视图对象,可以显示地图;也都是图形元素的容器,可以容纳图形元素(Graphics Element)。但是所能够保存的图形类型却是有差别的。
PageLayout 除了保存图形元素外,还可以保存诸如MapFrame 的框架元素(FrameElement)。PageLayout 控件上的Map 对象被PageLayout 的MapFrame 对象所管理的。
PageLayout 类主要实现了IPageLayout 接口,它定义了用于修改页面版式(layout)的方法和属性。
IPageLayout 的方法ZoomToWhole 方法可以让PageLayout 以最大尺寸显示;
IPageLayout 的ZoomToPercent 方法可以按照输入的比例显示;
IPageLayout 的ZoomToWidth 方法可以让视图显示的范围匹配控件对象的宽度。
IPageLayout 的Page 属性用以获取Page 对象
IPageLayout 的RulerSettings 属性用以获取RulerSettings 对象
IPageLayout 的HorizontalSnapGuides 和VerticalSnapGuides 属性用以获取SnapGuides 对象