zoukankan      html  css  js  c++  java
  • 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();
            }
    
  • 相关阅读:
    认识“委托”
    程序员的修炼之道:从小工到专家(一)
    知识的使用 与 知识的内化
    VB.Net中 Module 的前世今生
    memcached
    C#知识
    Android之垂直显示TextView
    Android开发之各个语言
    Android之hint提示字体大小修改,显示完全
    Android 之计算控件颜色透明度
  • 原文地址:https://www.cnblogs.com/xianerwonder/p/4238999.html
Copyright © 2011-2022 走看看