ae_将面积小于1500的Feature同附近Feature进行合并

private void 合并1500图斑ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            /*
             *将图层中面积小于1500的图斑与之相同BSM且相邻的最大的图斑合并。 
             */

            if(axMapControl2.LayerCount<=0)
            { MessageBox.Show("请先添加图层再合并!"); }
            else
            {
            pLayer = axMapControl2.get_Layer(0);//拿到层
            pFLayer = pLayer as IFeatureLayer;//要素层
            pFC = pFLayer.FeatureClass;//要素类
            
            IFeatureCursor pFCursor = pFC.Search(null, false);//拿到该要素下的指针

            IFeature pFeature = pFCursor.NextFeature();//递进光标的位置,拿到返回在该位置的要素对象
             


            //创建表,获得要素ID,标识码,面积,用于筛选相同表示码,面积较小的要素
            DataTable pTable = new DataTable();

            DataColumn colID = new DataColumn("要素ID");//新建一个要素列,并设置列名
            colID.DataType = System.Type.GetType("System.String");//设置该列类型
            pTable.Columns.Add(colID);//塞入表

            DataColumn colIdent = new DataColumn("标识码");
            colIdent.DataType = System.Type.GetType("System.String");
            pTable.Columns.Add(colIdent);

            DataColumn colArea = new DataColumn("面积");
            colArea.DataType = System.Type.GetType("System.Double");
            pTable.Columns.Add(colArea);

            int indexOfFID_HBTC_Z = pFC.FindField("FID_HBTC_Z");//返回要素类的指定字段的索引
            int indexOfBSM = pFC.FindField("BSM");//返回要素类的指定字段的索引
            int indexOfTBMJ = pFC.FindField("TBMJ");//返回要素类的指定字段的索引
           
            while (pFeature != null)
            {
                //string FID_HBTC_Z = pFeature.get_Value(indexOfFID_HBTC_Z).ToString();
                string BSM = pFeature.get_Value(indexOfBSM).ToString();
                double TBMJ = (double)pFeature.get_Value(indexOfTBMJ);


                //挑选出小于1500的图斑
                if (TBMJ < 1500)
                {
                    //查找标识码相同的图斑
                    MergeFeature(pFeature);

                    //IQueryFilter queryFilter1 = new QueryFilterClass();
                    //queryFilter1.WhereClause = "TBMJ=" + TBMJ.ToString();
                    //IFeatureCursor pFUpdateCursor = pFC.Update(queryFilter1, false);
                    //pFUpdateCursor.DeleteFeature();
                    
                }
                
                pFeature = pFCursor.NextFeature();
            }

            MessageBox.Show("合并成功");

            }
        }

        private void MergeFeature(IFeature tarFeature)
        {
            int indexOfBSM = pFC.FindField("BSM");
            string BSM = tarFeature.get_Value(indexOfBSM).ToString();//拿到当前feature的BSM值
            IQueryFilter queryFilter = new QueryFilterClass();
            queryFilter.WhereClause = "BSM=" + BSM;

            int tarindexOfTBMJ = pFC.FindField("TBMJ");
            double tarTBMJ = (double)tarFeature.get_Value(tarindexOfTBMJ);//拿到当前feature的TBMJ值

            IFeatureCursor updateCursor = pFC.Update(queryFilter, true);//按照查询,拿到更新要素的指针

            IFeature feature1 = updateCursor.NextFeature();//拿到BSM相同的下一个要素

            //feature1.get_Value(30);

            while (feature1 != null)
            {
                //是否相邻
                ITopologicalOperator topo = (feature1.Shape as IPolygon) as ITopologicalOperator;

                IRelationalOperator rela = (feature1.Shape as IPolygon)  as IRelationalOperator;


                //bool biii = rela.Touches(tarFeature.Shape);
                if (rela.Touches(tarFeature.Shape))//如果相邻
                {
                    int indexOfTBMJ = pFC.FindField("TBMJ");//从要素类中拿到该字段索引值
                    double TBMJ = (double)feature1.get_Value(indexOfTBMJ);//拿到该要素该字段的值

                    //合并图斑
                    if (TBMJ>=1500)
                    {
                        feature1.Shape = topo.Union(tarFeature.Shape) as IPolygon;
                        feature1.Store();
                        tarFeature.Delete();//删除被合并要素
                        break;
                    }
                }
                //ESRI.ArcGIS.SpatialStatisticsTools.CalculateAreas

                //updateCursor.Flush(); //是否。。。
                
                feature1 = updateCursor.NextFeature();

            }

           

            //TokayWorkspace.ComRelease(del_featcur);
            //updateCursor = null;  


            
            axMapControl2.ActiveView.Refresh();
        }

 

posted @ 2015-01-21 15:25  毛小亮  阅读(265)  评论(0编辑  收藏  举报