资源描述
主要内容 地图(Map)图层(Layer)元素(Element)第一节 地图(Map)地图是GIS中的重要概念,也是GIS的应用中的成果,GIS的很多成果都是用地图来说话的,当我们打开ArcMap程序后,首先看到的是数据视图(ArcMap有两种视图,数据视图和布局视图)我们看到的这个数据视图其实就是一个Map对象。在ArcMap中Map是由文档对象控制的,每一个MXD的文档文件中至少包含一个Map对象,但是在一个时刻,仅仅只能有一个Map处于使用状态,在程序中这样的Map为“FocusMap”,每一个对象都用机会成为FocusMap。IActiveView pActiveView=axMapControl1.ActiveView.FocusMap as IActiveView;可以利用IMxDocument接口的maps属性获得可以操作文档中的所有地图对象集合。利用FocusMap属性获得焦点地图。在ArcMap中,可以显示在Map中的数据有两大类,也就是地理数据和图形元素,空间数据是GIS分析制图的数据源,保存在地理数据库库或者Shp文件中,图形元素也是一种可以在Map上显示的对象。他们两个的共同特征是拥有一个geomtry属性。元素,是另一种可以显示在Map上的对象,它分为两部分一类是图形元素,一类是框架元素,图形元素可以显示出来,而框架元素充当了“容器”的角色。在ArcMap中可以使用“Draw”工具在Map上直接绘制一个矩形,圆形,文本等对象。在布局视图上也可以给地图添加指北针,图例,比例尺等图形对象,这些都是图形元素,用于地图制图输出。Map对象深入理解:Map对象是由MxDocument对象通过MapFrame对象管理的,MapFrame对象是一种框架元素。Map对象具有双重身份,一方面是数据的管理容器,可以引入地理数据和可视化元素,扮演了一个数据管理器的角色;另一方面又是它可以让用户看到这些数据,即扮演了数据显示器的角色。当我们程序员把地理数据加载到Map对象时,它是数据管理者;在刷新地图、改变显示范围时,它就是一个数据显示者。Map 双重身份!地图对象是地图数据的容器,它由图层和图形数据组成。Map对象实现了众多的接口我们重点研究:ImapIActiveViewIGraphicsContainerIMap接口该接口主要用于管理Map对象中的图层对象,要素选择集和空间参考等对象,IMap接口也往往是我们一个任务的起点。使用IMap接口,我们可以获取这个Map对象中的图层的个数,可以添加图层,删除图层,还可以利用IMap实现查询的高亮显示。IMap接口添加Shp图层功能实现(AddLayer方法)步骤:1 利用OpenFileDialog 找到Shp图层2 创建工作空间工厂3 打开要素类4 创建要素图层5 关联图层和要素类6 添加到地图控件中 openFileDialog1=new OpenFileDialog();openFileDialog1.Title=打开图层文件;openFileDialog1.Filter=map documents(*.shp)|*.shp;openFileDialog1.ShowDialog();FileInfo fileInfo=new FileInfo(openFileDialog1.FileName);string pPath=openFileDialog1.FileName;string pFolder=System.IO.Path.GetDirectoryName(pPath);string pFileName=System.IO.Path.GetFileName(pPath);IWorkspaceFactory pWorkspaceFactory=new ShapefileWorkspaceFactory();IWorkspace pWorkspace=pWorkspaceFactory.OpenFromFile(pFolder,0);IFeatureWorkspace pFeatureWorkspace=pWorkspace as IFeatureWorkspace;IFeatureClass pFC=pFeatureWorkspace.OpenFeatureClass(pFileName);IFeatureLayer pFLayer=new FeatureLayer();pFLayer.FeatureClass=pFC;pFLayer.Name=pFC.AliasName;ILayer pLayer=pFLayer as ILayer;IMap pMap=axMapControl1.Map;pMap.AddLayer(pLayer);axMapControl1.ActiveView.Refresh();Imap接口删除Shp图层功能实现(DeleteLayer方法)步骤:1 获得当前地图控件中的地图2 在地图中获得最上面的一个数据层3 删除数据层IMap pMap=axMapControl1.Map;ILayer pLayer=pMap.get_Layer(0);pMap.DeleteLayer(pLayer);Imap接口AddLayers方法,不同于AddLayer方法一次添加一个对象到Map中,AddLayers可以一次加入一个或多个图层,当然多个图层对象要放到EnumLayer对象中才能引入,EnumLayer对象是一个图层枚举对象,可以保存多个图层的指针。ClearLayers方法,不同于DeleteLayer方法一次删除一个图层,ClearLayers可以一次清除Map对象中的所有图层;LayerCount 属性,指明这个Map对象中一共有多少个图层对象Imap接口在添加地图的过程中,第一个加入Map对象图层是0号,第二个图层是1号,依次类推,0号是放在图层对话框中最上面,但是在地图中实际是放在最下面。如果在一个Map中放入两个polygon类型的图层,会发现第一次加入的图层被后一次加入的图层所掩盖。(ArcMap为例)这样层概念是GIS数据组织的一种有效形式。IMap接口在ArcMap中,使用“Select Features”工具在地图上拖拽以后,被选中的要素将会高亮显示,即使这些要素放在不同的图层上。这个工具没有什么限制,不管是点、线或者多边形,它都可以同时选IMap接口被高亮显示的要素称为“FeatureSelection”(要素选择集),程序有多种方式可以用于选择要素,比如SelectByShape方法就是其中之一 IMap pMap=axMapControl1.Map;pActiveView=pMap as IActiveView;objEnvelope=axMapControl1.TrackRectangle();ISelectionEnvironment pSelectionEnvironment=new SelectionEnvironment();pMap.SelectByShape(objEnvelope,pSelectionEnvironment,false);SelectByShape方法实现了ArcMap中“Select Features”命令的角色,它选择Map里面所有处于拖拽范围内的Featurelayer的要素,无论是哪个图层,他把选择的要素添加到Map的FeatureSelection中。IGraphicsContainer接口Map对象可以显示图形元素(Element),它使用IGraphicsContainer接口来管理这些元素对象(包括图形元素和框架元素)。使用这个接口可以完成元素添加、更新和删除元素的方法添加元素是一个往其中一个图形图层上添加元素的对象的过程,如下代码所示 IGraphicsContainer graphicsContainer;IMap map=this.axMapControl1.Map;ILineElement lineElement=new LineElementClass();IElement element;IPolyline polyline=new PolylineClass();IPoint point=new PointClass();point.PutCoords(1,5);polyline.FromPoint=point;point.PutCoords(80,5);polyline.ToPoint=point;IElement element=lineElement as IElement;接口查询!其实没有必要用lineElement,实际上也是继承 element.Geometry=polyline as IGeometry;graphicsContainer=map as IGraphicsContainer;graphicsContainer.AddElement(element,0);this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);(添加元素后一定要刷新,不然无法显示)IGraphicsContainer接口更新元素:用户改变了是Map中一个元素的形状或者符号,用户一定希望它能够及时更新后在地图上显示出来,用到UpdateElement IGraphicsContainer graphicsContainer;IPolyline polyline=new PolylineClass();IPoint point=new PointClass();point.PutCoords(1,5);polyline.FromPoint=point;point.PutCoords(80,20);polyline.ToPoint=point;IElement el;graphicsContainer=this.axMapControl1.Map as IGraphicsContainer;graphicsContainer.Reset();el=graphicsContainer.Next();if(el!=null)el.Geometry=polyline;graphicsContainer.UpdateElement(el);this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);IGraphicsContainer接口删除元素:DeleteElement用于删除Map对象中的一个给定元素 IGraphicsContainer graphicsContainer;IElement el;graphicsContainer=this.axMapControl1.Map as IGraphicsContainer;graphicsContainer.Reset();el=graphicsContainer.Next();while(el!=null)graphicsContainer.DeleteElement(el);el=graphicsContainer.Next();this.axMapControl1.ActiveView.Refresh();IGraphicsContainer接口选择元素:Map对象提供了SelectByShape方法用于选择要素,当然也提供了图形元素选择的方法,而且元素的选择更为简单,因为元素不保存到MXD文件前,都是存储到缓存,只存在内存中的有两种方法可以选择元素一是LocateElements方法,该方法是使用一个点来选择元素,需要传入一个点对象和容差值,Map对象会将所用处于点容差范围内的元素选择到。二是LocateElementsByEnvelope方法,它和SelectByShape方法类似,使用鼠标在图上拖拽出一个矩形,从而选择这个区域内的所有元素。当然元素既然可以选择,也就有相应的选择集,但是使用很少。IActiveView接口前面的两个接口都是管理图形的 而IActiveView接口定义了Map对象的另一个功能-数据显示功能。使用该接口可以改变视图的范围,刷新视图。在ArcMap中,有两个对象实现了这个接口,PageLayout和Map。这两个对象分别代表了ArcMap中两种不同的视图,数据视图和版式视图,在任何一个时刻仅仅只能有一个视图处于活跃状态。如果ArcMap处于版式视图状态,则ActiveView返回一个IActiveView对象指向PageLayout对象的,反之,处于视图状态,则指向Map对象。IActiveView接口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)用于刷新所选择的图元Extent属性返回Map对象的当前视图的范围,是一个Envolope对象FullExtent属性可以返回视图的全图范围IGraphicsContainer接口选择元素:Map对象提供了SelectByShape方法用于选择要素,当然也提供了图形元素选择的方法,而且元素的选择更为简单,因为元素不保存到MXD文件前,都是存储到缓存,只存在内存中的有两种方法可以选择元素一是LocateElements方法,该方法是使用一个点来选择元素,需要传入一个点对象和容差值,Map对象会将所用处于点容差范围内的元素选择到。二是LocateElementsByEnvelope方法,它和SelectByShape方法类似,使用鼠标在图上拖拽出一个矩形,从而选择这个区域内的所有元素。当然元素既然可以选择,也就有相应的选择集,但是使用很少。第二节 图层(Layer)Map对象可以装载地理数据,这些数据是以图层的形式加载到地图对象上的,图层对象Layer作为一个数据的“中介”存在,它本身没有转载地理数据,而仅仅是获得了数据的引用,用于管理数据源的连接。地理数据始终保存在Geodatabase或者地理数据文件中。ILayer接口所有图层类都实现这一接口,它定义了所有图层的公共方法和属性,如Name属性可以返回图层名称,MaximunScale和MinimunScale两个可写属性,用于显示和设置图层可以出现的最大尺寸和最小尺寸。Showtips属性用于指示当鼠标放在图层某个要素上的时候,是否会出现提示(Tips),TipText确定图层可提示显示的区域。SpatialReference属性用于设置图层的空间参考,这个对象是从Map对象中传入,对于地理数据及其重要IFeatureLayer接口IFeatureLayer接口主要用于设置要素图层的数据源(FeatureClass),IFeatureLayer的DataSourceType获取FeatureLayer对象的数据源类型。此外通过IFeatureLayer的Search方法可以查询要素图层上符号某一条件的要素集。IGeoFeatureLayer接口继承了ILayer和IFeatureLayer两个接口,用于控制要素图层的符号化和标注等。IGeoDataset接口仅有两个属性,它们用于管理地理要素集。Extent可以返回当前数据集的范围,是一个IEnvelope类型的对象;SpatialReference属性则可以让用户获得这个数据集的空间参考。IFeatureSelection接口提供管理一个图层中的要素的选择集的方法和属性。第三节 元素(Element)在Map对象和PageLayout对象显示的数据除了地理数据之外,另一种即为元素数据。图形元素(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属性。要将图形元素显示到视图中的步骤:1 产生一个新的元素对象2 确定元素显示时使用的Symbol(符号)和Geometry(几何图形)3 使用IGraphicsContainer 的AddElement方法添加到视图中4 刷新视图,让添加元素显示出来如何添加一个元素到视图中要将图形元素显示到视图中的步骤:1 产生一个新的元素对象2 确定元素显示时使用的Symbol(符号)和Geometry(几何图形)3 使用IGraphicsContainer 的AddElement方法添加到视图中4 刷新视图,让添加元素显示出来如何添加一个元素到视图中要将图形元素显示到视图中的步骤:1 产生一个新的元素对象2 确定元素显示时使用的Symbol(符号)和Geometry(几何图形)3 使用IGraphicsContainer 的AddElement方法添加到视图中4 刷新视图,让添加元素显示出来如何添加一个元素到视图中添加MarkerElement IMap pMap;IActiveView pActiveView;pMap=axMapControl1.Map;pActiveView=pMap as IActiveView;IPoint pPt=null;pPt=new ESRI.ArcGIS.Geometry.Point();pPt.PutCoords(e.mapX,e.mapY);IMarkerElement pMarkerElement;pMarkerElement=new MarkerElement();ISimpleMarkerSymbol pSimpleMarkerSysbol=null;pSimpleMarkerSysbol=new SimpleMarkerSymbol();pSimpleMarkerSysbol.Color=GetColor(11,200,145,255);pSimpleMarkerSysbol.Size=2;pSimpleMarkerSysbol.Style=esriSimpleMarkerStyle.esriSMSDiamond;IElement pElement;pElement=pMarkerElement as IElement;pElement.Geometry=pPt;pMarkerElement.Symbol=pSimpleMarkerSysbol;IGraphicsContainer pGraphicsContainer;pGraphicsContainer=pMap as IGraphicsContainer;pGraphicsContainer.AddElement(pMarkerElement as IElement,0);pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);
展开阅读全文