using ESRI.ArcGIS.AnalysisTools; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geoprocessing; using ESRI.ArcGIS.Geoprocessor; using KGIS.Framework.AE; using KGIS.Framework.AE.GPHelper; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.DBOperator; using KGIS.Framework.Maps; using KGIS.Framework.Platform; using KGIS.Framework.Platform.Helper; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils.Helper; using Kingo.PluginServiceInterface; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; namespace Kingo.Plugin.LocationChange { public class BGHelper { public static void GenerateGxgcData() { Geoprocessor gp = null; IWorkspaceFactory pFtWsFct = null; IWorkspaceName workspaceName = null; try { ProgressHelper.ShowProcessBar("正在生成更新过程数据……"); IMapService _MapService = MapsManager.Instance.MapService; gp = new Geoprocessor() { OverwriteOutput = true }; IGpValueTableObject gpValueTableObject = new GpValueTableObjectClass();//对两个要素类进行相交运算 gpValueTableObject.SetColumns(2); string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\GXGC"; if (!Directory.Exists(gdbFolder)) { Directory.CreateDirectory(gdbFolder); } try { DelectDir(gdbFolder);//能删除就删除 删除报错不处理 } catch { } pFtWsFct = new FileGDBWorkspaceFactory(); string gdbFileName = Guid.NewGuid().ToString() + ".gdb"; string path = System.IO.Path.Combine(gdbFolder, gdbFileName); workspaceName = pFtWsFct.Create(gdbFolder, gdbFileName, null, 0); object o1 = _MapService.GetFeatureClassByName("JC_DLTB"); IFeatureLayer pdltbFeatureLayer = null; GPParamClass gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = o1 as IFeatureClass; gPParamClass.OutFeatureClassPath = path; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.FeatureClassToFeatureClass(gPParamClass, "JC_DLTB", ref pdltbFeatureLayer); IFeatureClass jcFc2 = _MapService.GetFeatureClassByName("XZQTZQJCTB"); IFeatureClassAPI fcAPI = new FeatureClassAPI(jcFc2); fcAPI.FcToFc(pdltbFeatureLayer.FeatureClass, null, false); o1 = pdltbFeatureLayer.FeatureClass; object o2 = _MapService.GetFeatureClassByName("DLTBGX"); IFeatureClass bgtbFc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG");//PrjDB.gdb基础库 IFeatureLayer bgtb_Layer = GeoDBAPI.CreateFeatureLayerInmemeory("DLTBGX201", "地类图斑更新201数据", (bgtbFc as IGeoDataset).SpatialReference, bgtbFc.ShapeType, bgtbFc.Fields); InsertDataToMemeoryLayer(bgtbFc, bgtb_Layer.FeatureClass, new QueryFilterClass() { WhereClause = "XZQTZLX='1' or XZQTZLX='2' or XZQTZLX='3' or XZQTZLX='4'" }); object o3 = bgtb_Layer.FeatureClass; gpValueTableObject.AddRow(ref o1); gpValueTableObject.AddRow(ref o2); Intersect process = new Intersect(); process.in_features = gpValueTableObject; process.out_feature_class = path + "\\" + "TempDLTBGXGC2"; process.join_attributes = "ALL"; IGeoProcessorResult tGeoResult = (IGeoProcessorResult)gp.Execute(process, null); if (tGeoResult == null || tGeoResult.Status != ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded) { string msg = ReturnMessages(gp); throw new Exception(msg); } IFeatureClass outFc = GetOutPutFeatureClass(tGeoResult); IFeatureLayer pjbntFeatureLayer = null; gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = outFc; gPParamClass.SecondFeatureClass = bgtb_Layer.FeatureClass; gPParamClass.OutFeatureClassPath = path + "\\" + "TempDLTBGXGC"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.UnionAnalysis(gPParamClass, ref pjbntFeatureLayer); outFc = pjbntFeatureLayer.FeatureClass; gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = outFc; gPParamClass.OutFeatureClassPath = path + "\\" + "TempGXGC_MToS"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(gPParamClass, ref pjbntFeatureLayer); outFc = pjbntFeatureLayer.FeatureClass; ProgressHelper.CloseProcessBar(); Dictionary bghAttr = new Dictionary(); Dictionary gxAttr = new Dictionary(); ProgressHelper.ShowProcessBar("正在进行属性赋值……"); SetAttribue(outFc, ref bghAttr, ref gxAttr); ProgressHelper.CloseProcessBar(); IFeatureClass hrFc = _MapService.GetFeatureClassByName("DLTBHR"); ITable dltbhrTb = hrFc as ITable; dltbhrTb.DeleteSearchedRows(null); IFeatureClass gxgcFc = _MapService.GetFeatureClassByName("DLTBGXGC"); ITable dltbgxgcTb = gxgcFc as ITable; dltbgxgcTb.DeleteSearchedRows(null); Dictionary target_SourMaping = new Dictionary(); Dictionary fieldValues = new Dictionary(); for (int i = 0; i < gxgcFc.Fields.FieldCount; i++) { IField field = gxgcFc.Fields.Field[i]; if (!field.Editable || field.Name.Contains(gxgcFc.ShapeFieldName)) continue; int sIndex = outFc.FindField(field.Name); if (field.Name.StartsWith("BGQ")) { if (sIndex == -1) sIndex = outFc.FindField(field.Name.Replace("BGQ", "")); if (sIndex == -1) sIndex = outFc.FindField(field.Name.Replace("BGQTB", "")); if (sIndex != -1) { target_SourMaping.Add(i, sIndex); fieldValues.Add(field.Name, sIndex); } continue; } else if (field.Name.StartsWith("BGH")) { if (sIndex == -1) sIndex = outFc.FindField(field.Name.Replace("BGH", "") + "_1"); if (sIndex == -1) sIndex = outFc.FindField(field.Name.Replace("BGHTB", "") + "_1"); if (sIndex != -1) { target_SourMaping.Add(i, sIndex); fieldValues.Add(field.Name, sIndex); } continue; } else if (field.Name == "TBBGMJ") { if (sIndex == -1) sIndex = outFc.FindField("TBMJ"); if (sIndex != -1) { target_SourMaping.Add(i, sIndex); fieldValues.Add(field.Name, sIndex); } continue; } if (sIndex != -1) { target_SourMaping.Add(i, sIndex); fieldValues.Add(field.Name, sIndex); } } IFeatureCursor hrCursor = hrFc.Insert(true); IFeatureCursor t_cursor = gxgcFc.Insert(true); IFeatureCursor s_cursor = outFc.Search(null, true); IFeature s = null; int kdIndex = gxgcFc.FindField("BGHXZDWKD"); int gxsjIndex = gxgcFc.FindField("GXSJ"); int bghTBBSMIndex = gxgcFc.FindField("BGHTBBSM"); int bghTBBHIndex = gxgcFc.FindField("BGHTBBH"); int bgmjIndex = gxgcFc.FindField("TBBGMJ"); int bgxwIndex = gxgcFc.FindField("BGXW"); int xzqtzlxIndex = gxgcFc.FindField("XZQTZLX"); int bgqkcxsIdx = gxgcFc.FindField("BGQKCXS"); int bgqkcmjIdx = gxgcFc.FindField("BGQKCMJ"); int bgqtbdlmjIdx = gxgcFc.FindField("BGQTBDLMJ"); int bghkcxsIdx = gxgcFc.FindField("BGHKCXS"); int bghkcmjIdx = gxgcFc.FindField("BGHKCMJ"); int bghtbdlmjIdx = gxgcFc.FindField("BGHTBDLMJ"); ProgressHelper.ShowProcessBar("正在写入数据……"); int count = outFc.FeatureCount(null); double curr = 0; IQueryFilter delFilter = new QueryFilterClass() { WhereClause = "1=2" }; //创建地类图斑变化信息表 string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; IRDBHelper rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); ; if (!rdbHelper.TableIsExist("BHXXB")) { rdbHelper.ExecuteSQL(" Create TABLE BHXXB ( BGQTBBSM text(100),BGHTBBSM text(100),BGQTBBH text(100),BGHTBBH text(100),BGQZLDWDM text(100),BGHZLDWDM text(100)," + "BGQZLDWMC text(100),BGHZLDWMC text(100),BGQQSDWDM text(100),BGHQSDWDM text(100),BGQQSDWMC text(100),BGHQSDWMC text(100),BGQQSXZ text(100),BGHQSXZ text(100)," + "BGQDLBM text(100),BGHDLBM text(100),BGQKCDLBM text(100),BGHKCDLBM text(100),BGQKCXS text(100),BGHKCXS text(100),BGQKCMJ NUMERIC,BGHKCMJ NUMERIC,BGQGDLX text(100),BGHGDLX text(100),BGQGDPDJB text(100),BGHGDPDJB text(100),BGQCZCSXM text(100),BGHCZCSXM text(100)," + "BGQTBXHDM text(100),BGHTBXHDM text(100),BGQZZSXDM text(100),BGHZZSXDM text(100),BGQMSSM text(100),BGHMSSM text(100),BGQGDDB text(100),BGHGDDB text(100)," + "BGMJ NUMERIC,XZQTZLX text(100),BZ text(10),BGXW text(10) ) "); } else { rdbHelper.ExecuteSQL(" delete from BHXXB where BZ='TBBG'"); } string bhxxbField = "BGQTBBSM,BGHTBBSM,BGQTBBH,BGHTBBH,BGQZLDWDM,BGHZLDWDM,BGQZLDWMC,BGHZLDWMC,BGQQSDWDM,BGHQSDWDM,BGQQSDWMC,BGHQSDWMC,BGQQSXZ,BGHQSXZ,BGQDLBM,BGHDLBM,BGQKCDLBM,BGHKCDLBM,BGQKCXS,BGHKCXS,BGQKCMJ,BGHKCMJ,BGQGDLX,BGHGDLX,BGQGDPDJB,BGHGDPDJB,BGQCZCSXM,BGHCZCSXM,BGQTBXHDM,BGHTBXHDM,BGQZZSXDM,BGHZZSXDM,BGQMSSM,BGHMSSM,BGQGDDB,BGHGDDB,BGMJ,XZQTZLX,BZ,BGXW"; List strSQL = new List(); int bgqbsm = outFc.FindField("BSM"); List delBGHBSM = new List(); while ((s = s_cursor.NextFeature()) != null) { curr++; if (curr % (count / 100) == 0) ProgressHelper.Message = string.Format("正在写入数据……{0}", ((curr / count) * 100).ToDouble(0) + "%"); string[] bhxxbfieldArr = bhxxbField.Split(','); string bhxxbValue = string.Empty; foreach (var item in bhxxbfieldArr) { if (bghAttr.ContainsKey(s.OID)) { if (item == "BGHTBBSM") { if (bghAttr.ContainsKey(s.OID) && bghAttr[s.OID].XZQTZLX != "4") bhxxbValue += string.Format("'{0}',", bghAttr[s.OID].BGHTBBSM); else bhxxbValue += "'',"; continue; } if (item == "BGHTBBH") { if (bghAttr.ContainsKey(s.OID) && bghAttr[s.OID].XZQTZLX != "4") bhxxbValue += string.Format("'{0}',", bghAttr[s.OID].BGHTBBH); else bhxxbValue += "'',"; continue; } if (item == "BGMJ") { if (bghAttr.ContainsKey(s.OID)) bhxxbValue += string.Format("{0},", bghAttr[s.OID].BGMJ); else bhxxbValue += "0,"; continue; } if (item == "XZQTZLX") { if (bghAttr.ContainsKey(s.OID)) { bhxxbValue += string.Format("'{0}',", bghAttr[s.OID].XZQTZLX); } else { bhxxbValue += string.Format("'{0}',", 0); } continue; } if (item == "BGXW") { if (bghAttr[s.OID].XZQTZLX == "4") { bhxxbValue += "'0',"; continue; } if (bghAttr.ContainsKey(s.OID)) bhxxbValue += string.Format("'{0}',", bghAttr[s.OID].BGXW); else bhxxbValue += "'',"; continue; } } if (item == "BZ") { bhxxbValue += string.Format("'{0}',", "TBBG"); continue; } if (fieldValues.ContainsKey(item)) { if (item == "BGQKCMJ") { double bgq_kcxs = s.Value[fieldValues["BGQKCXS"].ToInt()].ToDouble(); if (bghAttr.ContainsKey(s.OID) && bghAttr[s.OID].XZQTZLX != "3") bhxxbValue += string.Format("{0},", (bghAttr[s.OID].BGMJ * bgq_kcxs).ToDecimal(2)); else bhxxbValue += "0,"; } else if (item == "BGHKCMJ") { double bgh_kcxs = s.Value[fieldValues["BGHKCXS"].ToInt()].ToDouble(); if (bghAttr.ContainsKey(s.OID) && bghAttr[s.OID].XZQTZLX != "4" && bghAttr[s.OID].XZQTZLX != "2") bhxxbValue += string.Format("{0},", (bghAttr[s.OID].BGMJ * bgh_kcxs).ToDecimal(2)); else bhxxbValue += "0,"; } else if (item.StartsWith("BGQ") && bghAttr[s.OID].XZQTZLX == "3") { bhxxbValue += "'',"; continue; } else { if (bghAttr[s.OID].XZQTZLX == "4" && item.StartsWith("BGH")) { bhxxbValue += "'',"; } else { bhxxbValue += string.Format("'{0}',", s.Value[fieldValues[item].ToInt()]); } } } else { bhxxbValue += string.Format("'{0}',", ""); } } bhxxbValue = bhxxbValue.TrimEnd(','); string strSQLTemp = string.Format("Insert into BHXXB ({0}) values ({1})", bhxxbField, bhxxbValue); //属性变更的,对比变更前、变更后属性是否一直 if (bghAttr.ContainsKey(s.OID)) { string UnEqualAttr = string.Empty; if (bghAttr[s.OID].BGXW == "1" && BGQ_BGH_AttrEqual(s, ref UnEqualAttr) && bghAttr[s.OID].XZQTZLX != "3" && bghAttr[s.OID].XZQTZLX != "4") { if (bghAttr[s.OID].XZQTZLX == "1") { IFeatureBuffer hrBuff = hrFc.CreateFeatureBuffer(); hrBuff.Shape = s.ShapeCopy; for (int i = 0; i < hrBuff.Fields.FieldCount; i++) { IField field = hrBuff.Fields.Field[i]; if (field.Name.ToUpper().Contains(hrFc.ShapeFieldName) || !field.Editable) continue; string strField = field.Name + "_1"; int sIndex = outFc.FindField(strField); if (sIndex == -1) continue; hrBuff.Value[i] = s.Value[sIndex]; } int bsmIndex2 = hrFc.FindField("BSM"); int tbbhIndex2 = hrFc.FindField("TBBH"); int tbmjIndex2 = hrFc.FindField("TBMJ"); int kcxsIndex2 = hrFc.FindField("KCXS"); int tbdlmjIndex2 = hrFc.FindField("TBDLMJ"); int kcmjIndex2 = hrFc.FindField("KCMJ"); if (bsmIndex2 != -1) hrBuff.Value[bsmIndex2] = bghAttr[s.OID].BGHTBBSM; if (tbbhIndex2 != -1) hrBuff.Value[tbbhIndex2] = bghAttr[s.OID].BGHTBBH; if (tbmjIndex2 != -1) hrBuff.Value[tbmjIndex2] = bghAttr[s.OID].BGMJ; if (kcxsIndex2 != -1 && kcmjIndex2 != -1 && tbdlmjIndex2 != -1) { double kcxs = hrBuff.Value[kcxsIndex2].ToDouble(); hrBuff.Value[kcmjIndex2] = (bghAttr[s.OID].BGMJ * kcxs).ToDecimal(2); hrBuff.Value[tbdlmjIndex2] = (bghAttr[s.OID].BGMJ - (bghAttr[s.OID].BGMJ * kcxs).ToDecimal(2).ToDouble()).ToDecimal(2); } hrCursor.InsertFeature(hrBuff); } if (!string.IsNullOrWhiteSpace(UnEqualAttr) || ("1,2,3,4".Contains(bghAttr[s.OID].XZQTZLX) && !string.IsNullOrWhiteSpace(bghAttr[s.OID].XZQTZLX))) { //仅记录变更一览表,不记录更新层和过程层 strSQLTemp = strSQLTemp.Replace("TBBG", "ZLBG"); strSQL.Add(strSQLTemp); rdbHelper.ExecuteSQL(string.Format(" delete from BHXXB where BGQTBBSM='{0}' and BGHTBBSM='{0}'", bghAttr[s.OID].BGHTBBSM)); } else if (bghAttr[s.OID].XZQTZLX == "4") { } delFilter.WhereClause = string.Format("OBJECTID = {0}", bghAttr[s.OID].BGHOID); (o2 as ITable).DeleteSearchedRows(delFilter); continue; } else if (bghAttr[s.OID].XZQTZLX == "4" && bghAttr[s.OID].BGXW == "1") { delFilter.WhereClause = string.Format("OBJECTID = {0}", bghAttr[s.OID].BGHOID); (o2 as ITable).DeleteSearchedRows(delFilter); bghAttr[s.OID].BGXW = "0"; } if (bghAttr[s.OID].XZQTZLX == "3") { bghAttr[s.OID].BGXW = "3"; } if (bghAttr[s.OID].XZQTZLX == "4") { bghAttr[s.OID].BGXW = "0"; } } IArea area = s.ShapeCopy as IArea; strSQL.Add(strSQLTemp); IFeatureBuffer buf = gxgcFc.CreateFeatureBuffer(); foreach (var item in target_SourMaping) { if (bghAttr.ContainsKey(s.OID)) { if (bghAttr[s.OID].BGXW == "0") { if (buf.Fields.Field[item.Key].Name.StartsWith("BGH")) continue; } else if (bghAttr[s.OID].XZQTZLX == "3") { if (buf.Fields.Field[item.Key].Name.StartsWith("BGQ")) continue; } } buf.Value[item.Key] = s.Value[item.Value]; } if (kdIndex != -1) { if (buf.Value[kdIndex] != DBNull.Value) buf.Value[kdIndex] = buf.Value[kdIndex].ToDouble(1); } if (gxsjIndex != -1) { buf.Value[gxsjIndex] = new DateTime(DateTime.Now.Year - 1, 12, 31); } if (bghAttr.ContainsKey(s.OID)) { double bghkcxs = buf.Value[bghkcxsIdx].ToDouble(); if (bghAttr[s.OID].BGXW == "0" || bghAttr[s.OID].XZQTZLX == "2" || bghAttr[s.OID].XZQTZLX == "4") { buf.Value[bghkcmjIdx] = 0; buf.Value[bghtbdlmjIdx] = 0; if (!delBGHBSM.Contains(bghAttr[s.OID].BGHTBBSM)) delBGHBSM.Add(bghAttr[s.OID].BGHTBBSM); } else { if (bghTBBSMIndex != -1) buf.Value[bghTBBSMIndex] = bghAttr[s.OID].BGHTBBSM; if (bghTBBHIndex != -1) buf.Value[bghTBBHIndex] = bghAttr[s.OID].BGHTBBH; buf.Value[bghkcmjIdx] = (bghAttr[s.OID].BGMJ * bghkcxs).ToDecimal(2); buf.Value[bghtbdlmjIdx] = (bghAttr[s.OID].BGMJ - buf.Value[bghkcmjIdx].ToDouble()).ToDecimal(2); } if (bgmjIndex != -1) buf.Value[bgmjIndex] = bghAttr[s.OID].BGMJ; if (bgxwIndex != -1) buf.Value[bgxwIndex] = bghAttr[s.OID].BGXW; if (xzqtzlxIndex != -1) { buf.Value[xzqtzlxIndex] = string.IsNullOrWhiteSpace(bghAttr[s.OID].XZQTZLX) ? "0" : bghAttr[s.OID].XZQTZLX; } double bgqkcxs = buf.Value[bgqkcxsIdx].ToDouble(); if (bghAttr[s.OID].XZQTZLX == "3") { buf.Value[bgqkcxsIdx] = 0; buf.Value[bgqkcmjIdx] = 0; buf.Value[bgqtbdlmjIdx] = 0; } else { buf.Value[bgqkcmjIdx] = (bghAttr[s.OID].BGMJ * bgqkcxs).ToDecimal(2); buf.Value[bgqtbdlmjIdx] = (bghAttr[s.OID].BGMJ - buf.Value[bgqkcmjIdx].ToDouble()).ToDecimal(2); } } buf.Shape = s.ShapeCopy; object o = t_cursor.InsertFeature(buf); } rdbHelper.BeginTransaction(); count = strSQL.Count; curr = 0; foreach (var item in strSQL) { curr++; if (curr % (count / 100) == 0) ProgressHelper.Message = string.Format("正在写入图斑变化信息……{0}", ((curr / count) * 100).ToDouble(0) + "%"); rdbHelper.ExecuteSQL(item); } rdbHelper.Commit(); rdbHelper.DisConnect(); t_cursor.Flush(); hrCursor.Flush(); ProgressHelper.CloseProcessBar(); ICursor cursor = (o2 as ITable).Update(null, true); IRow row = null; int bsmIndex = (o2 as ITable).FindField("BSM"); int tbbhIndex = (o2 as ITable).FindField("TBBH"); int tbmjIndex = (o2 as ITable).FindField("TBMJ"); int kcxsIndex = (o2 as ITable).FindField("KCXS"); int tbdlmjIndex = (o2 as ITable).FindField("TBDLMJ"); int kcmjIndex = (o2 as ITable).FindField("KCMJ"); kdIndex = (o2 as ITable).FindField("XZDWKD"); while ((row = cursor.NextRow()) != null) { if (gxAttr.ContainsKey(row.OID) && !delBGHBSM.Contains(gxAttr[row.OID].BSM)) { if (kdIndex != -1) { row.Value[kdIndex] = row.Value[kdIndex].ToDouble(1); } if (bsmIndex != -1) row.Value[bsmIndex] = gxAttr[row.OID].BSM; if (tbbhIndex != -1) row.Value[tbbhIndex] = gxAttr[row.OID].TBBH; if (tbmjIndex != -1) row.Value[tbmjIndex] = gxAttr[row.OID].TBMJ; if (kcxsIndex != -1 && kcmjIndex != -1 && tbdlmjIndex != -1) { double kcxs = row.Value[kcxsIndex].ToDouble(); row.Value[kcmjIndex] = (gxAttr[row.OID].TBMJ * kcxs).ToDecimal(2); row.Value[tbdlmjIndex] = (gxAttr[row.OID].TBMJ - (gxAttr[row.OID].TBMJ * kcxs).ToDecimal(2).ToDouble()).ToDecimal(2); } cursor.UpdateRow(row); } else { delFilter.WhereClause = string.Format("OBJECTID = {0}", row.OID); (o2 as ITable).DeleteSearchedRows(delFilter); } } cursor.Flush(); IFeatureLayer msTBLayer = GeoDBAPI.CreateFeatureLayerInmemeory("MSDLTB", "灭失图斑", (bgtbFc as IGeoDataset).SpatialReference, bgtbFc.ShapeType, bgtbFc.Fields); IQueryFilter filter2 = new QueryFilterClass(); filter2.WhereClause = " XZQTZLX='2' or XZQTZLX='4'"; (msTBLayer.FeatureClass as ITable).DeleteSearchedRows(null); InsertDataToMemeoryLayer(bgtbFc, msTBLayer.FeatureClass, filter2); gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = o2 as IFeatureClass; gPParamClass.SecondFeatureClass = msTBLayer.FeatureClass; gPParamClass.OutFeatureClassPath = path + "\\" + "TempDLTBGX2"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.EraseAnalysis(gPParamClass, ref pjbntFeatureLayer); IFeatureLayer TempDLTB_MToS = null; gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = pjbntFeatureLayer.FeatureClass; gPParamClass.OutFeatureClassPath = path + "\\" + "TempDLTBGX2_MToS"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(gPParamClass, ref TempDLTB_MToS); (o2 as ITable).DeleteSearchedRows(null); InsertDataToMemeoryLayer(TempDLTB_MToS.FeatureClass, o2 as IFeatureClass); IFeatureClass bgFc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG"); (bgFc as FeatureClass).Workspace.ExecuteSQL("UPDATE DLTBBG SET BGZT = '已变更'"); IFeatureClass xzqtqFc = MapsManager.Instance.MapService.GetFeatureClassByName("XZQTQTB"); (xzqtqFc as FeatureClass).Workspace.ExecuteSQL("UPDATE XZQTQTB SET BGZT = '已变更'"); } catch (Exception ex) { LogAPI.Debug("生成更新过程数据失败:"); LogAPI.Debug(ex); MessageHelper.ShowError("生成更新过程数据失败:" + ex.Message); } finally { ProgressHelper.CloseProcessBar(); } } private static void InsertDataToMemeoryLayer(IFeatureClass pSource, IFeatureClass pTarget, IQueryFilter pFilter = null) { try { if (pSource == null || pTarget == null) return; IFeatureClassAPI fcAPI = new FeatureClassAPI(pSource); if (pTarget != null) fcAPI.FcToFc(pTarget, pFilter, false); } catch (Exception ex) { LogAPI.Debug("获取城镇村范围数据失败:"); LogAPI.Debug(ex); } } /// /// 获取GP任务执行信息 /// /// /// private static string ReturnMessages(Geoprocessor gp) { string ms = ""; if (gp.MessageCount > 0) { for (int Count = 0; Count <= gp.MessageCount - 1; Count++) { ms += "$" + gp.GetMessage(Count) + "\n\n"; } } return ms; } private static IFeatureClass GetOutPutFeatureClass(IGeoProcessorResult tGeoResult) { IGPUtilities pGPUtilities = new GPUtilitiesClass(); IFeatureClass pFeatureClass = null; IQueryFilter pQueryFilter = null; try { pGPUtilities.DecodeFeatureLayer(tGeoResult.GetOutput(0), out pFeatureClass, out pQueryFilter); return pFeatureClass; } catch (Exception ex) { throw new Exception("获取生成图层异常:" + ex.Message); } finally { if (pQueryFilter != null) { Marshal.ReleaseComObject(pQueryFilter); } } } public static void SetAttribue(IFeatureClass pGxgcFc, ref Dictionary bghAttr, ref Dictionary gxAttr) { try { IMapService _MapService = MapsManager.Instance.MapService; IFeatureLayer gxLayer = _MapService.GetFeatureLayerByName("DLTBGX"); IFeatureClass jcFc = _MapService.GetFeatureClassByName("JC_DLTB"); IQueryFilter filter = new QueryFilterClass() { SubFields = "OBJECTID,FID_JC_DLTB,BSM,TBBH,TBMJ,FID_DLTBGX,ZLDWDM,ZLDWDM_1,XZQTZLX_1,SHAPE_AREA" }; IFeatureCursor cursor = pGxgcFc.Search(filter, true); IFeature fe = null; int jcOIDIndex = pGxgcFc.FindField("FID_JC_DLTB"); int jcTBMJIndex = pGxgcFc.FindField("TBMJ"); int jcBSMIndex = pGxgcFc.FindField("BSM"); int jcTBBHIndex = pGxgcFc.FindField("TBBH"); int gxOIDIndex = pGxgcFc.FindField("FID_DLTBGX"); int gxZLDWDMIndex = pGxgcFc.FindField("ZLDWDM_1"); int bgqZLDWDMIndex = pGxgcFc.FindField("ZLDWDM"); int gxXZQTZLXIndex = pGxgcFc.FindField("XZQTZLX_1"); int areaIndex = pGxgcFc.FindField("SHAPE_AREA"); List txbgOID = new List(); List list = new List(); string msg = "正在进行属性赋值({0})……{1}"; ProgressHelper.Message = string.Format(msg, 1, ""); int count = pGxgcFc.FeatureCount(null); double curr = 0; while ((fe = cursor.NextFeature()) != null) { curr++; if (curr % (count / 100) == 0) ProgressHelper.Message = string.Format(msg, 1, ((curr / count) * 100).ToDouble(0) + "%"); int jcOID = (int)fe.Value[jcOIDIndex]; double tbmj = fe.Value[jcTBMJIndex].ToDouble(); double area = fe.Value[areaIndex].ToDouble(); OIDMapping oMaping = new OIDMapping(); int gxOID = (int)fe.Value[gxOIDIndex]; oMaping.gcOID = fe.OID; oMaping.bgqOID = jcOID; oMaping.bgqTBBSM = fe.Value[jcBSMIndex].ToTrim(); oMaping.bgqTBBH = fe.Value[jcTBBHIndex].ToTrim(); oMaping.bghTBBSM = oMaping.bgqTBBSM; oMaping.bghTBBH = oMaping.bgqTBBH; oMaping.bghOID = gxOID; oMaping.bghZLDWDM = fe.Value[gxZLDWDMIndex].ToTrim(); oMaping.bgqZLDWDM = fe.Value[bgqZLDWDMIndex].ToTrim(); oMaping.BGMJ = tbmj; oMaping.XZQTZLX = string.IsNullOrWhiteSpace(fe.Value[gxXZQTZLXIndex].ToTrim()) ? "0" : fe.Value[gxXZQTZLXIndex].ToTrim(); if (string.IsNullOrWhiteSpace(oMaping.bghZLDWDM)) { LogAPI.Debug("存在变更后坐落单位代码为空的数据!请检查变更图斑的坐落单位代码字段是否存在错误数据"); } else { if (!oMaping.bgqZLDWDM.StartsWith(oMaping.bghZLDWDM.Substring(0, 6))) oMaping.XZQTZLX = "5"; } list.Add(oMaping); } string MaxBSM = string.Empty; Dictionary dicTBBH = new Dictionary(); if (list.Count != 0 && list[0].XZQTZLX == "5") { MaxBSM = list[0].bghZLDWDM.Substring(0, 6) + "2110" + 1.ToString().PadLeft(8, '0'); } else { if (string.IsNullOrWhiteSpace(MaxBSM)) MaxBSM = GetNewBSM(new List() { jcFc }); } if (dicTBBH.Count == 0) GetMaxTBBH(jcFc, ref dicTBBH); IEnumerable> groupbgq = list.GroupBy(g => g.bgqOID); count = groupbgq.Count(); curr = 0; foreach (var item in groupbgq) { if (item.Key == 71477) { } curr++; if (curr % (count / 100) == 0) ProgressHelper.Message = string.Format(msg, 2, ((curr / count) * 100).ToDouble(0) + "%"); List tempList = item.ToList(); if (tempList.Count > 1) { double kzmj = tempList[0].BGMJ; tempList.ForEach(o => { string bgqBSM = string.Empty; string bghBSM = string.Empty; string bsmPrefix = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + MaxBSM.Substring(6, 4); int MaxNum = Convert.ToInt32(MaxBSM.Substring(9)); bghBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); MaxBSM = bghBSM; string bgqTBBH = string.Empty; string bghTBBH = string.Empty; string strZLDW = o.bghZLDWDM; if (dicTBBH.ContainsKey(strZLDW)) { dicTBBH[strZLDW] = dicTBBH[strZLDW] + 1; bghTBBH = dicTBBH[strZLDW].ToTrim(); } else//新增村 { dicTBBH.Add(strZLDW, 1); bghTBBH = dicTBBH[strZLDW].ToTrim(); } o.IsTXBG = true; o.bghTBBSM = MaxBSM; o.bghTBBH = bghTBBH; o.IsSplit = true; IFeature gcF = pGxgcFc.GetFeature(o.gcOID); o.BGMJ = (gcF.ShapeCopy as IPolygon).GetEllipseArea(); Marshal.ReleaseComObject(gcF); }); tempList = tempList.OrderByDescending(o => o.BGMJ).ToList(); double mjc = (tempList.Sum(s => s.BGMJ).ToDouble(2) - kzmj).ToDouble(2); while (mjc != 0) { int tpsm = (int)(Math.Abs(Math.Round(mjc, 2)) / 0.01); int e = tpsm / tempList.Count; int f = tpsm % tempList.Count; if (f != 0) { double tpmj = (e + 1) * 0.01; for (int i = 0; i < f; i++) { if (mjc < 0) tempList[i].BGMJ += tpmj; else tempList[i].BGMJ -= tpmj; } } if (e != 0) { double tpmj = e * 0.01; for (int i = f; i < tempList.Count; i++) { if (mjc < 0) tempList[i].BGMJ += tpmj; else tempList[i].BGMJ -= tpmj; } } mjc = (tempList.Sum(s => s.BGMJ).ToDouble(2) - kzmj).ToDouble(2); } } else if (tempList[0].XZQTZLX == "1" || tempList[0].XZQTZLX == "3" || tempList[0].XZQTZLX == "5") { string bghBSM = string.Empty; string bsmPrefix = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + MaxBSM.Substring(6, 4); int MaxNum = Convert.ToInt32(MaxBSM.Substring(9)); bghBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); MaxBSM = bghBSM; tempList[0].bghTBBSM = bghBSM; if (tempList[0].XZQTZLX != "5") { string bghTBBH = string.Empty; string strZLDW = item.ToList()[0].bghZLDWDM; if (dicTBBH.ContainsKey(strZLDW)) { dicTBBH[strZLDW] = dicTBBH[strZLDW] + 1; bghTBBH = dicTBBH[strZLDW].ToTrim(); } else {//新增村 dicTBBH.Add(strZLDW, 1); bghTBBH = dicTBBH[strZLDW].ToTrim(); } tempList[0].bghTBBH = bghTBBH; } } else if (tempList.Count == 1) { //属性变更,坐落单位变化,重新赋值图斑编号 if (tempList[0].bghZLDWDM != tempList[0].bgqZLDWDM && tempList[0].IsTXBG == false) { if (dicTBBH.ContainsKey(tempList[0].bghZLDWDM)) { dicTBBH[tempList[0].bghZLDWDM] = dicTBBH[tempList[0].bghZLDWDM] + 1; tempList[0].bghTBBH = dicTBBH[tempList[0].bghZLDWDM].ToTrim(); } else//新增村 { dicTBBH.Add(tempList[0].bghZLDWDM, 1); tempList[0].bghTBBH = dicTBBH[tempList[0].bghZLDWDM].ToTrim(); } } } } groupbgq = list.GroupBy(g => g.bghOID); count = groupbgq.Count(); curr = 0; foreach (var item in groupbgq) { curr++; if (curr % (count / 100) == 0) ProgressHelper.Message = string.Format(msg, 3, ((curr / count) * 100).ToDouble(0) + "%"); List tempList = item.ToList(); if (tempList.Count > 1) { string bgqBSM = string.Empty; string bghBSM = string.Empty; if (string.IsNullOrWhiteSpace(MaxBSM)) MaxBSM = GetNewBSM(new List() { jcFc }); string bsmPrefix = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + MaxBSM.Substring(6, 4); int MaxNum = Convert.ToInt32(MaxBSM.Substring(9)); bghBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); MaxBSM = bghBSM; string bgqTBBH = string.Empty; string bghTBBH = string.Empty; string strZLDW = item.ToList()[0].bghZLDWDM; if (dicTBBH.Count == 0) GetMaxTBBH(jcFc, ref dicTBBH); if (dicTBBH.ContainsKey(strZLDW)) { dicTBBH[strZLDW] = dicTBBH[strZLDW] + 1; bghTBBH = dicTBBH[strZLDW].ToTrim(); } else//新增村 { dicTBBH.Add(strZLDW, 1); bghTBBH = dicTBBH[strZLDW].ToTrim(); } item.ToList().ForEach(o => { o.IsTXBG = true; o.bghTBBSM = MaxBSM; o.bghTBBH = bghTBBH; }); } else if (tempList[0].XZQTZLX == "1" || tempList[0].XZQTZLX == "3" || tempList[0].XZQTZLX == "5") { string bghBSM = string.Empty; string bsmPrefix = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + MaxBSM.Substring(6, 4); int MaxNum = Convert.ToInt32(MaxBSM.Substring(9)); bghBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); MaxBSM = bghBSM; tempList[0].bghTBBSM = bghBSM; if (tempList[0].XZQTZLX != "5") { string bghTBBH = string.Empty; string strZLDW = item.ToList()[0].bghZLDWDM; if (dicTBBH.ContainsKey(strZLDW)) { dicTBBH[strZLDW] = dicTBBH[strZLDW] + 1; bghTBBH = dicTBBH[strZLDW].ToTrim(); } else//新增村 { dicTBBH.Add(strZLDW, 1); bghTBBH = dicTBBH[strZLDW].ToTrim(); } tempList[0].bghTBBH = bghTBBH; } } } int idxBGQBSM = pGxgcFc.FindField("BSM"); int idxBGHBSM = pGxgcFc.FindField("BSM_1"); int idxBGQTBBH = pGxgcFc.FindField("TBBH"); int idxBGHTBBH = pGxgcFc.FindField("TBBH_1"); int idxBGHZLDW = pGxgcFc.FindField("ZLDWDM_1"); int idxTBMJ = pGxgcFc.FindField("TBMJ"); int idxGXBSM = gxLayer.FeatureClass.FindField("BSM"); List fcList = new List() { jcFc }; count = list.Count; curr = 0; foreach (var item in list) { curr++; if (curr % (count / 100) == 0) ProgressHelper.Message = string.Format(msg, 4, ((curr / count) * 100).ToDouble(0) + "%"); if (!bghAttr.ContainsKey(item.gcOID)) { bghAttr.Add(item.gcOID, new BGHAttributeModel() { BGHOID = item.bghOID, BGHTBBH = item.bghTBBH, BGHTBBSM = item.bghTBBSM, BGMJ = item.BGMJ, BGXW = item.IsTXBG ? "2" : "1", XZQTZLX = item.XZQTZLX }); if (bghAttr[item.gcOID].XZQTZLX == "3") bghAttr[item.gcOID].BGXW = "3"; } else { bghAttr[item.gcOID] = new BGHAttributeModel() { BGHOID = item.bghOID, BGHTBBH = item.bghTBBH, BGHTBBSM = item.bghTBBSM, BGMJ = item.BGMJ, BGXW = item.IsTXBG ? "2" : "1", XZQTZLX = item.XZQTZLX }; if (bghAttr[item.gcOID].XZQTZLX == "3") bghAttr[item.gcOID].BGXW = "3"; } if (item.XZQTZLX == "4") continue; if (!gxAttr.ContainsKey(item.bghOID)) { gxAttr.Add(item.bghOID, new GXAttributeModel() { TBBH = item.bghTBBH, BSM = item.bghTBBSM, TBMJ = item.BGMJ }); } else { gxAttr[item.bghOID].TBMJ += item.BGMJ; } } dtBHXXBTBBH.Clear(); } catch (Exception ex) { LogAPI.Debug("属性赋值失败:"); LogAPI.Debug(ex); } finally { dtBHXXBTBBH.Clear(); } } static System.Data.DataTable dtBHXXBTBBH = new System.Data.DataTable(); private static bool BGQ_BGH_AttrEqual(IFeature pf, ref string UnEqualAttr) { bool result = true; for (int i = 0; i < pf.Fields.FieldCount; i++) { IField field = pf.Fields.Field[i]; if ("BSM,TBBH,TBYBH,YSDM,BZ".Contains(field.Name.ToUpper()) || field.Name.ToUpper().Contains("MJ")) continue; int bghIdx = pf.Fields.FindField(field.Name.ToUpper() + "_1"); if (bghIdx == -1) continue; if ("BSM,TBBH,ZLDWDM,ZLDWMC,QSDWDM,QSDWMC".Contains(field.Name.ToUpper())) { if (pf.Value[i].ToTrim() != pf.Value[bghIdx].ToTrim()) { UnEqualAttr += field.Name.ToUpper() + ","; } continue; } if (!Equals(pf.Value[i].ToTrim(), pf.Value[bghIdx].ToTrim())) { result = false; break; } } return result; } private new static bool Equals(object obj1, object obj2) { if (obj1 == null || obj1 is DBNull) { obj1 = ""; } if (obj2 == null || obj2 is DBNull) { obj2 = ""; } if (obj2.ToString() == "0") obj2 = ""; if (obj1.ToString() == "0") obj1 = ""; if (obj1.ToTrim() == obj2.ToTrim()) { return true; } return false; } #region 获取最新图斑编号 //private static int GetNewTBBH(List fc, string pZLDWDM) //{ // int result = 0; // foreach (var item in fc) // { // int maxTBBH = GetMaxTBBH(item, pZLDWDM); // //LogAPI.Debug(item.AliasName + "的 坐落单位代码(" + pZLDWDM + ") 当前的 最大图斑编号(TBBH): " + maxTBBH + " ;\r\n ");//验证专用日志 // if (result < maxTBBH) // result = maxTBBH; // } // result++; // return result; //} private static void GetMaxTBBH(IFeatureClass fc, ref Dictionary result) { ICursor cursor = (fc as ITable).Search(new QueryFilterClass() { SubFields = "ZLDWDM,TBBH" }, true); IRow row = null; int zlIndex = -1; int bhIndex = -1; while ((row = cursor.NextRow()) != null) { if (zlIndex == -1) zlIndex = row.Fields.FindField("ZLDWDM"); if (bhIndex == -1) bhIndex = row.Fields.FindField("TBBH"); if (zlIndex != -1 && bhIndex != -1) { string zl = row.Value[zlIndex].ToTrim(); zl = zl.Replace(zl.Substring(0, 6), (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE); int tbbh = 0; int.TryParse(row.Value[bhIndex].ToString(), out tbbh); if (result.ContainsKey(zl)) { if (result[zl] < tbbh) result[zl] = tbbh; } else { result.Add(zl, tbbh); } } } } #endregion #region 获取最新标识码 public static string GetNewBSM(List fcList) { string result = string.Empty; int xh = 0; string leftStr = string.Empty; foreach (var item in fcList) { string MaxBSM = GetMaxBSM(item); if (MaxBSM.Length != 18) continue; int xh2 = Convert.ToInt32(MaxBSM.Substring(10)); leftStr = MaxBSM.Substring(0, 10); if (xh < xh2) xh = xh2; } xh++; if (string.IsNullOrWhiteSpace(leftStr)) leftStr = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + "1210"; result = leftStr + xh.ToString().PadLeft(8, '0'); return result; } private static string GetMaxBSM(IFeatureClass fc) { System.Windows.Forms.Application.DoEvents(); string BSM = string.Empty; int BSMIndex = fc.FindField("BSM"); if (BSMIndex == -1) return BSM; ITable table = (ITable)fc; // 创建一个ITableSort接口对象 ITableSort tableSort = new TableSortClass(); tableSort.Table = table; tableSort.Fields = "BSM"; tableSort.set_Ascending("BSM", false); tableSort.Sort(null); ICursor cursor = tableSort.Rows; IRow row = cursor.NextRow(); if (row != null) { int maxBSM = 0; int currBSM = 0; string BSMStr = row.Value[BSMIndex].ToString(); if (BSMStr.Length != 18) return BSM; string subBSMStr = BSMStr.Substring(9); try { currBSM = Convert.ToInt32(subBSMStr); } catch (Exception) { return BSM; } if (currBSM > maxBSM) maxBSM = currBSM; if (BSMStr.Length != 18) return BSM; string maxStr = maxBSM.ToString(); int zeroNum = 9 - maxStr.Length; for (int i = 0; i < zeroNum; i++) { maxStr = 0 + maxStr; } BSM = BSMStr.Substring(0, 9) + maxStr; } return BSM; } #endregion public static void DelectDir(string srcPath) { try { DirectoryInfo dir = new DirectoryInfo(srcPath); FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录 foreach (FileSystemInfo i in fileinfo) { if (i is DirectoryInfo) //判断是否文件夹 { DirectoryInfo subdir = new DirectoryInfo(i.FullName); subdir.Delete(true); //删除子目录和文件 } else { File.Delete(i.FullName); //删除指定文件 } } } catch (Exception) { throw; } } } public class OIDMapping { /// /// 过程层OID /// public int gcOID { get; set; } /// /// 变更前OID /// public int bgqOID { get; set; } /// /// 变更前图斑标识码 /// public string bgqTBBSM { get; set; } /// /// 变更前图斑编号 /// public string bgqTBBH { get; set; } /// /// 变更后OID /// public int bghOID { get; set; } /// /// 变更后图斑标识码 /// public string bghTBBSM { get; set; } /// /// 变更后坐落单位代码 /// public string bghZLDWDM { get; set; } /// /// 变更前坐落单位代码 /// public string bgqZLDWDM { get; set; } /// /// 变更后图斑编号 /// public string bghTBBH { get; set; } /// /// 是否图形变更 /// public bool IsTXBG { get; set; } /// /// 变更面积 /// public double BGMJ { get; set; } public string XZQTZLX { get; set; } public bool IsSplit { get; set; } } public class BGHAttributeModel { public int BGHOID { get; set; } public string BGHTBBSM { get; set; } public string BGHTBBH { get; set; } public double BGMJ { get; set; } public string BGXW { get; set; } public string XZQTZLX { get; set; } } public class GXAttributeModel { public string BSM { get; set; } public string TBBH { get; set; } public double TBMJ { get; set; } } }