简述:普瑞时空数据建库软件(国土变更调查建库)之一(批量变更图斑)

简述:普瑞时空数据建库软件(国土变更调查建库)之一(批量变更图斑)

变更建库流程图如上所示:

其中批量变更图斑即PLBGDLTB图层是本软件中的核心图层,在空间库geodb.gdb中,新建此图层。
「PLBGDLTB」用于控制
DLTB(地类图斑)、
CJDCQ(村级调查区)、
XZQ(行政区)和
CZCDYD(城镇村等用地)图层的变更。

对于这些图层的任何变更,都需要通过PLBGDLTB图层来进行控制。

仅需修改本图层的属性和图斑范围,PLBGDLTB图层可以自动修改其他相关图层,

实现一处变更多处自动修改的功能。

#下载:
https://pan.baidu.com/s/1-dO_ztW2TSBo1N26ZgbDBQ?pwd=hhjt

https://alidocs.dingtalk.com/i/nodes/m9bN7RYPWdlb7K0mIo6wKQoEWZd1wyK0

PLBGDLTB图层字段结构说明:
注:该图层仅保留了必要的属性字段,已省略相同含义的名称字段。程序在一键生成成果时会自动根据代码字段匹配对应的名称字段内容,例如通过DLBM赋值DLMC,或通过ZZSXDM赋值ZZSXMC,既避免了误操作,也节省了输入时间。

PLBGDLTB图层中GDPDJB、KCXS字段赋值规则:

GDLX字段赋值一般规则:

当GDPDJB为2、3、4、5时,DLBM为0101水田时,GDLX=TT

当GDPDJB为2、3、4、5时,DLBM为0102水浇地或0103旱地时,GDLX=PD

其他情况时,GDLX将自动判断为空值。

对于特殊情况时,则需要手动赋值GDLX字段值。

附全国田坎系数表只示意参考值(来源网上):

陕南秦巴山地区:

TT2=0.0671

TT3=0.1119

TT4=0.1268

TT5=0.1451

PD2=0.0271

PD3=0.0595

PD4=0.0762

PD5=0.1278

其赋值代码(仅供参考):

csharp 复制代码
public class setValueClass2
    {
        public double kcxs_pd2 = 0;
        public double kcxs_pd3 = 0;
        public double kcxs_pd4 = 0;
        public double kcxs_pd5 = 0;
        //
        public double kcxs_tt2 = 0;
        public double kcxs_tt3 = 0;
        public double kcxs_tt4 = 0;
        public double kcxs_tt5 = 0;
        //
        public int overLap = 95;
        public string fcPLBGDLTBPath = "";
        public string fcPDTPath = "";
        public string fcTZFWPath = "";
        public string fdName_TZXS = "";
        //
        public bool isGdlx = true;
        public bool isPdjb = true;
        public bool isKcxs = true;
        public bool isSkipKcxs = false;
        //
        public IWin32Window parent = null;

        public void executeSetValue()
        {
            //获取所有参数            
            //全国田坎系数列表
            List<double> GJKCXSList = new List<double>();
            GJKCXSList.Add(this.kcxs_pd2);
            GJKCXSList.Add(this.kcxs_pd3);
            GJKCXSList.Add(this.kcxs_pd4);
            GJKCXSList.Add(this.kcxs_pd5);
            GJKCXSList.Add(this.kcxs_tt2);
            GJKCXSList.Add(this.kcxs_tt3);
            GJKCXSList.Add(this.kcxs_tt4);
            GJKCXSList.Add(this.kcxs_tt5);
            //土整覆盖率百分比数
            IFeatureCursor oCur = null;
            try
            {
                GProgress gp = GProgress.ShowBar(this.parent, "正在分析...");
                //                                  
                gp.Title = "正在处理...(添加图形字段并计算面积)";
                string fcDLTB_path = appAPI.CurrentProjectBaseDataBagGDBPath + "\\DLTB";
                //
                try
                {
                    new AddField(fcPLBGDLTBPath, "TXMJ_PLBGTB", "FLOAT") { field_length = 15, field_scale = 2, field_alias = "变更图斑图形面积" }.ExecuteOutException();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
                new CalculateField(fcPLBGDLTBPath, "TXMJ_PLBGTB", "round(!shape.area!,2)") { expression_type = "PYTHON_9.3" }.ExecuteOutException();
                //
                try
                {
                    new AddField(fcDLTB_path, "TXMJ_DLTB", "FLOAT") { field_length = 15, field_scale = 2, field_alias = "地类图斑图形面积" }.ExecuteOutException();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
                new CalculateField(fcDLTB_path, "TXMJ_DLTB", "round(!shape.area!,2)") { expression_type = "PYTHON_9.3" }.ExecuteOutException();
                //
                gp.Title = "正在处理...(批量变更图斑与基础地类图斑DLTB和坡度图PDT空间叠加)";
                //
                string outGDB = appAPI.CurrentProjectDir + "\\setParameters.gdb";
                //父目录自动创建功能
                if (System.IO.Directory.Exists(outGDB) == true)
                {
                    //删除已检查结果文件
                    fileFactory.DeleteDirectory(outGDB, true);
                }
                //创建输出gdb库...
                gpAPI.CreateGDB(outGDB);
                //
                string inFeatures = fcPLBGDLTBPath + ";" + fcDLTB_path + ";" + fcPDTPath;
                string fcBGTB_DLTB_PDTPath = outGDB + "\\BGTB_DLTB_PDT";
                new Union(inFeatures, fcBGTB_DLTB_PDTPath).ExecuteOutException();
                //
                gp.Title = "正在处理...空间叠加后图形面积计算";
                try
                {
                    new AddField(fcBGTB_DLTB_PDTPath, "TXMJ_UNION3", "FLOAT") { field_length = 15, field_scale = 2, field_alias = "联合3图形面积" }.ExecuteOutException();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
                new CalculateField(fcBGTB_DLTB_PDTPath, "TXMJ_UNION3", "round(!shape.area!,2)") { expression_type = "PYTHON_9.3" }.ExecuteOutException();
                //                                
                IFeatureClass fc_BGTB_DLTB_PDT = FeatureClassEx.OpenFeatureClass(fcBGTB_DLTB_PDTPath);
                //
                Dictionary<int, TBClass> FID_BGTB_PDJB = new Dictionary<int, TBClass>();
                Dictionary<int, TBClass> FID_DLTB_PDJB = new Dictionary<int, TBClass>();
                //
                int FID_PLBGDLTB = int.MinValue;
                int FID_DLTB = int.MinValue;
                string PDT_PDJB = "";
                string DLTB_KCXS = "";
                string DLTB_GDPDJB = "";
                string DLBM_H = "";
                string DLBM_Q = "";
                //
                double TXMJ_PLBGTB = 0;
                double TXMJ_DLTB = 0;
                double TXMJ_UNION3 = 0;
                gp.Title = "正在处理...处理关系一";
                //处理关系一
                IFeatureCursor fCur = fc_BGTB_DLTB_PDT.Search(null, false);
                IFeature feat = fCur.NextFeature();
                while (feat != null)
                {
                    FID_PLBGDLTB = feat.GetValueInt("FID_PLBGDLTB");
                    FID_DLTB = feat.GetValueInt("FID_DLTB");
                    //
                    PDT_PDJB = feat.GetValueString("PDJB");         //坡度图中pdjb值
                    DLTB_KCXS = Math.Round(feat.GetValueDecimal("KCXS_1"), 4).ToString();   //地类图斑中kcxs值
                    DLTB_GDPDJB = feat.GetValueString("GDPDJB_1");   //地类图斑中pdjb值
                    DLBM_H = feat.GetValueString("DLBM");       //变化后地类编码
                    DLBM_Q = feat.GetValueString("DLBM_1");     //变化前地类编码  _1
                    //
                    TXMJ_PLBGTB = feat.GetValueDouble("TXMJ_PLBGTB");
                    TXMJ_DLTB = feat.GetValueDouble("TXMJ_DLTB");
                    TXMJ_UNION3 = feat.GetValueDouble("TXMJ_UNION3");  //相交面积
                    //变更图斑的坡度图中PDJB面积占比统计(PDT)
                    if (FID_PLBGDLTB != -1)
                    {
                        if (FID_BGTB_PDJB.ContainsKey(FID_PLBGDLTB) == false)
                        {
                            TBClass tbClass = new TBClass();
                            tbClass.TXMJ = TXMJ_PLBGTB;
                            tbClass.DLBM = DLBM_H;
                            tbClass.Add_pdjb_pdt(PDT_PDJB, TXMJ_PLBGTB, TXMJ_UNION3);
                            tbClass.Add_FID(FID_DLTB, TXMJ_UNION3);
                            FID_BGTB_PDJB.Add(FID_PLBGDLTB, tbClass);
                        }
                        else
                        {
                            FID_BGTB_PDJB[FID_PLBGDLTB].Add_pdjb_pdt(PDT_PDJB, TXMJ_PLBGTB, TXMJ_UNION3);
                            FID_BGTB_PDJB[FID_PLBGDLTB].Add_FID(FID_DLTB,TXMJ_UNION3);
                        }
                    }
                    //地类图斑的KCXS/gdpdjb面积占比统计(dltb)
                    if (FID_PLBGDLTB != -1)
                    {
                        if (FID_BGTB_PDJB.ContainsKey(FID_PLBGDLTB) == false)
                        {
                            TBClass tbClass = new TBClass();
                            tbClass.Add_kcxs_dltb(DLTB_KCXS, TXMJ_DLTB, TXMJ_UNION3);
                            tbClass.Add_gdpdjb_dltb(DLTB_GDPDJB, TXMJ_DLTB, TXMJ_UNION3, FID_DLTB);
                            FID_BGTB_PDJB.Add(FID_PLBGDLTB, tbClass);
                        }
                        else
                        {
                            FID_BGTB_PDJB[FID_PLBGDLTB].Add_kcxs_dltb(DLTB_KCXS, TXMJ_DLTB, TXMJ_UNION3);
                            FID_BGTB_PDJB[FID_PLBGDLTB].Add_gdpdjb_dltb(DLTB_GDPDJB, TXMJ_DLTB, TXMJ_UNION3, FID_DLTB);
                        }
                    }
                    //地类图斑的GDPDJB面积占比统计(采用PDT中PDJB来进行统计)
                    if (FID_DLTB != -1)
                    {
                        if (FID_PLBGDLTB == -1)
                        {
                            DLBM_H = DLBM_Q;
                        }
                        if (FID_DLTB_PDJB.ContainsKey(FID_DLTB) == false)
                        {                            
                            TBClass tbClass = new TBClass();
                            tbClass.TXMJ = TXMJ_DLTB;
                            tbClass.DLBM = DLBM_Q;
                            tbClass.Add_gdpdjb_dltb(PDT_PDJB, TXMJ_DLTB, TXMJ_UNION3, FID_PLBGDLTB);                            
                            tbClass.Add_FID(FID_PLBGDLTB, TXMJ_UNION3);
                            tbClass.Add_dlbm_QH(DLBM_Q, DLBM_H);
                            tbClass.checkIsOnlyAttChangeState(
                                feat.GetValueString("QSXZ"), feat.GetValueString("QSXZ_1"),
                                feat.GetValueString("QSDWDM"), feat.GetValueString("QSDWDM_1"),
                                feat.GetValueString("ZLDWDM"), feat.GetValueString("ZLDWDM_1"),
                                feat.GetValueString("XZDWKD"), feat.GetValueString("XZDWKD_1"),
                                feat.GetValueString("TBXHDM"), feat.GetValueString("TBXHDM_1"),
                                feat.GetValueString("ZZSXDM"), feat.GetValueString("ZZSXDM_1"),
                                feat.GetValueString("GDDB"), feat.GetValueString("GDDB_1"),
                                feat.GetValueString("MSSM"), feat.GetValueString("MSSM_1"),
                                feat.GetValueString("HDMC"), feat.GetValueString("HDMC_1"),
                                feat.GetValueString("CZCSXM"), feat.GetValueString("CZCSXM_1")
                            );                            
                            FID_DLTB_PDJB.Add(FID_DLTB, tbClass);
                        }
                        else
                        {
                            FID_DLTB_PDJB[FID_DLTB].Add_gdpdjb_dltb(PDT_PDJB, TXMJ_DLTB, TXMJ_UNION3, FID_PLBGDLTB);
                            FID_DLTB_PDJB[FID_DLTB].Add_FID(FID_PLBGDLTB, TXMJ_UNION3);
                            FID_DLTB_PDJB[FID_DLTB].Add_dlbm_QH(DLBM_Q, DLBM_H);
                            FID_DLTB_PDJB[FID_DLTB].checkIsOnlyAttChangeState(
                                feat.GetValueString("QSXZ"), feat.GetValueString("QSXZ_1"),
                                feat.GetValueString("QSDWDM"), feat.GetValueString("QSDWDM_1"),
                                feat.GetValueString("ZLDWDM"), feat.GetValueString("ZLDWDM_1"),
                                feat.GetValueString("XZDWKD"), feat.GetValueString("XZDWKD_1"),
                                feat.GetValueString("TBXHDM"), feat.GetValueString("TBXHDM_1"),
                                feat.GetValueString("ZZSXDM"), feat.GetValueString("ZZSXDM_1"),
                                feat.GetValueString("GDDB"), feat.GetValueString("GDDB_1"),
                                feat.GetValueString("MSSM"), feat.GetValueString("MSSM_1"),
                                feat.GetValueString("HDMC"), feat.GetValueString("HDMC_1"),
                                feat.GetValueString("CZCSXM"), feat.GetValueString("CZCSXM_1")
                            );
                        }
                    }
                    //
                    feat = fCur.NextFeature();
                }
                fCur.ReleaseCOMObject();
                fCur = null;
                gp.Title = "正在处理...处理关系二";
                //处理关系二
                foreach (TBClass tb in FID_DLTB_PDJB.Values)
                {
                    foreach (int fid_bgtb in tb.getFIDList())
                    {
                        if (FID_BGTB_PDJB.ContainsKey(fid_bgtb) == true)
                        {
                            FID_BGTB_PDJB[fid_bgtb].isGDALL = tb.isGDALL;
                            FID_BGTB_PDJB[fid_bgtb].isDLChange = tb.isDLChange;
                            FID_BGTB_PDJB[fid_bgtb].isOnlyAttChange = tb.isOnlyAttChange;
                        }
                    }
                }
                //                
                coreAPI.Invoke(() => { gp.Title = "正在处理...(批量变更图斑与土整范围TZFW叠加)"; });
                //相交运算(PLBGDLTB与TZFW图层)
                IFeatureClass fcPLBGDLTB = FeatureClassEx.OpenFeatureClass(fcPLBGDLTBPath);
                if (fcPLBGDLTB.FindField(fdName_TZXS) >= 0)
                {   //土整系数字段名有重复,字段名称后面加_1处理
                    fdName_TZXS = fdName_TZXS + "_1";
                }
                fcPLBGDLTB.ReleaseCOMObject();
                fcPLBGDLTB = null;
                Dictionary<int, string> dictFID_TZFW_KCXS = setValueHelper.getDictFID_KCXSListByTZFW(fcPLBGDLTBPath, fcTZFWPath, fdName_TZXS, "TXMJ_PLBGTB", overLap);

                //
                string[] pdjbs = new string[] { "2", "3", "4", "5" };
                fcPLBGDLTB = FeatureClassEx.OpenFeatureClass(fcPLBGDLTBPath);
                int gdpdjbIndex = fcPLBGDLTB.FindField("GDPDJB");
                int gdlxIndex = fcPLBGDLTB.FindField("GDLX");
                int kcxsIndex = fcPLBGDLTB.FindField("KCXS");
                int dlbmIndex = fcPLBGDLTB.FindField("DLBM");
                //
                int maxCount = fcPLBGDLTB.FeatureCount(null);
                gp.Maximum = maxCount;
                gp.Title = "正在处理...(赋值)";
                //                    
                FID_PLBGDLTB = int.MinValue;
                string pdt_pdjb = "";
                string gdlx = "";
                string dlbm = "";
                string lxjb = "";
                double pdt_kcxs = 0d;
                //耕地地类编码列表
                List<string> gdDLBMList = new List<string>();
                gdDLBMList.Add("0101");
                gdDLBMList.Add("0102");
                gdDLBMList.Add("0103");
                //
                int doIndex = 0;
                //开始赋值中...
                oCur = fcPLBGDLTB.Update(null, false);
                IFeature oFeature = oCur.NextFeature();
                while (oFeature != null)
                {
                    FID_PLBGDLTB = oFeature.OID;
                    if (FID_PLBGDLTB == 408873)
                    {
                        ;
                    }
                    if (FID_PLBGDLTB == 400017)
                    {
                        ;
                    }
                    //获取PDT中最大面积的PDJB值
                    pdt_pdjb = "";
                    if (FID_BGTB_PDJB.ContainsKey(FID_PLBGDLTB) == true)
                    {
                        pdt_pdjb = FID_BGTB_PDJB[FID_PLBGDLTB].getPDJB_pdt_byMaxMJ();  // 与坡度图相交运算,空间过滤
                    }
                    //获取DLTB中最大面积的PDJB值
                    var dltb_pdjb = "";
                    if (FID_BGTB_PDJB.ContainsKey(FID_PLBGDLTB) == true)
                    {
                        dltb_pdjb = FID_BGTB_PDJB[FID_PLBGDLTB].getPDJB_dltb_byMaxMJ();
                    }
                    //获取变化前后地类情况标志值
                    var isGDALL = true;
                    var isDLChange = false;
                    var isOnlyAttChange = false;
                    if (FID_BGTB_PDJB.ContainsKey(FID_PLBGDLTB) == true)
                    {
                        isGDALL = FID_BGTB_PDJB[FID_PLBGDLTB].isGDALL;
                        isDLChange = FID_BGTB_PDJB[FID_PLBGDLTB].isDLChange;
                        isOnlyAttChange = FID_BGTB_PDJB[FID_PLBGDLTB].isOnlyAttChange;
                    }
                    //
                    dlbm = oFeature.GetValueString("DLBM").Trim();
                    if (gdDLBMList.Contains(dlbm) == true)
                    {   //耕地
                        //=====================================                        
                        //第一步:继承地类图斑的坡度级别和扣除系数值 GDPDJB、KCXS
                        if (isPdjb)
                        {
                            if (isGDALL == true)
                            {
                                //继承基础地类图斑中坡度级别
                                if (dltb_pdjb.Trim().Length > 0)
                                {
                                    oFeature.SetValue("GDPDJB", dltb_pdjb);
                                }                                
                            }
                            //基础图斑可能是非耕地,坡度级别为空,扣除系数为零
                            if (dltb_pdjb.Trim().Length <= 0)
                            {
                                oFeature.SetValue("GDPDJB", pdt_pdjb);
                            }
                        }
                        //=====================================                        
                        //第二步:填写PDT图层中pdjb系数和全国田坎系数
                        //赋值耕地坡度级别 GDPDJB
                        bool isChangePDJMJZB = false;
                        if (isPdjb)
                        {
                            //(1)坡度级别不同,面积占比变化                            
                            if ((dltb_pdjb == "1" || dltb_pdjb == "") && (pdt_pdjb == "2" || pdt_pdjb == "3" || pdt_pdjb == "4" || pdt_pdjb == "5"))
                            {   //非耕地变为耕地                             
                                //获取pdt图层中最大面积对应的pdjb值
                                oFeature.SetValue("GDPDJB", pdt_pdjb);
                            }
                            {   //坡度级面积占比发生变化时
                                double bgh_mjzb = FID_BGTB_PDJB[FID_PLBGDLTB].getMJZB_pdt_byMaxMJ();
                                double bgq_mjzb = 0;
                                //怎么计算坡度级面积占比
                                List<int> FID_DLTBListByMax = FID_BGTB_PDJB[FID_PLBGDLTB].getFIDList_dltb_byMaxMJ();
                                if (FID_DLTBListByMax.Count == 1)
                                {   //1:1、N:1  关系(不变或分割)图斑
                                    bgq_mjzb = FID_DLTB_PDJB[FID_DLTBListByMax[0]].getMJZB_dltb_by(pdt_pdjb);
                                    double pdjbAreaZB_pdt = Math.Abs(bgh_mjzb - bgq_mjzb);
                                    double bgq_mjzb_maxdltb = FID_DLTB_PDJB[FID_DLTBListByMax[0]].getMJZB_dltb_by(dltb_pdjb);
                                    double bgh_mjzb_maxdltb = FID_BGTB_PDJB[FID_PLBGDLTB].getMJZB_pdt_by(dltb_pdjb);
                                    double pdjbAreaZB_dltb= Math.Abs(bgh_mjzb_maxdltb - bgq_mjzb_maxdltb);
                                    if (pdjbAreaZB_pdt > 5 && pdjbAreaZB_dltb > 5)     //原来>5% >9%
                                    {
                                        if (pdt_pdjb== dltb_pdjb)
                                        {   //选地类图斑中参数
                                            isChangePDJMJZB = false;
                                        }
                                        else
                                        {   //选pdt中参数
                                            isChangePDJMJZB = true;
                                        }
                                    }
                                }
                                else if (FID_DLTBListByMax.Count > 1)
                                {   //1:N      关系(合并)图斑                                    
                                    foreach (var fid_dltb in FID_DLTBListByMax)
                                    {
                                        bgq_mjzb = FID_DLTB_PDJB[fid_dltb].getMJZB_dltb_by(pdt_pdjb);
                                        double pdjbAreaZB_pdt = Math.Abs(bgh_mjzb - bgq_mjzb);                                        
                                        double bgq_mjzb_maxdltb = FID_DLTB_PDJB[fid_dltb].getMJZB_dltb_by(dltb_pdjb);
                                        double bgh_mjzb_maxdltb = FID_BGTB_PDJB[FID_PLBGDLTB].getMJZB_pdt_by(dltb_pdjb);
                                        double pdjbAreaZB_dltb = Math.Abs(bgh_mjzb_maxdltb - bgq_mjzb_maxdltb);
                                        if (pdjbAreaZB_pdt > 5 && pdjbAreaZB_dltb > 5)     //原来>5% >9%
                                        {
                                            if (pdt_pdjb == dltb_pdjb)
                                            {   //选地类图斑中参数
                                                isChangePDJMJZB = false;
                                            }
                                            else
                                            {   //选pdt中参数
                                                isChangePDJMJZB = true;
                                            }
                                        }                                        
                                    }                                    
                                }
                                if (isChangePDJMJZB == true)     //原来>5 >9
                                {   //变更后仍是耕地部分,坡度级面积占比发生变化时,赋pdt_pdjb值                                
                                    oFeature.SetValue("GDPDJB", pdt_pdjb);
                                }
                                /*
                                if (isGDALL == true && isDLChange == false && isOnlyAttChange == true)
                                {  //因属性信息变化导致原耕地图斑分割的,分割后仍均为耕地的,
                                   //则继承地类图斑中坡度级别值 ????
                                   //(需要是原耕地图斑是简单分割)                                    
                                    if (FID_BGTB_PDJB[FID_PLBGDLTB].getFIDList().Count == 1)
                                    {   //BGTB:DLTB为1:1
                                        var t_FID_DLTB = FID_BGTB_PDJB[FID_PLBGDLTB].getFIDList()[0];
                                        if (FID_DLTB_PDJB[t_FID_DLTB].getFIDList().Count > 1)
                                        {   //DLTB:BGTB为1:N  为分割
                                            bool isSplitSimple = true;  //是简单分割标志                                            
                                            double sum_TXMJ = 0;
                                            double t_DLTB_TXMJ = FID_DLTB_PDJB[t_FID_DLTB].TXMJ;   //地类图斑的图形面积
                                            string t_DLTB_DLBM = FID_DLTB_PDJB[t_FID_DLTB].DLBM;   //地类图斑的地类编码
                                            //
                                            if (t_DLTB_DLBM == "0101" || t_DLTB_DLBM == "0102" || t_DLTB_DLBM == "0103")
                                            {   //变更分割前为耕地
                                                string sum_DLBM = "";
                                                foreach (var t_FID in FID_DLTB_PDJB[t_FID_DLTB].getFIDList())
                                                {
                                                    sum_TXMJ += FID_BGTB_PDJB[t_FID].TXMJ;
                                                    sum_DLBM = FID_BGTB_PDJB[t_FID].DLBM;
                                                    if (sum_DLBM == "0101" || sum_DLBM == "0102" || sum_DLBM == "0103")
                                                    {   //分割后为耕地
                                                    }
                                                    else
                                                    {   //分割后有非耕地
                                                        isSplitSimple = false;
                                                    }
                                                }
                                            }
                                            else
                                            {   //分割前为非耕地
                                                isSplitSimple = false;
                                            }
                                            if (isSplitSimple == true && Math.Abs(t_DLTB_TXMJ - sum_TXMJ) < 0.1)   //容差值
                                            {   //为分割,容差值范围内为面积相等,即原耕地图斑简单分割后,仍均是耕地
                                                if (dltb_pdjb.Trim().Length > 0)
                                                {
                                                    oFeature.SetValue("GDPDJB", dltb_pdjb);
                                                }
                                            }
                                        }
                                    }
                                }
                                if (isGDALL == true && isDLChange == false && isOnlyAttChange == false)
                                {   //属性信息未变化,分割后仍均为耕地的
                                    oFeature.SetValue("GDPDJB", dltb_pdjb);
                                }*/

                            }
                        }
                        var t_pdjb = oFeature.GetValueString("GDPDJB");
                        //第三步:赋值耕地类型 GDLX                        
                        if (isGdlx)
                        {
                            gdlx = "";
                            switch (dlbm)
                            {
                                case "0101":
                                    gdlx = "TT";
                                    break;
                                case "0102":
                                case "0103":
                                    gdlx = "PD";
                                    break;
                                default:
                                    break;
                            }
                            if (t_pdjb == "1" || t_pdjb.Length <= 0)
                            {
                                gdlx = "";
                            }
                            oFeature.SetValue("GDLX", gdlx);
                        }
                        //赋值扣除系数 KCXS  坡度图中坡度对应的全国田坎系数
                        if (isKcxs)
                        {
                            if (this.isSkipKcxs == false && isGDALL == true)
                            {
                                //第一步:不跳过已有系数且变更后均是耕地,则继承基础地类图斑中扣除系数值
                                var t_kcxs = FID_BGTB_PDJB[FID_PLBGDLTB].getKCXS_byMaxMJ();
                                if (t_kcxs.Trim().Length > 0)
                                {   //不为空
                                    var d_kcxs = Math.Round(toUtil.ToDecimal(t_kcxs), 4);
                                    oFeature.SetValue("KCXS", t_kcxs);
                                }
                            }
                            //获取全国田坎系数pdt_kcxs= by gdlx+t_pdjb
                            pdt_kcxs = 0d;
                            lxjb = gdlx + t_pdjb;
                            switch (lxjb)
                            {
                                case "PD2":
                                    pdt_kcxs = kcxs_pd2;
                                    break;
                                case "PD3":
                                    pdt_kcxs = kcxs_pd3;
                                    break;
                                case "PD4":
                                    pdt_kcxs = kcxs_pd4;
                                    break;
                                case "PD5":
                                    pdt_kcxs = kcxs_pd5;
                                    break;
                                case "TT2":
                                    pdt_kcxs = kcxs_tt2;
                                    break;
                                case "TT3":
                                    pdt_kcxs = kcxs_tt3;
                                    break;
                                case "TT4":
                                    pdt_kcxs = kcxs_tt4;
                                    break;
                                case "TT5":
                                    pdt_kcxs = kcxs_tt5;
                                    break;
                            }
                            //
                            bool writeKcxs = true;
                            if (isSkipKcxs == true)
                            {   //跳过已有系数
                                var originKcxs = toUtil.ToDouble(oFeature.get_Value(kcxsIndex));
                                if (originKcxs != 0)
                                {   //为零才重写(即已有系数不为零,则不重写)
                                    writeKcxs = false;
                                }
                            }
                            if (writeKcxs)
                            {   //需重写kcxs系数
                                //是非耕地变为耕地表情况
                                if ((dltb_pdjb == "1" || dltb_pdjb == "") && (pdt_pdjb == "2" || pdt_pdjb == "3" || pdt_pdjb == "4" || pdt_pdjb == "5"))
                                {
                                    oFeature.SetValue("KCXS", pdt_kcxs);   //填写全国田坎系数                                        
                                }
                                //变更后仍是耕地的部分 要看坡度级别面积占比是否变化,是报备田坎系数kcxs不操作(来源dltb中土整系数)
                                if (isChangePDJMJZB == true)
                                {
                                    double d_kcxs = Math.Round(oFeature.GetValueDouble("KCXS"), 4);
                                    if (GJKCXSList.Contains(d_kcxs) == true)
                                    {   //为全国田坎系数,即非报备田坎系数
                                        oFeature.SetValue("KCXS", pdt_kcxs);   //填写全国田坎系数
                                    }
                                }
                                //与全国田坎系数表一致性判断
                                double t_kcxs = Math.Round(oFeature.GetValueDouble("KCXS"), 4);
                                if (GJKCXSList.Contains(t_kcxs) == true && t_kcxs != pdt_kcxs)
                                {   //为全国田坎系数,即非报备田坎系数
                                    oFeature.SetValue("KCXS", pdt_kcxs);   //填写全国田坎系数
                                }
                                if (isGDALL == true && isDLChange == false && isOnlyAttChange == true)
                                {  //因属性信息变化导致原耕地图斑分割的,分割后仍均为耕地的
                                   //则继承基础地类图斑中扣除系数值
                                    if (dltb_pdjb.Trim().Length > 0)
                                    {   //地类图斑为非耕地的排除
                                        var tt_pdjb = oFeature.GetValueString("GDPDJB");
                                        if (tt_pdjb == dltb_pdjb)
                                        {
                                            var dltb_kcxs = FID_BGTB_PDJB[FID_PLBGDLTB].getKCXS_byMaxMJ();
                                            if (dltb_kcxs.Trim().Length > 0)
                                            {   //不为空
                                                var d_kcxs = Math.Round(toUtil.ToDecimal(dltb_kcxs), 4);
                                                oFeature.SetValue("KCXS", d_kcxs);
                                            }
                                        }
                                    }
                                }
                                //
                            }
                        }
                        //=====================================
                        //第四步:土整范围赋值KCXS
                        if (isKcxs)
                        {
                            //获取土整范围中kcxs系数
                            if (dictFID_TZFW_KCXS.ContainsKey(FID_PLBGDLTB) == true)
                            {   //取自土整范围图层的属性值KCXS
                                if (dictFID_TZFW_KCXS[FID_PLBGDLTB].Trim().Length > 0)
                                {   //对应tzfw的kcxs不能为空字符串
                                    var t_kcxs = toUtil.ToDouble(dictFID_TZFW_KCXS[FID_PLBGDLTB]);
                                    if (t_kcxs >= 0d)
                                    {
                                        oFeature.SetValue("KCXS", t_kcxs);
                                    }
                                }
                            }
                        }
                        //=====================================                        
                        if (t_pdjb == "1")
                        {   //坡度级别=1时,必须强制赋值kcxs=0,gdlx=""
                            oFeature.SetValue("KCXS", 0);
                            oFeature.SetValue("GDLX", "");
                        }
                        //=====================================
                    }
                    else
                    {   //非耕地
                        oFeature.SetValue("KCXS", 0);
                        oFeature.SetValue("GDLX", "");
                        oFeature.SetValue("GDPDJB", "");
                    }
                    oCur.UpdateFeature(oFeature);
                    //
                    doIndex += 1;
                    if (doIndex % 1000 == 0)
                    {
                        oCur.Flush();
                        if (doIndex < gp.Maximum)
                        {
                            gp.Position = doIndex;
                            gp.Title = "正在处理...第" + gp.Position + "个/共" + maxCount + "个";
                        }
                        appAPI.doEvents();
                    }
                    //跳转到下一个要素
                    oFeature = oCur.NextFeature();
                }
                oCur.Flush();
                //
                FID_BGTB_PDJB.Clear();
                FID_BGTB_PDJB = null;
                FID_DLTB_PDJB.Clear();
                FID_DLTB_PDJB = null;
                //
                if (fc_BGTB_DLTB_PDT != null)
                {
                    fc_BGTB_DLTB_PDT.ReleaseCOMObject();
                    fc_BGTB_DLTB_PDT = null;
                }
                //
                dictFID_TZFW_KCXS.Clear();
                dictFID_TZFW_KCXS = null;
                //
                gp.Close();
                gp.Dispose();
                GMessage.Info(this.parent, "赋值完成");
            }
            catch (Exception ex)
            {
                GMessage.Exception(this.parent, ex, ex.Message);
            }
            finally
            {
                if (oCur != null)
                {
                    oCur.ReleaseCOMObject();
                    oCur = null;
                }
                GC.Collect();
                GC.WaitForFullGCComplete();
            }            
        }
    }

本blog地址: https://blog.csdn.net/hsg77