Winform+ArcEngine二次开发学习笔记


ArcEngine二次开发

初识ArcEngine,个人笔记留档

引入主程序

			//表示绑定的arcgis产品类型,即绑定arcgis engine。			
			ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

文件操作

加载文件进MapDocument

		private IMapDocument pMapDocument;
		private bool GetMapDocument(string type)
        {
            bool flag = false;
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = type;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pMapDocument = new MapDocument();
                pMapDocument.Open(ofd.FileName);
                flag = true;
            }
            return flag;
        }

在AxMapControl控件中打开地图文件

 		public void OpenFile(AxMapControl axMapControl, string type)
        {
            if (GetMapDocument(type))
            {
                for (int i = 0; i < pMapDocument.MapCount; i++)
                {
                    axMapControl.Map = pMapDocument.get_Map(i);
                }
                axMapControl.Refresh();
            }
        }

保存文件

		public void SaveDocument()
        {
            try
            {
                pMapDocument.Save(true);
                MessageBox.Show("保存成功", "提示");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }

另存文件

		public void SaveAsDocunemt(string type)
        {
            SaveFileDialog pSaveFileDialog = new SaveFileDialog();
            pSaveFileDialog.Title = "请选择另存路径";
            pSaveFileDialog.Filter = "mxd|*.mxd";
            if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    pMapDocument.SaveAs(pSaveFileDialog.FileName);
                    MessageBox.Show("另存文件成功!");
                }
                catch (Exception e)
                {
                    MessageBox.Show("文件保存异常" + e.Message);
                    Console.WriteLine(e);
                }
            }
        }

基础功能

放大

			ICommand pCommand = new ControlsMapZoomInTool();
            ITool pTool = pCommand as ITool;
            pCommand.OnCreate(axMapControl1.Object);
            axMapControl1.CurrentTool = pTool;

缩小

			ICommand pCommand = new ControlsMapZoomOutTool();
            ITool pTool = pCommand as ITool;
            pCommand.OnCreate(axMapControl1.Object);
            axMapControl1.CurrentTool = pTool;

漫游

			ICommand pCommand = new ControlsMapPanTool();
            ITool pTool = pCommand as ITool;
            pCommand.OnCreate(axMapControl1.Object);
            axMapControl1.CurrentTool = pTool;

其他方法

           	//配合AxMapControl点击事件
			axMapControl1.Pan();

全图

			ICommand pCommand = new ControlsMapFullExtentCommand();
            pCommand.OnCreate(axMapControl1.Object);
            pCommand.OnClick();

其他方法

			axMapControl1.Extent = axMapControl1.FullExtent;

清除选中

			ICommand pCommand = new ControlsClearSelectionCommand();
            pCommand.OnCreate(axMapControl1.Object);
            pCommand.OnClick();

点选

			pPoint = axMapControl1.ToMapPoint(e.x, e.y);
            axMapControl1.Map.SelectByShape(pPoint, null, false);
            axMapControl1.Refresh();

框选

			IMap pMap = axMapControl.Map;
            IActiveView pActiveView = pMap as IActiveView;
            IEnvelope pEnv = axMapControl.TrackRectangle();
            pMap.SelectByShape(pEnv, null, false);
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

多边形选

            pPolygon = axMapControl.TrackPolygon() as IPolygon;
            axMapControl.Map.SelectByShape(pPolygon, null, false);
            axMapControl.Refresh();

获取地图中文单位

        public static string GetMapUnits(esriUnits esriUnits)
        {
            string MapUnits = "";
            switch (esriUnits)
            {
                case esriUnits.esriUnknownUnits:
                    MapUnits = "未知单位";
                    break;
                case esriUnits.esriInches:
                    MapUnits = "英寸";
                    break;
                case esriUnits.esriPoints:
                    MapUnits = "点";
                    break;
                case esriUnits.esriFeet:
                    MapUnits = "尺";
                    break;
                case esriUnits.esriYards:
                    MapUnits = "码";
                    break;
                case esriUnits.esriMiles:
                    MapUnits = "万里";
                    break;
                case esriUnits.esriNauticalMiles:
                    MapUnits = "海里";
                    break;
                case esriUnits.esriMillimeters:
                    MapUnits = "毫米";
                    break;
                case esriUnits.esriCentimeters:
                    MapUnits = "厘米";
                    break;
                case esriUnits.esriMeters:
                    MapUnits = "米";
                    break;
                case esriUnits.esriKilometers:
                    MapUnits = "公里";
                    break;
                case esriUnits.esriDecimalDegrees:
                    MapUnits = "十进制";
                    break;
                case esriUnits.esriDecimeters:
                    MapUnits = "分米";
                    break;
                case esriUnits.esriUnitsLast:
                    MapUnits = "UnitsLast";
                    break;
            }
            return MapUnits;
        }

传入几何对象,返回带样式的ISymbol

        public ISymbol GetSymbolByShape(IGeometry pGeometry)
        {
            //esriGeometryType通常用来表示数据的几何形状,即表现层。
            //https://blog.csdn.net/u011170962/article/details/38562841?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163827147616780366519005%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163827147616780366519005&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-38562841.first_rank_v2_pc_rank_v29&utm_term=GeometryType&spm=1018.2226.3001.4187
            ISymbol pSymbol = null;
            ISimpleFillSymbol pSimpleFillSymbol = null;
            ISimpleLineSymbol pSimpleLineSymbol = null;
            ISimpleMarkerSymbol pSimpleMarkerSymbol = null;

            switch (pGeometry.GeometryType)
            {
                //未知类型(Unknown)
                case esriGeometryType.esriGeometryNull:
                    break;
                //点(Point)
                case esriGeometryType.esriGeometryPoint:
                    pSimpleMarkerSymbol = new SimpleMarkerSymbol() { Color = GetRgbColor(255, 0, 0), Style = esriSimpleMarkerStyle.esriSMSCircle };
                    pSymbol = pSimpleMarkerSymbol as ISymbol;
                    break;
                //多点(Multipoint)
                case esriGeometryType.esriGeometryMultipoint:
                    break;
                //线段(Line)
                case esriGeometryType.esriGeometryLine:
                    pSimpleLineSymbol = new SimpleLineSymbol() { Color = GetRgbColor(255, 0, 0), Width = 4 };
                    pSymbol = pSimpleLineSymbol as ISymbol;
                    break;
                //圆弧(CircularArc)
                case esriGeometryType.esriGeometryCircularArc:
                    break;
                //椭圆弧(EllipticArc)
                case esriGeometryType.esriGeometryEllipticArc:
                    break;
                //贝兹曲线(BezierCurve)
                case esriGeometryType.esriGeometryBezier3Curve:
                    break;
                //路径(Path)
                case esriGeometryType.esriGeometryPath:
                    break;
                //多段线(Polyline)
                case esriGeometryType.esriGeometryPolyline:
                    break;
                //环(Ring)
                case esriGeometryType.esriGeometryRing:
                    break;
                //多边形(Polygon)
                case esriGeometryType.esriGeometryPolygon:
                    //简单填充符号
                    pSimpleFillSymbol = new SimpleFillSymbol();
                    //设置颜色
                    pSimpleFillSymbol.Color = GetRgbColor(255, 0, 0);
                    //设置样式
                    pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
                    pSymbol = pSimpleFillSymbol as ISymbol;
                    break;
                //外包(Envelope)包络线
                case esriGeometryType.esriGeometryEnvelope:
                    //用来作图案边框
                    pSimpleLineSymbol = new SimpleLineSymbol()
                    {
                        Color = GetRgbColor(255, 0, 0),
                        Width = 1
                    };
                    //填充符号
                    pSimpleFillSymbol = new SimpleFillSymbol()
                    {
                        Color = GetRgbColor(255, 255, 255, 0),
                        Outline = pSimpleLineSymbol,//设置边框
                        Style = esriSimpleFillStyle.esriSFSDiagonalCross
                    };
                    pSymbol = pSimpleFillSymbol as ISymbol;
                    break;
                //任何类型(Any valid geometry)
                case esriGeometryType.esriGeometryAny:
                    break;
                //任意几何类型的集合(GeometryBag)
                case esriGeometryType.esriGeometryBag:
                    break;
                //表面几何(MultiPatch)
                case esriGeometryType.esriGeometryMultiPatch:
                    break;
                //三角带(TriangleStrip)
                case esriGeometryType.esriGeometryTriangleStrip:
                    break;
                //三角扇形(TriangleFan)
                case esriGeometryType.esriGeometryTriangleFan:
                    break;
                //射线(Ray)
                case esriGeometryType.esriGeometryRay:
                    break;
                //球体(Sphere)
                case esriGeometryType.esriGeometrySphere:
                    break;
                //三角形(Triangles)
                case esriGeometryType.esriGeometryTriangles:
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
            return pSymbol;
        }

简单绘图

			axMapControl1.DrawShape(pPoint as IGeometry, ref obj);//暂存,屏幕不能刷新,一般用在查询

绘制点

					//新建点
                    IPoint pPoint = new Point();
                    pPoint.X = e.mapX;
                    pPoint.Y = e.mapY;
                    //设置点样式
                    ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbol();
                    pSimpleMarkerSymbol.Color = new RgbColor() { Red = 255, Green = 5, Blue = 6 };
                    pSimpleMarkerSymbol.Size = 5;
                    pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle;
                    ISymbol pSymbol = pSimpleMarkerSymbol as ISymbol;
                    object obj = pSymbol;
                    axMapControl1.DrawShape(pPoint as IGeometry, ref obj);//在mapControl上绘制点,暂存
                    break;

绘制线

 					IPolyline pLine = axMapControl1.TrackLine() as IPolyline;
                    SimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbol();
                    pSimpleLineSymbol.Color = new RgbColor() { Red = 255, Green = 5, Blue = 6 };
                    pSimpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
                    object pSymbolLine = pSimpleLineSymbol as ISymbol as object;
                    axMapControl1.DrawShape(pLine as IGeometry, ref pSymbolLine);

绘制多边形


绘制矩形


查询

简单查询

		public static void AttrSearch1(AxMapControl axMapControl1, int layerid, string sql)
        {
            //获取查询的图层
            ILayer pLayer = axMapControl1.Map.get_Layer(layerid);
            //要素图层
            IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
            //要素类
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass as IFeatureClass;
            //定义过滤器
            IQueryFilter pQueryFilter = new QueryFilter();
            //在过滤器设定属性条件
            pQueryFilter.WhereClause = sql;
            //要素游标
            IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter, true);
            //要素(找到第一个要素)
            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                //axMapControl1.FlashShape(pFeature.Shape);
                //pFeature = pFeatureCursor.NextFeature(); //选择下一个要素
                ISymbol pSymbol;
                IGeometry pGeometry = pFeature.Shape;
                pSymbol = GetSymbol(pGeometry);
                object obj;
                obj = pSymbol;
                axMapControl1.FlashShape(pGeometry, 10, 30, obj);
                axMapControl1.Map.SelectFeature(pLayer, pFeature);
                axMapControl1.Refresh();
                pFeature = pFeatureCursor.NextFeature();
            }
        }

复杂查询

可以在查询结果加样式,进行二次查询

		public static void AttSearch2(AxMapControl axMapControl1, int layerid, string sql)
        {
            ILayer player = axMapControl1.get_Layer(layerid);
            IFeatureLayer pFeatureLayer = player as FeatureLayer;
            IQueryFilter pQueryFilter = new QueryFilter();
            pQueryFilter.WhereClause = sql;
            //IFeatureSelections
            IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
            //一次查询
            pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, 				false);
            pFeatureSelection.SelectionColor = new RgbColor(){Blue = 255,};
            //结果集
            ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
            //游标
            ICursor pCursor = null;
            //二次查询
            pSelectionSet.Search(null, true, out pCursor);
            //要素游标
            IFeatureCursor pFeatureCursor = pCursor as IFeatureCursor;
            //要素
            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                ISymbol pSymbol;
                IGeometry pGeometry = pFeature.Shape;
                pSymbol = GetSymbol(pGeometry);
                object obj;
                obj = pSymbol;
                axMapControl1.FlashShape(pGeometry, 10, 30, obj);
                axMapControl1.Map.SelectFeature(player, pFeature);
                axMapControl1.Refresh();
                pFeature = pFeatureCursor.NextFeature();
            }
        }

空间查询

几何图形作为条件进行查询

        public static void AttSearch2(AxMapControl axMapControl1, int layerid, string sql)
        {
            ILayer player = axMapControl1.get_Layer(layerid);
            IFeatureLayer pFeatureLayer = player as FeatureLayer;
            IQueryFilter pQueryFilter = new QueryFilter();
            pQueryFilter.WhereClause = sql;
            //IFeatureSelections
            IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
            //一次查询
            pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
            pFeatureSelection.SelectionColor = new RgbColor()
            {
                Blue = 255,
            };
            //结果集
            ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
            //游标
            ICursor pCursor = null;
            //二次查询
            pSelectionSet.Search(null, true, out pCursor);
            //要素游标
            IFeatureCursor pFeatureCursor = pCursor as IFeatureCursor;
            //要素
            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                ISymbol pSymbol;
                IGeometry pGeometry = pFeature.Shape;
                pSymbol = GetSymbol(pGeometry);
                object obj;
                obj = pSymbol;
                axMapControl1.FlashShape(pGeometry, 10, 30, obj);

                axMapControl1.Map.SelectFeature(player, pFeature);
                axMapControl1.Refresh();
                pFeature = pFeatureCursor.NextFeature();
            }
        }

识别查询

        public static void Identify(AxMapControl axMapControl, IGeometry geometry, int layerId, DataGridView dgv)
        {
            ILayer pLayer = axMapControl.get_Layer(layerId);
            IIdentify pIdentify = pLayer as IIdentify;
            IArray pArray = pIdentify.Identify(geometry);
            DataTable dt = new DataTable();
            dt.Columns.Add("名称");
            dt.Columns.Add("面积");
            IIdentifyObj pIdentifyObj;
            if (pArray != null)
            {
                for (int i = 0; i < pArray.Count; i++)
                {
                    pIdentifyObj = pArray.get_Element(i);
                    //pIdentifyObj.Flash(axMapControl.ActiveView.ScreenDisplay);
                    IRowIdentifyObject pRowIdentifyObject = pIdentifyObj as IRowIdentifyObject;
                    IFeature pFeature = pRowIdentifyObject.Row as IFeature;
                    DataRow dr = dt.NewRow();
                    dr["名称"] = pFeature.get_Value(pFeature.Fields.FindField("NAME"));
                    dr["面积"] = pFeature.get_Value(pFeature.Fields.FindField("面积"));
                    dt.Rows.Add(dr);
                }

                dgv.DataSource = dt;
            }
            else
            {
                MessageBox.Show("查询结果为空");
            }
        }

容器绘图

图形可以保存,*mxd

1构建几何图形

2 几何图形添加符号ISymbol样式、颜色、大小、宽度、边框(对象)

3IGrahpicsContainer.AddElement();

绘点

                case "绘点":
                    //设置容器
                    IGraphicsContainer pGraphicsContainer = axMapControl1.Map as IGraphicsContainer;
                    //造点
                    IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
                    pPoint.X = e.mapX;
                    pPoint.Y = e.mapY;
                    //点元素
                    IMarkerElement pMarkerElement = new MarkerElement() as IMarkerElement;
                    pMarkerElement.Symbol = Tool.GetSymbol(pPoint as IGeometry) as IMarkerSymbol;
                    //定义元素接口
                    pElement = pMarkerElement as IElement;
                    pElement.Geometry = pPoint as IGeometry;
                    //绘图
                    pGraphicsContainer.AddElement(pElement, 0);
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                    break;

绘线

                case "绘线":
                    //设置容器
                    pGraphicsContainer = axMapControl1.Map as IGraphicsContainer;
                    //造几何线
                    pPolyline = axMapControl1.TrackLine() as IPolyline;
                    //线元素
                    ILineElement pLineElement = new LineElement() as ILineElement;
                    //线符号
                    pLineElement.Symbol = Tool.GetSymbol(pPolyline as IGeometry) as ILineSymbol;
                    //定义元素接口
                    pElement = pLineElement as IElement;
                    pElement.Geometry = pPolyline as IGeometry;
                    //绘图
                    pGraphicsContainer.AddElement(pElement, 0);
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                    break;

绘矩形

                case "矩形":
                    pGraphicsContainer = axMapControl1.Map as IGraphicsContainer;
                    pEnvelope = axMapControl1.TrackRectangle() as IEnvelope;
                    IRectangleElement pRectangleElement = new RectangleElement() as IRectangleElement;
                    pFillShapeElement = pRectangleElement as IFillShapeElement;
                    pFillShapeElement.Symbol = Tool.GetSymbol(pEnvelope as IGeometry) as IFillSymbol;
                    pElement = pRectangleElement as IElement;
                    pElement.Geometry = pEnvelope as IGeometry;
                    pGraphicsContainer.AddElement(pElement, 0);
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                    break;

绘多边形

 				case "多边形":
                    pGraphicsContainer = axMapControl1.Map as IGraphicsContainer;
                    pPolygon = axMapControl1.TrackPolygon() as IPolygon;
                    //pPolygon = new PolygonElement() as IPolygon;
                    IPolygonElement pPolygonElement = new PolygonElement() as IPolygonElement;
                    pFillShapeElement = pPolygonElement as IFillShapeElement;
                    pFillShapeElement.Symbol = Tool.GetSymbol(pPolygon as IGeometry) as IFillSymbol;
                    pElement = pFillShapeElement as IElement;
                    pElement.Geometry = pPolygon as IGeometry;
                    pGraphicsContainer.AddElement(pElement, 0);
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                    break;

鹰眼

围绕比例尺、AxMapControl视野变化,实现类似游戏中小地图的功能

	 	private void Form3_Load(object sender, EventArgs e)
        {
            //禁止滚轮,使小地图比例固定
            axMapControl2.AutoMouseWheel = false;
        }
		//主地图Map发生变化时候
        private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
        {
            //倒序加载图层
            for (int i = axMapControl1.LayerCount - 1; i >= 0; i--)
            {
                axMapControl2.AddLayer(axMapControl1.get_Layer(i));
            }
            //鹰眼永远保持全图
            axMapControl2.Extent = axMapControl1.FullExtent;
            axMapControl2.Refresh();
        }
		//视野发生变化时更新
        private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            //绘制主窗体的视野
            IEnvelope pEnvelope = e.newEnvelope as IEnvelope;
            //在小地图定义图形容器
            IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;
            //清空图层(每次变化清空上一次的框)
            pGraphicsContainer.DeleteAllElements();
            //矩形元素
            IRectangleElement pReaRectangleElement = new RectangleElement() as IRectangleElement;
            //符号
            IFillShapeElement pFillShapeElement = new RectangleElement() as IFillShapeElement;
            pFillShapeElement.Symbol = Tool.GetSymbol(pEnvelope as IGeometry) as ISimpleFillSymbol;
            //元素
            IElement pElement = pFillShapeElement as IElement;
            pElement.Geometry = pEnvelope;
            pGraphicsContainer.AddElement(pElement, 0);
            axMapControl2.Refresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }
        private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (e.button != 1)
            {
                return;
            }
            IPoint pPoint = axMapControl2.ToMapPoint(e.x, e.y);
            axMapControl1.CenterAt(pPoint);
        }
		private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            //鼠标左键拖动
            if (e.button == 1)
            {
                IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
                pPoint.PutCoords(e.mapX, e.mapY);//设置 x 和 y 坐标
                IEnvelope pEnvelope = axMapControl1.Extent;
                pEnvelope.CenterAt(pPoint);//CenterAt(Point)以指定地图坐标作为中心点坐标重定位地图
                axMapControl1.Extent = pEnvelope;
            }
            else if (e.button == 2)
            {
                IEnvelope pEnvelope = axMapControl2.TrackRectangle();
                axMapControl1.Extent = pEnvelope;
            }
        }

IElement

AE中绘制图形元素的方法

Element元素对象是一个非常庞杂的对象集合,主要分为两大部分:图形元素(Graphic Element)和框架元素(Frame Element);

图形元素包括GroupElement、MarkerElement、LineElement、TextElement、DataElement、PictureElement、和FillShapeElement等对象,它们都是作为图形的形式而存在的。

IElement是所有图形元素和框架元素都实现的接口,它可以确定元素的Geometry属性,Element是一个抽象类,IElement和ILineElement、ITextElement并不是父子关系,后者没有Geometry属性。

AxMapControl

基本

AxMapControl控件提供显示和操作地图文档的功能

属性 描述
Extent 当前的显示范围
FullExtent 全域
ActiveView 当前的活动窗口
MousePointer 控件上的鼠标样式
方法 描述
TrackPolygon() 检测鼠标多边形绘制
TrackRectangle() 检测鼠标长方形绘制事件
TrackCircle() 检测鼠标圆形绘制事件
TrackLine() 检测鼠标线条绘制事件
事件 描述
OnMapReplaced 当AxMapControl中的Document发生改变时执行
OnMouseDown 鼠标控件上按下
OnMouseMove 鼠标在控件上移动
视野发生变化时 视野发生变化时

AxMapControl刷新方法

ArcGIS Engine中的刷新方法主要有:

IActiveView.Refresh

全局刷新,即重绘地图中的所有内容,是效率最低的一种刷新方法。当数据量大时非常耗时。所以除非绝对必要,一般推荐使用IActiveView.PartialRefresh方法。当然如果是涉及全部显示范围的更新就需要使用Refresh,比如平移、缩放、全图等操作。

IActiveView.PartialRefresh

部分刷新,可以人为指定重绘地图中的部分内容,该方法效率高,推荐使用。

		//刷新所有图层使用: 
		activeView.PartialRefresh(esriViewGeography, null, null);
		//刷新单个图层使用: 
		activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, layer,null);
		//刷新单个图层中的某个区域使用: 
		activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, layer, envelope);
		//刷新图层中的选中要素使用: 
		activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
		//Tips: 测试只执行一次刷新即可,而ArcObjects帮助中说需要调用两次,一次在选择前,一次在选择后。
		//刷新整个Element图层或者label使用: 
		activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
		//刷新一个Element使用: 
		activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, element, null);
		//刷新选中的Element使用: 
		activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphicSelection, null, null);

IScreenDisplay.Invalidate

Invalidate方法允许刷新显示中的指定区域,该方法不推荐用户使用,因为需要手动控制绘图缓存,对用户来说该方法不是最优的,推荐使用PartialRefresh

相关