【AE】【要素操作】

//选择
    using Carto,Geodatabase
    IMap.Feature,SelectionCount,ClearSelection();
    
    ISeclecton.Clear()
    IEnumFeature.Next()
    
    IFeatureSelection.SelectionSet;得到SelectionSet
        SelectionSet.Count;,Search();得到ICursor
        ICursor as IFeatureCursor;	IFeatureCursor.NextFeature();
//查询
    QueryFilter:WhereClause,SubFields
    ICursor::NextFeature()
        QueryDef:Tables,Evaluate()返回结果集的ICursor可以基于行遍历
        IFeatureLayer.Search()获得IFeatureCursor用于遍历
        IFeatureLayer的IFeatureSelection.SelectFeatures(),SelectionSet//只有IFeatureSelection会高亮显示
//2拉框选择
        方法一
            MapControl.TrackRectange绘制矩形,矩形为空时,则将鼠标点击点向外拓展为矩形作为选择区域
            IMap.SelectByShape方法选择要素
        方法二
            ICommand pCommand = new ControlsSelectFeaturesToolClass();
            ITool pTool = pCommand as ITool;
            pCommand.OnCreate(this.axMapControl1.Object);
            this.axMapControl1.CurrentTool = pTool;
        
        IEnvelope pEnv = mainMapControl.TrackRectangle();
        IGeometry pGeo = pEnv as IGeometry;
        //矩形框若为空,即为点选时,对点范围进行扩展
        if (pEnv.IsEmpty == true)
        {
            tagRECT r;
            r.left = e.x - 5;
            r.top = e.y - 5;
            r.right = e.x + 5;
            r.bottom = e.y + 5;
            pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4);
            pEnv.SpatialReference = pActiveView.FocusMap.SpatialReference;
        }
        pGeo = pEnv as IGeometry;
        mainMapControl.Map.SelectByShape(pGeo, null, false);
        mainMapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

//2通过地图中第一个图形选择
    private void ToolStripMenuItemQueryByGraphics_Click(object sender, EventArgs e)
    {
        try
        {
            //首先清空地图选择集,以进行后续的选择操作
            axMapControl.Map.FeatureSelection.Clear();
    
            //使用IGraphicsContainer接口获取地图中的各个图形(Graphics),矩形,圆形,多边形等等Graphics
            IGraphicsContainer graphicsContainer = axMapControl.Map as IGraphicsContainer;
            //重置访问图形的游标,使IGraphicsContainer接口的Next()方法定位于地图中的第一个图形
            graphicsContainer.Reset();
            //使用IElement接口操作所获取第一个图形
            IElement element = graphicsContainer.Next();
            //获取图形的几何信息
            IGeometry geometry = element.Geometry;
            //使用第一个图形的几何形状来选择地图中的要素。
            axMapControl.Map.SelectByShape(geometry, null, false);
            //进行部分刷新以显示最新的选择集
            axMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, axMapControl.ActiveView.Extent);
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
        }
    }

//3缩放至选择
        //ICommand pCommand = new ESRI.ArcGIS.Controls.ControlsZoomToSelectedCommandClass();
        //pCommand.OnCreate(mainMapControl.Object);
        //pCommand.OnClick();
        
        private void btnZoomToSel_Click(object sender, EventArgs e)
        {
            int nSlection = mainMapControl.Map.SelectionCount;
            if (nSlection == 0)
            {
                MessageBox.Show("请先选择要素!", "提示");
            }
            else
            {
                ISelection selection = mainMapControl.Map.FeatureSelection;
                IEnumFeature enumFeature = (IEnumFeature) selection;
                enumFeature.Reset();
                IEnvelope pEnvelope = new EnvelopeClass();
                IFeature pFeature = enumFeature.Next();
                while (pFeature != null)
                {
                    pEnvelope.Union(pFeature.Extent);
                    pFeature = enumFeature.Next();
                }
                pEnvelope.Expand(1.1, 1.1, true);
                mainMapControl.ActiveView.Extent = pEnvelope;
                mainMapControl.ActiveView.Refresh();
            }
        }

//4添加要素
        //获得点
            MapControl的OnMouseDown里面写:
            IPoint point=new PointClass();
            point.PutCoords(e.mapX,e.mapY);//把在地图上点击的点存下来;
        //获得指定图层
        //遍历判断图层名,map.get_Layer(i).Name,直到得到要添加要素的图层
        //获得新的空的要素(row)
            IFeatureLayer featureLayer=layer as IFeatureLayer;
            IFeatureClass featureClass=featureLayer.FeatureClass;
            IFeature pFeature = featureClass.CreateFeature(); 
        //把点赋给新的空的要素(row)
            pFeature = pFeatCls.CreateFeature();             
            pFeature.set_Value(pFeature.Fields.FindField("Name"),"新增点");//增加属性index,value
            pFeature.Shape =Point;
            pFeature.Store();
                    
            Map as ActiveView 
            ActiveView.Refresh();

//5添加标注
        IFeatureClass.Search(null,true)获得IFeatureCursor.NextFeature();获得要素
        IFeature.get_Value()获取属性值,并赋给ITextElement.Text
        将ITextElement添加到Map
        
        private void 显示北京各区县名称ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            IFeatureCursor pFCursor = p北京区县界要素图层.Search(null, false);
            IFeature pF = pFCursor.NextFeature();
            int index = pF.Fields.FindField("NAME");
            while (pF != null)
            {
                ITextElement pTE = new TextElementClass();
                pTE.Text = pF.get_Value(index).ToString();
                
                IElement pEle = pTE as IElement;
                pEle.Geometry = pF.Extent;
                
                pGraphicsContainer.AddElement(pEle, 0);
                
                pF = pFCursor.NextFeature();
            }
            pActiveView.Refresh();
        }

//批量添加XY数据
            “添加XY数据”工具
            “创建XY事件图层”工具 
            GP工具(MakeXYEventLayer)将某个 x,y 坐标表添加到地图 中。
            Excel表的表头最好字段放至第一行,否则会报错。
        //实现思路: 
            第一步:读取Excel数据表,提取表名、X字段、Y字段 
            第二步:实例化数据管理工具MakeXYEventLayer 
            第三步:实例化Geoprocessor,并执行数据管理工具MakeXYEventLayer 
           第四步:使用复制要素工具将此事件图层导出为磁盘上的要素类 
           第五步:加载要素至图层中 
        
        //添加XY事件
        MakeXYEventLayer MxyLayer = new MakeXYEventLayer(tablepath, x, y, out_layer);// 参数都是string
        string tempPath = GetAppDirectory() + "TempData\\Temp.gdb\\";//要素临时存储路径
        featureClass = ConvertExcelToFeatureClass(MxyLayer, tempPath);
                  
        private IFeatureClass ConvertExcelToFeatureClass(MakeXYEventLayer xyEventLayer, string out_Layer_Path)
        {
            try
            {
                Geoprocessor GP = new Geoprocessor();
                GP.OverwriteOutput = true;
                GP.Execute(xyEventLayer, null);//执行XY事件   
        
                //复制要素
                ESRI.ArcGIS.DataManagementTools.CopyFeatures cf = new ESRI.ArcGIS.DataManagementTools.CopyFeatures();
                cf.in_features = xyEventLayer.out_layer;
                cf.out_feature_class = out_Layer_Path + xyEventLayer.out_layer;
                IGeoProcessorResult gpResult = GP.Execute(cf, null) as IGeoProcessorResult;
                IFeatureClass _featureClass;
                IQueryFilter qf;//查询过滤
                IGPUtilities gpUtils = new GPUtilitiesClass();
                gpUtils.DecodeFeatureLayer(gpResult.GetOutput(0), out _featureClass, out qf);
                IFeatureCursor cursor = featureClass.Insert(true);
                return _featureClass;
            }
            catch (Exception ex)
            {
                MessageBox.Show("导入要素失败,原因:" + ex.ToString());
                return null;
            }
        }     
//7获取图层全部要素为列表
        #region 获取图层全部要素列表
        /// <summary>
        /// 获取图层全部要素
        /// </summary>
        /// <param name="pFeatureLayer"></param>
        /// <returns></returns>
        public static List<IFeature> GetAllFeature(IFeatureLayer pFeatureLayer)
        {
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
            IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
            IFeature pFeature = pFeatureCursor.NextFeature();
            List<IFeature> featureList = new List<IFeature>();
            while (pFeature != null)
            {
                featureList.Add(pFeature);
                pFeature = pFeatureCursor.NextFeature();
            }
            //释放游标
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
            return featureList;
        }
        #endregion


//8高效复制要素
          public void LoadOnlyModeInsert(IFeatureClass sourceFeatureClass, IFeatureClass targetFeatureClass)
        {
            IFeatureClassLoad featureClassLoad = (IFeatureClassLoad)targetFeatureClass;
        
            ISchemaLock schemaLock = (ISchemaLock)targetFeatureClass;
            try
            {
                /**/
                schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
               featureClassLoad.LoadOnlyMode = true;
               /**/
                using (ComReleaser comReleaser = new ComReleaser())
                {
                    IFeatureBuffer featureBuffer = targetFeatureClass.CreateFeatureBuffer();
                    comReleaser.ManageLifetime(featureBuffer);
        
                    IFeatureCursor insertCursor = targetFeatureClass.Insert(true);
                    comReleaser.ManageLifetime(insertCursor);
        
                    IQueryFilter queryFilter = new QueryFilterClass();
                    queryFilter.WhereClause = queryClause;
                    IFeatureCursor cursor = sourceFeatureClass.Search(queryFilter, true);
        
                    IFeature sourceFeature = cursor.NextFeature();
        
                    while (sourceFeature != null)
                    {
                        //如果是线或面要素类需要执行下Simplify,这里用的点要素类,不做验证了
                        featureBuffer.Shape = sourceFeature.ShapeCopy;
        
                        for (int i = 0; i < sourceFeature.Fields.FieldCount; i++)
                        {
                            IField field = sourceFeature.Fields.get_Field(i);
                            if (field.Type != esriFieldType.esriFieldTypeOID && field.Type != esriFieldType.esriFieldTypeGeometry && field.Type != esriFieldType.esriFieldTypeGlobalID && field.Type != esriFieldType.esriFieldTypeGUID)
                            {
                                string fieldName = field.Name;
                                int index = featureBuffer.Fields.FindField(fieldName);
                                if (index > -1 && fieldName != "Shape_Length" && fieldName != "Shape_Area")
                                    featureBuffer.set_Value(index, sourceFeature.get_Value(i));
                            }
        
                        }
                        insertCursor.InsertFeature(featureBuffer);
                        sourceFeature = cursor.NextFeature();
                    }
                    insertCursor.Flush();
                    ComReleaser.ReleaseCOMObject(cursor);
        
                    IFeatureClassManage targetFeatureClassManage = targetFeatureClass as IFeatureClassManage;
                    targetFeatureClassManage.UpdateExtent();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("无法获取该要素类的排它锁,检查ArcMap是否打开了该要素类,建议关闭!");
            }
            finally
            { 
                /**/
                featureClassLoad.LoadOnlyMode = false;
                schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
                /**/
            }        
        }


//3.1复制要素工具
    IVariantArray parameters = new VarArrayClass();
    parameters.Add("roads");
    parameters.Add("roads_copy");

    gp.Execute("CopyFeatures_management", parameters, null);


//3按条件输出要素为新图层
    以下代码示例显示如何访问由“制作要素图层”工具创建的输出图层中的要素。
    
    // Intialize the geoprocessor.
    Geoprocessor GP = new Geoprocessor();
    
    // Intialize the MakeFeatureLayer tool.
    MakeFeatureLayer makefeaturelayer = new MakeFeatureLayer();
    
    // Set up the GP tool parameters and run the tool.
    makefeaturelayer.in_features = @"C:\gp\nfld.gdb\wells";
    makefeaturelayer.out_layer = "Wells_Lyr";
    makefeaturelayer.where_clause = "WELL_YIELD > 150";
    
    IGeoProcessorResult result = (IGeoProcessorResult)GP.Execute(makefeaturelayer, null);
    //IGeoprocessorResult2用于获取已执行工具的返回值。
    
    IFeatureClass fc;
    IQueryFilter qf;
    
    IGPUtilities gpUtils = new GPUtilitiesClass();
    gpUtils.DecodeFeatureLayer(result.GetOutput(0), out fc, out qf);
    //本示例使用IGPUtilities3 的 DecodeFeatureLayer方法返回由给定地理处理值对象指定的要素类和查询过滤器。
    IFeatureCursor cursor = fc.Insert(true);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值