gis二次开发地图整饰与输出.ppt
第九讲 地图整饰与输出,王佳,GIS开发与应用ArcEngine方法,第九讲 地图整饰与输出,9.1 MapControl 地图控件,Map对象(CoClass,组建类)(ESRI.ArcGIS.Carto),9.2 PageLayoutControl 页面布局控件,PageLayout对象(CoClass,组建类)(ESRI.ArcGIS.Carto),9.3 Map与PageLayout对象共同点,9.4 Element对象(ESRI.ArcGIS.Carto),图形元素框架元素,MapFrame对象,MapSurroundFrame对象,9.5 MapSurround对象(ESRI.ArcGIS.Carto)9.6 地图输出,GIS开发与应用ArcEngine方法,9.1 MapControl地图控件,MapControl控件对应ArcMap中的数据视图(Data View),它封装了Map对象(CoClass,组建类),并提供了额外的属性、方法、事件用于:,管理控件的外观、显示属性和地图属性;,添加并管理控件中的数据层;装载Map地图文档(mxd);动态添加和显示几何对象等;Map组件类主要接口IMap:,IMap pMap=axMapControl1.Map;,GIS开发与应用ArcEngine方法,9.2 PageLayoutControl页面布局(版式)控件,PageLayoutControl对应ArcMap中的布局视图(LayoutView),它封装了PageLayout对象,并提供了额外的属性、方法、事件用于:,加载地图文档(mxd);绘制地图元素;,创建布局视图(图例、指北针和比例尺等)地图的打印输出;,PageLayout组件类主要实现了IPageLayout 接口,它定义了用,于修改页面布局的方法和属性。,GIS开发与应用ArcEngine方法,IPageLayout pPageLayout=axPageLayoutControl1.,PageLayout;,IPageLayout:ZoomToWhole 方法:让PageLayout 以最大尺,寸显示;,IPageLayout:ZoomToPercent方法:让PageLayout 以按照输,入的比例显示;,IPageLayout:ZoomToWidth 方法:让视图显示的范围匹配对,象的宽度。,GIS开发与应用ArcEngine方法,9.3 Map与PageLayout对象共同点,PageLayout与Map都是视图对象,能够显示地图,都实现了IActiveView,接口;,同时它们都是图形元素的容器,能存储图形元素(Graphics Element),,都实现了IGraphicsContainer接口。,ArcGIS中可以显示在视图上的图形分为两种,地理数据和元素(Element)数据。元素是一个地图中除去要素数据外的部分,即在一幅地图中,除了保存在数据库中的地理数据外,其余的对象全部是元素。,存储的图形类型差别:Map只能保存图形元素(Graphic Element)数据;PageLayout能保存图形元素和框架元素(Frame Element)。,PageLayoutControl 上的Map对象被PageLout的MapFrame对象所管理。地图总是包含在Map对象中,而Map对象是由一个MapFrame所持有,PageLayout对象至少拥有一个MapFrame对象,而每个MapFrame中也拥有一个Map。,GIS开发与应用ArcEngine方法,6-7,IDrive燃料加速刹车,多态回顾许多不同的类可以支持相同的接口拥有相同的所有的方法和属性可以有不同的执行方式和拥有不同的属性值,许多ArcGIS的类都表现出多态的特性,其特点是在几个Classes中使用同一个Interface,但每一个Class却执行不同的methodsand properties。,MapIMap,ClearLayersDeleteLayerExtentClearDeleteElementAddElementGIS开发与应用ArcEngine方法,QIIActivewViewQIIGraphicsContainer,QI,PageLayoutIPageLayou,ZoomToPercentZoomToWholeExtentClearDeleteElementAddElementGIS开发与应用ArcEngine方法,tIActivewViewQIIGraphicsContainer,GIS开发与应用ArcEngine方法,IActiveView接口,定义了Map对象的数据显示功能。通过使用该接口可以在Map上绘制图形,改变视图的范围,获取ScreenDisplay对象的指针,刷新视图。AE中Map和PageLayout对象都实现这个接口,分别代表两种不同的视图:数据视图和布局视图。在任何时刻都只能有一个视图处于活动状态。,IActiveView pActiveView=pMap as IActiveView;,IActiveView pActiveView=pPageLayout as IActiveView;,IActiveView的重要属性:Extent属性,返回Map对象当前视图的范围,是一个Envelope对象;,FullExtent:返回视图的全图范围;Refresh方法:一种刷新方式,PartialRefresh方法:部分刷新方式。,GIS开发与应用ArcEngine方法,GIS开发与应用ArcEngine方法,IGraphicsContainer接口,IGraphicsContainer 接口管理Map 和PageLayout 对象上储存的元素,使用,IGraphicsContainer 接口可以添加,删除和更新位于Map 或PageLayout上的元素。,IGraphicsContainer pGraphicsContainer=pMap as IGraphicsContainer;IGraphicsContainer pGraphicsContainer=pPageLayout as IGraphicsContainer;,/PageLayout对象引用赋给IGraphicsContainer接口的对象变量,得到GraphicsContainer对象。,AddElement:添加元素;,用法:pGraphicsContainer.AddElement(pElement,0),UpdateElement:更新元素:,DeleteElement:删除元素;LocateElement:选择元素,DeleteAllElements;,LocateElementsByEnvelope:Map上拖曳一个矩形区域,选择区域内的元素,SpatialReference属性:设置图形元素的空间参考。空间参考是一个图形能够在一定范围内正确显示所必须设置的属性。,GIS开发与应用ArcEngine方法,如何刷新显示,使用IActiveView的Refresh方法,刷新所有的显示(但是不刷新TOC表),使用IScreenDisplay的Invalidate的方法,只刷新指定的范围(envelope),也许你只需要刷新部分的显示区域,被新图形元素覆盖的区域,比直接刷新整个文档的效率高,使用IActiveView的PartialRefresh方法,用于 Layout 视图或者 Data view指定什么需要刷新(e.g.,graphics)指定哪里需要刷新(an envelope),GIS开发与应用ArcEngine方法,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(esriViewGraphicSelection,null,null)用于刷新所选择的图元。,GIS开发与应用ArcEngine方法,Map 对象和PageLayout 对象显示的数据除了地理数据之外,另,一种即为元素(Element)数据如图所示。,GIS开发与应用ArcEngine方法,9.4 Element对象,Element对象是一个非常庞大复杂的对象集合如图,它主要分为两大部分:图形元素(GraphicElement)和框架元素(FrameElement)。图形元素可以被放在页面视图或地图上,但框架元素只能放在页面视图上,如地图标题是放置于页面版面设计上的一个文本元素。,IElement是所有图形元素(GraphicElement)和框架元素(Frame Element)都实现的接口,通过IElement接口可以确定Element对象的Geometry属性,同时IElement接口也提供,了用于查找和绘制元素的方法。,Element是抽象类,开发中必须明确指定使用的Element类型。,IElement和ILineElement,ITextElement等并不是父子关系,后者没有Geometry属性,只有IElement有Geometry属性。,*,PageLayout,Element,*,Geometry,GraphicElementTextElementLineElementMarkerElement,Map*MapSurroundScaleBarLegendGIS开发与应用ArcEngine方法,FrameElementMapFrameMapSurroundFrameTableFrame,对象模型图MxDocumentArcMap OMD,GIS开发与应用ArcEngine方法,GIS开发与应用ArcEngine方法,图例,元素(Elements)有一些可以创建的对象,图形元素的种类,marker,Line,polygon,Text and pictures,框架元素(FrameElements),在PageLayout上使用,Map framesNorth arrows,legends,scale barsTable framesGIS开发与应用ArcEngine方法,Element,IElement,Geometry,GraphicElement,FrameElement,BmpPictureElement,TextElement,MarkerElement,LineElement,GIS开发与应用ArcEngine方法,绘制图形,MapControl控件提供了直接在控件上绘制图形和文字的方法,如DrawShape,DrawText,这两个方法绘制的图形都是缓冲Cache,而不是真正的保存,一旦出现窗口重绘,如地图刷新等,这些图形就将消失。,GIS开发与应用ArcEngine方法,9.4.1 图形元素(Graphic Element),图形元素包括以下对象,做为图形的形式存在,在视图上可,见:,MarkerElementLineElementTextElement,FillShapeElementGroupElementPictureElement,GIS开发与应用ArcEngine方法,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类型的Symbol和点作为它的Geometry。,GIS开发与应用ArcEngine方法,要将图形元素显示在视图的一般步骤如下:,产生一个新的元素对象;,确定元素显示时使用的Symbol(符号)和Geometry(几何,形体对象);,使用IGraphicsContainer:AddElement方法把元素添加到视图,中;,刷新视图,显示添加的元素。,例子:创建一个新的图形元素并设置它的符号IMarkerElement pMarkerElement;,pMarkerElement=new MarkerElementClass();ISimpleMarkerSymbol pMarkerSym;pMarkerSym=new SimpleMarkerSymbolClass();,/创建一个新的元素/创建新符号,/指定符,pMarkerSym.Style=esriSimpleMarkerStyle.esriSMSCircle号的样式(风格),pMarkerSym.Color=getRGB(255,0,0);pMarkerElement.Symbol=pMarkerSym,/用函数设置符号的颜色为红色/并把颜色赋给符号 把符号赋给元素GIS开发与应用ArcEngine方法,IElement,pElement;,pElement,定义一个元素的位置使用IElement 的 Geometry属性被所有Element的子类所支持在地图(Map)或布局(layout page)上定位Geometry可以指定为 point,line,envelope等,IElementpElement,pElement;=pMarkerElement as IElement,QIIPoint pPoint;new PointClass();pPoint.PutCords(69.751,-7.534);/Ipoint的PutCoords方法:指定坐标点建立PointpPoint;GIS开发与应用ArcEngine方法,pGContainer.AddElement(pElem,0),0=top element,把一个元素添加到 map(或者 layoutpage)使用 IGraphicsContainer:AddElement指定添加的元素和它的序号0号的序号是第一个(最顶部)的元素,序号从顶到底逐渐增加IMap pMap=new axMapControl1.Map;IActiveViewpActiveView=pMap as IActiveView;IGraphicsContainer pGraphicsContainer=pMap as IGraphicsContainer;,pGContainer.AddElement(pElem,0),0=top element,pActiveView.Refresh();通过刷新屏幕来显示新添加的元素GIS开发与应用ArcEngine方法,GIS开发与应用ArcEngine方法,Envelope对象,Envelope也称包络线(bounding box),是一个矩形区域。,定义了一个要素(feature)的空间范围,是每个几何体的最小外接矩形,所有的几何对象都有Envelop属性,主要接口 IEnvelope,CenterAt方法:通过改变Envelope的中心点来移动Envelope;PutCoords方法:指定坐标点建立Envelope;,IEnvelope pEnvelope,pEnvelope=pLine.Envelope,Feature,Geometry,Envelope1 Polygon FeatureIEnvelope pEnvelope=new EnvelopeClass();pEnvelope.PutCoords(1,1,2,2);IElement pElement.Geometry=pEnvelope;GIS开发与应用ArcEngine方法,GIS开发与应用ArcEngine方法,如何添加一个MarkerElement到Map中,它放在控件的MouseDown事件中。,private void axMapControl1_OnMouseDown(object sender,ESRI.ArcGIS.MapControl.IMapControlEvents2_OnMouseDownEvent e),IMap pMap;,IActiveView pActiveView;,pMap=axMapControl1.Map;,pActiveView=pMap as IActiveView;IPoint pPt;,pPt=new PointClass();,pPt.PutCoords(e.mapX,e.mapY);IMarkerElement pMarkerElement;,pMarkerElement=new MarkerElementClass();ISimpleMarkerSymbol pMarkerSymbol;,pMarkerSymbol=new SimpleMarkerSymbolClass();,GIS开发与应用ArcEngine方法,pMarkerSymbol.Color=getRGB(11,200,145);pMarkerSymbol.Size=2;,pMarkerSymbol.Style=esriSimpleMarkerStyle.esriSMSDiamond;IElement pElement;,pElement=pMarkerElement as IElement;,pElement.Geometry=pPt;,pMarkerElement.Symbol=pMarkerSymbol;IGraphicsContainer pGraphicsContainer;,pGraphicsContainer=pMap as IGraphicsContainer;,pGraphicsContainer.AddElement(pMarkerElement as IElement,0);,pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);,GIS开发与应用ArcEngine方法,TextElement 对象(组建类),地图的标注有两种形式:一种是保存在地理数据库中以标注类,的形式存在,另一种是使用文字元素。,TextElement 对象实现了ITextElement接口,提供了3个属,性;,.ScaleText属性 设置TextElement的文字尺寸.Text属性 设置TextElement的字符,.Symbol属性 设置TextElement的文字符号,GIS开发与应用ArcEngine方法,/设置字体(font),IFontDisp pFontDisp;,pFontDisp=new stdole.StdFontClass();pFontDisp.Name=Arial;pFontDisp.Bold=True;,pFontDisp.Underline=True;,/Setup TextSymbol that the TextElement will draw withITextSymbol pTextSymbol=new TextSymbolClass();,pTextSymbol.Font=pFontDisp;,pTextSymbol.Color=getRGBColor(255,0,0);,pTextSymbol.size=25;/set the size of the text symbol here,rather than on the font,/设置文本元素,ITextElement pTextElement=new TextElementClass();,pTextElement.Text=我的地图;,pTextElement.ScaleText=30;,pTextElement.Symbol=pTextSymbol;,GIS开发与应用ArcEngine方法,FillShapeElement对象(抽象类),FillshapeElement是抽象类,它的子类有:RectangleElement(矩形要素);CircleElement(圆形要素);EllipseElement(圆形要素);,PolygonElement(多边形要素);,这些对象的共同特点是它们的Geometry属性都是一个二维的封,闭图形。,FillShapeElement类实现了IFillShapeElement接口,通过接,口提供的Symbol属性设置元素的样式,Symbol必须是IFillSymbol对象。,GIS开发与应用ArcEngine方法,/产生一个线符号,ISimpleLineSymbol pSimpleLineSymbol;,pSimpleLineSymbol.Color=getRGBColor(255,0,0);pSimpleLineSymbol.Width=2;,/设置填充符号属性,ISimpleFillSymbol pSimpleFillSymbol;,pSimpleFillSymbol.Color=getRGBColor(255,100,80);pSimpleFillSymbol.Outline=pSimpleLineSymbol;,pSimpleFillSymbol.Style=esriSimpleFillStyle.esriSFSSolid;,/设置填充元素符号属性,IFillShapeElement pFillShapeElement;,pFillShapeElement=new PolygonElementClass();pFillShapeElement.Symbol=pSimpleFillSymbol;,GIS开发与应用ArcEngine方法,IElement pElement;,pElement=pFillShapeElement as IElement;,IPolygon pPolygon;,pPolygon=axMapControl1.TrackPolygon()as IPolygon;,/Object.TrackPolygon()在某个对象上画个多边形;/Object.TrackRectangle()在某个对象上画个矩形;,pElement.Geometry=pPolygon;,pGraphicsContainer.AddElement(pElement,0);,pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);,GIS开发与应用ArcEngine方法,GroupElement对象(组建类),GroupElement对象可以将多个元素编为一组作为一个实体使用。如果用户需要对多个要素进行相同的操作,如同时移动多个要素的时候,可以将它们编为一组。,GroupElement类实现IGroupElement接口,它定义了操作GroupElement的方法和属性。AddElement方法:把一个元素添加到GroupElements对象中,ClearElements:清空GroupElement中的所有元素;,DeleteElement;ElementCount:返回GroupElement中的元素数目。,PictureElement对象(抽象类),该对象有7个子类,如BmpPictureElement,GifPictureElement,JpgPictureElement TifPictureElement EmfPictureElement,它们分别用于往版式视图中插入bmp,gif,Jpg,tif和emf文件。每个子类都实现的接口IPictureElement,使用它可以用于操作一个图片元素。,GIS开发与应用ArcEngine方法,9.4.2 框架元素(Frame Element),框架元素(Frame Element)包括:MapElement,MapSurrundFrame,,OleFrame和TableFrame等,作为不可见的容器存在。,所有的框架元素都实现IFrameElment接口;,MapFrame对象是Map的容器,用于管理Map对象;实现IMapFrame接口,,CreateSurroundFrame方法:获得一个MapSurroundFrame对象。MapSurroundFrame对象是MapSorrund的容器,是一种用于管理MapSorrund对象的框架元素,该对象包括比例尺,比例文本,指北针,图例等;,MapSorrund对象自动与某个地图对象关联,随着地图视图的变化而变化。,MapSurroundFrame对象实现IMapSurroundFrame接口。每个MapSurroundFrame对象都与一个MapFrame相联系,如果MapFrame被删除,与其相连的MapSurroundFrame对象都绘被删除。,框架元素FrameElement,属于 PageLayout 的附属,MapSurroundFrame elementsMapSurrounds对象的容器(e.g.,Scalebars)内容动态更新,IElementGraphicElement,TextElement,MapFrameMapSurroundFrame,*FrameElement,PageLayout,Element,Map,*,MapSurroundScaleBarGIS开发与应用ArcEngine方法,MapSurroundFrame,MapSurround,GIS开发与应用ArcEngine方法,9.5 MapSurround 对象(地图整饰对象),MapSurround指图例,北针、比例尺、比例文本等对象;,MapSurround 对象并不是简单的图形,而是直接和地图动态连接。它与一个地图对象关联的用于修饰地图的辅助图形元素对象如图所示。它的形状或内容会随着Map 属性的变化而自动改变。,MapSurround并不是直接被加入到页面布局中去的,而是被加入到某一特定类型的框架元素中,这一框架元素称为MapSurroundFrame。如Map 视图范围改变后比例尺(ScaleBar)也会自动调整比例,比例尺文本,(ScaleBarText)也会相应改变它的比例值。,MapSurround 对象由MapSurroundFrame 对象管理,所有的MapSurround,对象添加在布局视图上。,所有的MapSurround 对象都实现IMapSurround 接口:IMapSurround:Name 属性:获得MapSurround 对象的名称;,IMapSurround:FitToBound 方法:设置一个MapSurround 对象的大小。,GIS开发与应用ArcEngine方法,GIS开发与应用ArcEngine方法,图例,GIS开发与应用ArcEngine方法,Legend图例对象,图例Legend是一个与Map对象中图层的渲染相关的对象,通过渲染对象在地图上产生专题地图。,Legend类主要实现ILegend接口,提供获得和修改属性的属性与方法:,AddItem 添加图例;,ClearItems:清除图例;,AutoAdd为true时,Map对象加入新图层后,与Map关联的图例对象会响应Map图层变化,增加一个条目。,GIS开发与应用ArcEngine方法,MakerNorthArrow指北针对象,MakerNorthArrow指北针(组建类):继承NorthArrow抽象类,用于指示地图空间方位的图形,是一个MapSurround对象。,该对象实现了两个接口:IMarkerNorthArrow 和INorthArrow;,IMarkerNorthArrow:设置指北针对象的一般属性,如颜色,尺寸和位置等;,INorthArrow:定义一个属性MarkSymbol,用于设置指北针的符号;,GIS开发与应用ArcEngine方法,ScaleBar 比例尺对象,地图上的图形与现实空间地物之间存在着一定的比例关系,通过比例尺来说明地图上的单位长度,代表着现实世界的实际长度。,ScaleBar对象是一种MapSurround对象,该类泛化出多个子类,如ScaleLine,AlternatingScaleBar(交替双刻度比例尺),DoubleAlternatingScaleBar,HollowScalbar等,这些类都实现了IScaleBar和IScaleMarks接口。IScaleBar接口的属性介绍:,Division:设置比例尺的分割单位;,DivisionsBeforeZero:设置比例尺原点左侧显示的段数;Divisions:设置比例尺的总段数(包括原点左侧的段数);Subdivisions:设置主比例尺分为几个子段;Units:设置比例尺的单位;,UnitLabel:String型,设置单位标签上的内容;UnitLabelPosition:设置单位标签显示的位置;LabelPosition:比例尺数字标签的显示位置;LabelFrequency:比例尺数字标签的风格,GIS开发与应用ArcEngine方法,ScaleText 比例尺文本,比例尺文本对象,显示明确的比例数值,它是一个文本元素,显示的比例随着地图比例尺的变化而变化。,该类实现了IScaleText接口,定义了文本的属性和方法,如Symbol和text等。,text属性用来获取比例文本的字符;,GIS开发与应用ArcEngine方法,ArcEngine地图整饰对象添加的流程,获取PageLayout对象:将PageLayoutControl控件中的,PageLayout对象赋给IPageLayout接口的对象变量;,IPageLayout pPageLayout=new axPageLayoutControl1.PageLayout;,获取与PageLayout相关联的活动视图:,IActiveView pActiveView=pPageLayout as IActiveView;,获取与PageLayout相关联的图形容器(GrphicsContainer);,IGraphicsContainer pGraphicsContainer=pPageLayout as,IGraphicsContainer;,使用IGraphicContainer的FindFrame方法查找与焦点(Focus)地图相关联的Map Frame对象;IMapFrame pMapFrame=,pGraphicsContainer.FindFrame(pActiveView.FoucsMap)asIMapFrame;,GIS开发与应用ArcEngine方法,由MapFrame对象通过CreateSurroundFrame(pID,pMapSurround)方法得到MapFrame对象。,pID表示地图要素的类型,pMapSurround表示MapSurround对象,是个可选参数,可以从样式库(StyleGallery)中获得。,举例:创建一个UID对象,并将它的值赋给图例类的ID;,UID pUid=new UIDClass();,pUid.Value=“esriCarto.legend”,IMapSurroundFrame pMapSurroundFrame=pMapFrame.CreateSurroundFrame(pUid,null);,GIS开发与应用ArcEngine方法,获取Element对象,以便它能设置框架的几何体属性(Geometry):,/将MapSurroundFrame对象引用赋给IElement接口的对象变量,从而得到,Element对象。,IElement pElement=pMapSurroundFame as IElement;,获取与Focus地图的MapFrame相关联的几何体(该几何体控制图,例在地图上的位置);pElement.geometry=pEvelope;,为图例创建一个新的封闭区域几何体,并以Focus地图的地图框架为参照来,决定该区域的位置;pEnvelope=new,EnvelopeClass();pEnvelope.PutCoords(0,0,5,5);,/采用GraphicContainer对象的AddElement(Element,ZOrder)方法,以Element对象和一个要素在容器中Z方向位置的长整型值为参数,把地图要素添加地图布局(PageLayout的图形容器)中。,刷新屏幕上的图形层。,GIS开发与应用ArcEngine方法,加图名,GIS开发与应用ArcEngine方法,