using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.AE.Enum; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.AE.GPHelper; 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 KGIS.Framework.Utils.Utility; using Kingo.PluginServiceInterface; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Runtime.InteropServices; using KUI.Windows; namespace Kingo.Plugin.CZC_IDG.Helper { public class CZCDYDHelper : IDataChange { private IFeatureLayer _DLTBFc = null; public string IDataChangeName { get => "CZCDYDHelper"; } #region ExecuteDataChange public void ExecuteDataChange(DataChangeParameter pParm) { IFeatureClass _CZCFc = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地").FeatureClass; Implement(_CZCFc, true, false); } #endregion #region implement public void Implement(IFeatureClass _CZCFc, bool ckbDelMinMJ, bool ckbXDM) { try { ExtractExe(_CZCFc, ckbDelMinMJ); string time = new DateTime(DateTime.Now.Year - 1, 12, 31).ToShortDateString(); string dbPath = $"{(MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ProjDir}\\BGTJ.sqlite"; IRDBHelper rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); //DataTable bhxxbDt = rdbHelper.ExecuteDatatable("BHXXB", "select * from BHXXB where BZ='ZLBG' and BGXW='1'", true); //Dictionary dicZLBG = new Dictionary(); //Dictionary dicXZQDM = new Dictionary(); //List BGQTBBSM = new List(); //foreach (DataRow dr in bhxxbDt.Rows) //{ // string bgqzldwdm = dr["BGQZLDWDM"].ToTrim(); // string bghzldwdm = dr["BGHZLDWDM"].ToTrim(); // string bgqzldwmc = dr["BGQZLDWMC"].ToTrim(); // string bghzldwmc = dr["BGHZLDWMC"].ToTrim(); // string bgqtbbsm = dr["BGQTBBSM"].ToTrim(); // string bgq = bgqzldwdm + "_" + bgqzldwmc; // string bgh = bghzldwdm + "_" + bghzldwmc; // if (bgq != bgh && !dicZLBG.ContainsKey(bgq)) // { // dicZLBG.Add(bgq, bgh); // if (!dicXZQDM.ContainsKey(bgqzldwdm.Substring(0, 9))) // dicXZQDM.Add(bgqzldwdm.Substring(0, 9), 0); // } // if (bgq != bgh) // { // if (!BGQTBBSM.Contains(bgqtbbsm)) // { // BGQTBBSM.Add(bgqtbbsm); // } // } //} IGeometry BGQDLTBUnion = null; _DLTBFc = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); int jcbsmIndex = _DLTBFc.FeatureClass.FindField("BSM"); IFeature f = null; #region 融合 string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\CZCDYDBGTempFile"; if (!Directory.Exists(gdbFolder)) { Directory.CreateDirectory(gdbFolder); } try { DelectDir(gdbFolder);//能删除就删除 删除报错不处理 } catch { } IWorkspaceFactory pFtWsFct = new FileGDBWorkspaceFactory(); string gdbFileName = Guid.NewGuid().ToString(); string path = System.IO.Path.Combine(gdbFolder, gdbFileName); pFtWsFct.Create(path, "TempGDB", null, 0); string TempfilePath = System.IO.Path.Combine(path, "TempGDB.gdb");//临时数据存放路径 IWorkspaceAPI wsAPI = new WorkspaceAPI(TempfilePath, WorkspaceTypeEnum.GDBFile); IFeatureClassAPI CZCDYDBGTempFeatureclassAPI = wsAPI.CreateFeatureClass("CZCDYDBGTemp", (_DLTBFc.FeatureClass as IGeoDataset).SpatialReference, _DLTBFc.FeatureClass.Fields); IFeatureCursor t_cursor = CZCDYDBGTempFeatureclassAPI.FeatureClass.Insert(true); IFeatureCursor bgqcursor = _DLTBFc.Search(new QueryFilterClass() { SubFields = "BSM,Shape" }, true); while ((f = bgqcursor.NextFeature()) != null) { string bsm = f.Value[jcbsmIndex].ToTrim(); //if (!BGQTBBSM.Contains(bsm)) continue; IFeatureBuffer buf = CZCDYDBGTempFeatureclassAPI.FeatureClass.CreateFeatureBuffer(); buf.Shape = f.ShapeCopy; t_cursor.InsertFeature(buf); } t_cursor.Flush(); GPParamClass gPParamClass = new GPParamClass() { FirstFeatureClass = CZCDYDBGTempFeatureclassAPI.FeatureClass, OutFeatureClassPath = TempfilePath + "\\" + "NewCZCDYD", IsGetOutPutFeature = true, }; IFeatureLayer featureLayer = null; GeoprocessorHelper.DissolveAnalysis(gPParamClass, ref featureLayer, true); bgqcursor = featureLayer.FeatureClass.Search(null, true); IFeature bgqF = bgqcursor.NextFeature(); if (bgqF == null) { MessageHelper.Show("完成"); return; } BGQDLTBUnion = bgqF.ShapeCopy; #endregion IFeatureClass czcgxgc = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGXGC"); ITable czcgxgcTable = czcgxgc as ITable; ICursor cur = czcgxgcTable.Search(new QueryFilterClass() { SubFields = "BGQBSM" }, true); int bgqbsmIdx = czcgxgcTable.FindField("BGQBSM"); IRow row = null; Dictionary dicBSM = new Dictionary(); while ((row = cur.NextRow()) != null) { string bgqbsm = row.Value[bgqbsmIdx].ToTrim(); if (!dicBSM.ContainsKey(bgqbsm)) { dicBSM.Add(bgqbsm, 0); } } IFeatureClass czcgx = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX"); IFeatureCursor gxgcInsCur = czcgxgc.Insert(true); IFeatureCursor gxInsCur = czcgx.Insert(true); IFeatureBuffer gxgcBuf = null; IFeatureBuffer gxBuf = null; Dictionary gcFieldMapp = new Dictionary(); for (int i = 0; i < czcgxgc.Fields.FieldCount; i++) { IField field = czcgxgc.Fields.Field[i]; if (field.Name.ToUpper().Contains("SHAPE") || !field.Editable) continue; int idx = _CZCFc.FindField(field.Name.ToUpper().Replace("BGQ", "").Replace("BGH", "")); if (idx == -1) continue; gcFieldMapp.Add(i, idx); } Dictionary gxFieldMapp = new Dictionary(); for (int i = 0; i < czcgx.Fields.FieldCount; i++) { IField field = czcgx.Fields.Field[i]; if (field.Name.ToUpper().Contains("SHAPE") || !field.Editable) continue; int idx = _CZCFc.FindField(field.Name); if (idx == -1) continue; gxFieldMapp.Add(i, idx); } IFeatureCursor cursor = _CZCFc.Search(new SpatialFilterClass() { WhereClause = "CZCLX<>'201'", Geometry = BGQDLTBUnion, SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects }, true); f = null; int bsmIdx = _CZCFc.FindField("BSM"); int bgxwIdx = czcgxgc.FindField("BGXW"); int bghbsmIdx = czcgxgc.FindField("BGHBSM"); int bghczclxIdx = czcgxgc.FindField("BGHCZCLX"); int bghczcdmIdx = czcgxgc.FindField("BGHCZCDM"); int bghczcmcIdx = czcgxgc.FindField("BGHCZCMC"); //变更前 int bgqczclxIdx = czcgxgc.FindField("BGQCZCLX"); int bgqczcdmIdx = czcgxgc.FindField("BGQCZCDM"); int bgqczcmcIdx = czcgxgc.FindField("BGQCZCMC"); int bgmjIdx = czcgxgc.FindField("BGMJ"); int GXSJIdx = czcgxgc.FindField("GXSJ"); int czcmjIdx = _CZCFc.FindField("CZCMJ"); int gxBSMIdx = _CZCFc.FindField("BSM"); int czcdmIdx = _CZCFc.FindField("CZCDM"); int czcmcIdx = _CZCFc.FindField("CZCMC"); int CZCGXSJIdx = czcgx.FindField("GXSJ"); List qsDic = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.QSDM); int JC_DLTBBSM = _DLTBFc.FeatureClass.FindField("BSM"); string PrjCode = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE; while ((f = cursor.NextFeature()) != null) { string bsm = f.Value[bsmIdx].ToTrim(); if (dicBSM.ContainsKey(bsm)) continue; if (ckbXDM == false) { if (!FeatureAPI.IsInterSect(f.ShapeCopy, BGQDLTBUnion)) continue; } if (gxgcBuf == null) gxgcBuf = czcgxgc.CreateFeatureBuffer(); gxgcBuf.Shape = f.ShapeCopy; foreach (KeyValuePair idx in gcFieldMapp) { gxgcBuf.Value[idx.Key] = f.Value[idx.Value]; } string bghczclx = gxgcBuf.Value[bghczclxIdx].ToTrim(); string bghczcdm = gxgcBuf.Value[bghczcdmIdx].ToTrim(); string bghczcmc = gxgcBuf.Value[bghczcmcIdx].ToTrim(); //变更前 string bgqczclx = gxgcBuf.Value[bgqczclxIdx].ToTrim(); string bgqczcdm = gxgcBuf.Value[bgqczcdmIdx].ToTrim(); string bgqczcmc = gxgcBuf.Value[bgqczcmcIdx].ToTrim(); string bgh = bghczcdm + "_" + bghczcmc; string strCZCDM = bghczcdm; string strCZCMC = bghczcmc; if (bghczclx == "203" || bghczclx == "203A" || bghczclx == "204" || bghczclx == "205") { //if (dicZLBG.ContainsKey(bgh)) //{ // string[] zlArr = dicZLBG[bgh].Split('_'); // strCZCDM = zlArr[0]; // strCZCMC = zlArr[1]; // gxgcBuf.Value[bghczcdmIdx] = zlArr[0]; // gxgcBuf.Value[bghczcmcIdx] = zlArr[1]; //} } else if (bghczclx == "202") { //foreach (KeyValuePair kvp in dicZLBG) //{ // if (kvp.Key.StartsWith(bgh.Substring(0, 9))) // { // strCZCDM = kvp.Value.Substring(0, 9).PadRight(19, '0'); // gxgcBuf.Value[bghczcdmIdx] = strCZCDM; // if (qsDic != null) // { // DataDicTionary dic = qsDic.FirstOrDefault(qs => qs.CODE == strCZCDM || qs.CODE.StartsWith(strCZCDM.Substring(0, 9))); // if (dic != null) // { // strCZCMC = dic.NAME; // gxgcBuf.Value[bghczcmcIdx] = strCZCMC; // } // } // break; // } //} } bghczcdm = gxgcBuf.Value[bghczcdmIdx].ToTrim(); bghczcmc = gxgcBuf.Value[bghczcmcIdx].ToTrim(); if (bghczclx.Trim() == bgqczclx.Trim() && bghczcdm.Trim() == bgqczcdm.Trim() && bghczcmc.Trim() == bgqczcmc.Trim()) continue;//前后这三个字段没有前后变化则不插入 string bghbsm = gxgcBuf.Value[bghbsmIdx].ToTrim(); if (!bghbsm.StartsWith(PrjCode)) { string strR = bghbsm.Substring(0, 6); gxgcBuf.Value[bghbsmIdx] = bghbsm.Replace(strR, PrjCode); } gxgcBuf.Value[bgxwIdx] = "1"; gxgcBuf.Value[bgmjIdx] = f.Value[czcmjIdx]; gxgcBuf.Value[GXSJIdx] = time; gxgcInsCur.InsertFeature(gxgcBuf); if (gxBuf == null) gxBuf = czcgx.CreateFeatureBuffer(); gxBuf.Shape = f.ShapeCopy; foreach (KeyValuePair idx in gxFieldMapp) { gxBuf.Value[idx.Key] = f.Value[idx.Value]; } string gxbsm = gxBuf.Value[gxBSMIdx].ToTrim(); if (!gxbsm.StartsWith(PrjCode)) { string strR = gxbsm.Substring(0, 6); gxBuf.Value[gxBSMIdx] = gxbsm.Replace(strR, PrjCode); } gxBuf.Value[czcdmIdx] = strCZCDM; gxBuf.Value[czcmcIdx] = strCZCMC; gxBuf.Value[CZCGXSJIdx] = time; gxInsCur.InsertFeature(gxBuf); } gxgcInsCur.Flush(); gxInsCur.Flush(); if (ckbXDM == true) { cur = czcgxgcTable.Search(new QueryFilterClass() { SubFields = "BGQBSM" }, true); bgqbsmIdx = czcgxgcTable.FindField("BGQBSM"); row = null; dicBSM = new Dictionary(); while ((row = cur.NextRow()) != null) { string bgqbsm = row.Value[bgqbsmIdx].ToTrim(); if (!dicBSM.ContainsKey(bgqbsm)) { dicBSM.Add(bgqbsm, 0); } } cursor = _CZCFc.Search(null, true); f = null; while ((f = cursor.NextFeature()) != null) { string bsm = f.Value[bsmIdx].ToTrim(); if (dicBSM.ContainsKey(bsm)) continue; if (gxgcBuf == null) gxgcBuf = czcgxgc.CreateFeatureBuffer(); gxgcBuf.Shape = f.ShapeCopy; foreach (KeyValuePair idx in gcFieldMapp) { gxgcBuf.Value[idx.Key] = f.Value[idx.Value]; } string bghbsm = gxgcBuf.Value[bghbsmIdx].ToTrim(); string bghczclx = gxgcBuf.Value[bghczclxIdx].ToTrim(); string bghczcdm = gxgcBuf.Value[bghczcdmIdx].ToTrim(); string bghczcmc = gxgcBuf.Value[bghczcmcIdx].ToTrim(); //变更前 string bgqbsm = gxgcBuf.Value[bgqbsmIdx].ToTrim(); string bgqczclx = gxgcBuf.Value[bgqczclxIdx].ToTrim(); string bgqczcdm = gxgcBuf.Value[bgqczcdmIdx].ToTrim(); string bgqczcmc = gxgcBuf.Value[bgqczcmcIdx].ToTrim(); bghbsm = gxgcBuf.Value[bghbsmIdx].ToTrim(); if (!bghbsm.StartsWith(PrjCode)) { string strR = bghbsm.Substring(0, 6); gxgcBuf.Value[bghbsmIdx] = bghbsm.Replace(strR, PrjCode); } if (!bghczcdm.StartsWith(PrjCode)) { string strR = bghczcdm.Substring(0, 6); gxgcBuf.Value[bghczcdmIdx] = bghczcdm.Replace(strR, PrjCode); } gxgcBuf.Value[bgxwIdx] = "1"; gxgcBuf.Value[bgmjIdx] = f.Value[czcmjIdx]; gxgcBuf.Value[GXSJIdx] = time; gxgcInsCur.InsertFeature(gxgcBuf); if (gxBuf == null) gxBuf = czcgx.CreateFeatureBuffer(); gxBuf.Shape = f.ShapeCopy; foreach (KeyValuePair idx in gxFieldMapp) { gxBuf.Value[idx.Key] = f.Value[idx.Value]; } string gxbsm = gxBuf.Value[gxBSMIdx].ToTrim(); if (!gxbsm.StartsWith(PrjCode)) { string strR = gxbsm.Substring(0, 6); gxBuf.Value[gxBSMIdx] = gxbsm.Replace(strR, PrjCode); } string gxCZCDM = gxBuf.Value[czcdmIdx].ToTrim(); if (!gxCZCDM.StartsWith(PrjCode)) { string strR = gxCZCDM.Substring(0, 6); gxBuf.Value[czcdmIdx] = gxCZCDM.Replace(strR, PrjCode); } gxBuf.Value[CZCGXSJIdx] = time; gxInsCur.InsertFeature(gxBuf); } gxgcInsCur.Flush(); gxInsCur.Flush(); } } catch (Exception ex) { LogAPI.Debug("城镇村范围变更失败:"); LogAPI.Debug(ex); throw ex; } } #endregion public void ExtractExe(IFeatureClass jc_Fc, bool IsDelMinMJ) { IFeatureLayer jc_czcLayer = null; IFeatureLayer dltbgxLayer = null; IFeatureLayer dltbhrLayer = null; IFeatureLayer jcdltbLayer = null; IFeatureLayer dltbTempNMKLayer = null; IWorkspaceAPI Tempworkspace = null; IWorkspaceAPI Schemeworkspace = null; IFeatureClassAPI dltbFeatureClassAPI = null; IFeatureClassAPI czcdydFeatureClassAPI = null; IFeatureCursor pFeatureCursor = null; IFeatureCursor pInsertCursor = null; IFeatureClassAPI LSczcdydFeatureclassAPI = null; IFeatureClassAPI pFeatureClass_4 = null; IFeatureClassAPI CZCDLTBFeatureClass = null; IWorkspaceFactory outputWorkspaceFactory = null; IWorkspaceFactory pOutWorkFactory = null; string TempfilePath = string.Empty; try { ProjectInfo projectInfo = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo); List qsDic = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.QSDM); if (qsDic == null) { LogAPI.Debug($"权属单位代码表获取失败。"); return; } //string filePath = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjDBPath(); //string schemeDBPath = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetSchemeDBPath(); //ProjGDBwkspace = new WorkspaceAPI(filePath, WorkspaceTypeEnum.GDBFile); //Schemeworkspace = new WorkspaceAPI(schemeDBPath, WorkspaceTypeEnum.GDBFile); #region 临时数据 this.UpdateMsg("正在提取城镇村等用地数据......"); TempfilePath = GetTempPath();//临时数据存放路径 if (string.IsNullOrEmpty(TempfilePath)) { LogAPI.Debug($"获取到城镇村等用地数据模板失败。"); return; } #region 地类图斑 IFeatureClass bgtbFc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG"); dltbgxLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBGX"); //dltbhrLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBHR"); jcdltbLayer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); jc_czcLayer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地"); FeatureClass featureClass = jc_czcLayer.FeatureClass as FeatureClass; if (jc_czcLayer.FeatureClass.FeatureCount(null) == 0) { MessageHelper.Show("基础城镇村等用地图层未找到数据,请确认基础城镇村数据是否导入!"); return; } IFeatureLayer tempJCCZCLayer = null; //设置基础地类图斑选中 GPParamClass gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = jc_czcLayer; gPParamClass.SecondFeatureClass = dltbgxLayer.FeatureClass; //gPParamClass.Tolerance = "-0.0001655555"; GeoprocessorHelper.SelectLayerByLocationAnalysis(gPParamClass, "INTERSECT", ref tempJCCZCLayer); //选中的基础地类图斑导出至临时gdb gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = jc_czcLayer; gPParamClass.OutFeatureClassPath = TempfilePath; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.FeatureClassToFeatureClass(gPParamClass, "JC_CZCDYD", ref tempJCCZCLayer); try { ESRI.ArcGIS.Carto.IFeatureSelection selection = jc_czcLayer as IFeatureSelection; selection.Clear(); } catch (Exception ex) { LogAPI.Debug(ex.Message); } IFeatureLayer TempJCDLTB = GeoDBAPI.CreateFeatureLayerInmemeory("CZC203", "城镇村203范围", (jcdltbLayer.FeatureClass as IGeoDataset).SpatialReference, jcdltbLayer.FeatureClass.ShapeType, jcdltbLayer.FeatureClass.Fields); gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = jcdltbLayer; gPParamClass.SecondFeatureClass = tempJCCZCLayer.FeatureClass; gPParamClass.OutFeatureClassPath = TempfilePath + "\\" + "TempJCDLTB20X"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.IntersectAnalysis(gPParamClass, ref dltbTempNMKLayer); IWorkspace tempWs = (dltbTempNMKLayer.FeatureClass as FeatureClass).Workspace; tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='201' where CZCLX='201'"); tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='201A' where CZCLX='201A'"); tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='202' where CZCLX='202'"); tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='202A' where CZCLX='202A'"); tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='203' where CZCLX='203'"); tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='203A' where CZCLX='203A'"); tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='204' where CZCLX='204'"); tempWs.ExecuteSQL("Update TempJCDLTB20X set CZCSXM='205' where CZCLX='205'"); IFeatureClassAPI dltb20xAPI = new FeatureClassAPI(dltbTempNMKLayer.FeatureClass); dltb20xAPI.FcToFc(TempJCDLTB.FeatureClass, null, false); 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); IFeatureLayer pjbntFeatureLayer = null; gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = TempJCDLTB.FeatureClass; gPParamClass.SecondFeatureClass = msTBLayer.FeatureClass; gPParamClass.OutFeatureClassPath = TempfilePath + "\\" + "TempDLTBNM"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.EraseAnalysis(gPParamClass, ref pjbntFeatureLayer); IFeatureLayer TempDLTB_MToS = null; gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = pjbntFeatureLayer.FeatureClass; gPParamClass.OutFeatureClassPath = TempfilePath + "\\" + "TempDLTBNM_MToS"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(gPParamClass, ref TempDLTB_MToS); gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = TempDLTB_MToS; gPParamClass.SecondFeatureLayer = dltbgxLayer; gPParamClass.OutFeatureClassPath = TempfilePath + "\\" + "DLTBGXGC"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.EraseAnalysis(gPParamClass, ref dltbTempNMKLayer); IFeatureClassAPI fcAPI = new FeatureClassAPI(dltbgxLayer.FeatureClass); fcAPI.FcToFc(dltbTempNMKLayer.FeatureClass, null, false); //fcAPI = new FeatureClassAPI(dltbhrLayer.FeatureClass); //fcAPI.FcToFc(dltbTempNMKLayer.FeatureClass, null, false); fcAPI = new FeatureClassAPI(dltbTempNMKLayer.FeatureClass); string dbPath = $"{(MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ProjDir}\\BGTJ.sqlite"; IRDBHelper rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); //DataTable bhxxbDt = new DataTable(); //Dictionary bhxxDic = new Dictionary(); //List hcbghbsmList = new List(); //Dictionary zlbgList = new Dictionary(); //if (rdbHelper.TableIsExist("BHXXB")) //{ // bhxxbDt = rdbHelper.ExecuteDatatable("BHXXB", "select * from BHXXB", true); // if (bhxxbDt != null) // { // foreach (DataRow row in bhxxbDt.Rows) // { // if (row["BZ"].ToTrim() == "ZLBG" && row["BGXW"].ToTrim() == "1") // { // string bgqbsm = row["BGQTBBSM"].ToTrim(); // if (!zlbgList.ContainsKey(bgqbsm)) // zlbgList.Add(bgqbsm, row); // continue; // } // string bghBSM = row["BGHTBBSM"].ToTrim(); // if (row["BGXW"].ToTrim() == "1") // { // bghBSM = row["BGQTBBSM"].ToTrim(); // } // if (bhxxDic.ContainsKey(bghBSM)) // continue; // bhxxDic.Add(bghBSM, row); // string xzqtzlx = row["XZQTZLX"].ToTrim(); // if (xzqtzlx == "2" && !string.IsNullOrWhiteSpace(bghBSM)) // { // hcbghbsmList.Add(bghBSM); // } // } // } //} ITable nmkTable = dltbTempNMKLayer.FeatureClass as ITable; IQueryFilter filter = new QueryFilterClass(); //foreach (string bsm in hcbghbsmList) //{ // filter.WhereClause = string.Format("BSM ='{0}' ", bsm); // nmkTable.DeleteSearchedRows(filter); //} ICursor nmkCur = nmkTable.Update(null, true); IRow nmkRow = null; int bsmIdx = nmkTable.FindField("BSM"); int zldwIdx = nmkTable.FindField("ZLDWDM"); int zldwmcIdx = nmkTable.FindField("ZLDWMC"); int sjnfIdx = nmkTable.FindField("SJNF");//数据年份 int num1 = 0; while ((nmkRow = nmkCur.NextRow()) != null) { num1++; string bsm = nmkRow.Value[bsmIdx].ToTrim(); //if (zlbgList.ContainsKey(bsm)) //{ // DataRow dr = zlbgList[bsm]; // nmkRow.Value[zldwIdx] = dr["BGHZLDWDM"]; // nmkRow.Value[zldwmcIdx] = dr["BGHZLDWMC"]; //} //else //if (bhxxDic.ContainsKey(bsm)) //{ // for (int i = 0; i < nmkRow.Fields.FieldCount; i++) // { // IField field = nmkRow.Fields.Field[i]; // string bghField = "BGH" + field.Name; // DataRow dr = bhxxDic[bsm]; // if (!dr.Table.Columns.Contains(bghField)) // bghField = "BGHTB" + field.Name; // if (dr.Table.Columns.Contains(bghField)) // { // if (field.Type == esriFieldType.esriFieldTypeString) // nmkRow.Value[i] = dr[bghField]; // else if (field.Type == esriFieldType.esriFieldTypeDouble) // nmkRow.Value[i] = dr[bghField].ToDouble(); // } // } //} if (sjnfIdx != -1) { nmkRow.Value[sjnfIdx] = "2020"; } nmkCur.UpdateRow(nmkRow); if (num1 % 1000 == 0) { nmkCur.Flush(); } } nmkCur.Flush(); #endregion IWorkspaceFactory TempWorkspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass(); Tempworkspace = new WorkspaceAPI(TempWorkspaceFactory.OpenFromFile(TempfilePath, 0)); dltbFeatureClassAPI = Tempworkspace.OpenFeatureClass("DLTBGXGC"); #endregion czcdydFeatureClassAPI = new FeatureClassAPI(MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX"));// Schemeworkspace.OpenFeatureClass("CZCDYDGX"); if (dltbFeatureClassAPI.FeatureClass.FeatureCount(null) <= 0) { return; } if (Tempworkspace.ExistFeatureClass("LSczcdyd")) { Tempworkspace.DeleteFeatureClass("LSczcdyd"); } // 创建临时层 LSczcdydFeatureclassAPI = Tempworkspace.CreateFeatureClass("LSczcdyd", (czcdydFeatureClassAPI.FeatureClass as IGeoDataset).SpatialReference, null); LSczcdydFeatureclassAPI.AddField("CZCLX", esriFieldType.esriFieldTypeString, "CZCLX"); LSczcdydFeatureclassAPI.AddField("CZCDM", esriFieldType.esriFieldTypeString, "CZCDM"); LSczcdydFeatureclassAPI.AddField("CZCMC", esriFieldType.esriFieldTypeString, "CZCMC"); LSczcdydFeatureclassAPI.AddField("ZLDWDM", esriFieldType.esriFieldTypeString, "ZLDWDM"); LSczcdydFeatureclassAPI.AddField("ZLDWMC", esriFieldType.esriFieldTypeString, "ZLDWMC"); if (czcdydFeatureClassAPI == null || czcdydFeatureClassAPI.FeatureClass == null) { MessageHelper.ShowTips("当前工程数据库未找到城镇村等用地(CZCDYDGX)图层!"); return; } int czcsxmIndex = dltbFeatureClassAPI.FeatureClass.Fields.FindField("CZCSXM"); int czclxIndex = czcdydFeatureClassAPI.FeatureClass.Fields.FindField("CZCLX"); int LSczclxIndex = LSczcdydFeatureclassAPI.FeatureClass.Fields.FindField("CZCLX"); IQueryFilter queryFilter = new QueryFilter() { WhereClause = "CZCSXM IN('201','202','203','204','205','201A','202A','203A')" }; int count = dltbFeatureClassAPI.FeatureClass.FeatureCount(queryFilter); if (czcdydFeatureClassAPI.FeatureClass.FeatureCount(null) > 0) { ITable pTable = czcdydFeatureClassAPI.FeatureClass as ITable; if (pTable != null) { pTable.DeleteSearchedRows(null); } else { MessageHelper.ShowTips("城镇村等用地数据清除失败!"); return; } } pFeatureCursor = dltbFeatureClassAPI.FeatureClass.Search(queryFilter, false); pInsertCursor = LSczcdydFeatureclassAPI.FeatureClass.Insert(true); IFeatureBuffer featureAdd = LSczcdydFeatureclassAPI.FeatureClass.CreateFeatureBuffer(); IFeature pFeature = null; int num = 0; int zldwdm = dltbFeatureClassAPI.FeatureClass.Fields.FindField("ZLDWDM"); int zldwmc = dltbFeatureClassAPI.FeatureClass.Fields.FindField("ZLDWMC"); int lszldwdm = LSczcdydFeatureclassAPI.FeatureClass.Fields.FindField("ZLDWDM"); int lszldwmc = LSczcdydFeatureclassAPI.FeatureClass.Fields.FindField("ZLDWMC"); while ((pFeature = pFeatureCursor.NextFeature()) != null) { featureAdd.Shape = pFeature.Shape; if (LSczclxIndex > -1) { featureAdd.set_Value(LSczclxIndex, pFeature.get_Value(czcsxmIndex)); } if (lszldwdm != -1) { featureAdd.set_Value(lszldwdm, pFeature.get_Value(zldwdm)); } if (lszldwmc != -1) { featureAdd.set_Value(lszldwmc, pFeature.get_Value(zldwmc)); } pInsertCursor.InsertFeature(featureAdd); } pInsertCursor.Flush(); this.UpdateMsg("正在对城镇村等用地更新进行赋值......"); pOutWorkFactory = new SqlWorkspaceFactoryClass(); IWorkspace pOutWork = pOutWorkFactory.OpenFromFile(dbPath, 0); //IFeatureWorkspace SchemeWork = GetGdbWorkspace(schemeDBPath); IFeatureWorkspace TempWork2 = GetGdbWorkspace(TempfilePath); rdbHelper.ExecuteSQL(" drop table LSczcdyd "); TableToTable(TempWork2, pOutWork, "LSczcdyd"); string updateSQL = string.Format("update {0} set CZCDM = substr(ZLDWDM,1,6) || '0000000000000' where CZCLX in ('201','201A')", "LSczcdyd"); rdbHelper.ExecuteSQL(updateSQL); updateSQL = string.Format("update {0} set CZCDM = substr(ZLDWDM,1,9) || '0000000000' where CZCLX in ('202','202A')", "LSczcdyd"); rdbHelper.ExecuteSQL(updateSQL); updateSQL = string.Format("update {0} set CZCDM = [ZLDWDM],CZCMC = [ZLDWMC] where CZCLX in ('203','203A','204','205')", "LSczcdyd"); var x = rdbHelper.ExecuteSQL(updateSQL); DataTable dtLSczcdyd = rdbHelper.ExecuteDatatable("LSczcdyd", "select OBJECTID,CZCDM,CZCMC from LSczcdyd", true); pFeatureCursor = Tempworkspace.OpenFeatureClass("LSczcdyd").FeatureClass.Update(null, false); while ((pFeature = pFeatureCursor.NextFeature()) != null) { object czcdm = dtLSczcdyd.Select(string.Format(" OBJECTID={0} ", pFeature.get_Value(pFeature.Fields.FindField("OBJECTID"))))[0]["CZCDM"]; pFeature.set_Value(pFeature.Fields.FindField("CZCDM"), czcdm); object czcmc = dtLSczcdyd.Select(string.Format(" OBJECTID={0} ", pFeature.get_Value(pFeature.Fields.FindField("OBJECTID"))))[0]["CZCMC"]; pFeature.set_Value(pFeature.Fields.FindField("CZCMC"), czcmc); pFeatureCursor.UpdateFeature(pFeature); } pFeatureCursor.Flush(); LSczcdydFeatureclassAPI = Tempworkspace.OpenFeatureClass("LSczcdyd"); // 根据城镇村等用地类型及城镇村代码相同且相邻进行融合 List columns = new List() { "CZCLX", "CZCDM", "CZCMC" }; var beforeCount = LSczcdydFeatureclassAPI.FeatureClass.FeatureCount(null); var outFilePath = TempfilePath + "\\CZCDYD_Dissolve"; gPParamClass = new GPParamClass() { FirstFeatureClass = LSczcdydFeatureclassAPI.FeatureClass, OutFeatureClassPath = outFilePath, IsGetOutPutFeature = true, ListDissolveFiledName = columns, //Statistics_Fields = "BSM COUNT", }; if (Tempworkspace.ExistFeatureClass("CZCDYD_Dissolve")) { Tempworkspace.DeleteFeatureClass("CZCDYD_Dissolve"); } if (Tempworkspace.ExistFeatureClass("CZCDYD_Dissolve_Result")) { Tempworkspace.DeleteFeatureClass("CZCDYD_Dissolve_Result"); } string path = gPParamClass.OutFeatureClassPath; IFeatureLayer featureLayer = null; GeoprocessorHelper.DissolveAnalysis(gPParamClass, ref featureLayer); GeoprocessorHelper.FeatureClassToFeatureClass(featureLayer, TempfilePath, "CZCDYD_Dissolve_Result"); pFeatureClass_4 = Tempworkspace.OpenFeatureClass("CZCDYD_Dissolve_Result"); int countt = pFeatureClass_4.FeatureClass.FeatureCount(null); if (countt <= 0) { //MessageHelper.ShowTips("融合之后出错!,数据异常"); return; } pFeatureCursor = pFeatureClass_4.FeatureClass.Search(null, false); //网格大小引发的错误 if (czcdydFeatureClassAPI.FeatureClass is IFeatureClassLoad pFclsLoad) pFclsLoad.LoadOnlyMode = true; pInsertCursor = czcdydFeatureClassAPI.FeatureClass.Insert(true); int cxmIndex = pFeatureClass_4.FeatureClass.FindField("CZCLX"); int Index_1 = pFeatureClass_4.FeatureClass.FindField("CZCDM"); int Index_2 = czcdydFeatureClassAPI.FeatureClass.FindField("CZCDM"); int Index_3 = pFeatureClass_4.FeatureClass.FindField("CZCMC"); int Index_4 = czcdydFeatureClassAPI.FeatureClass.FindField("CZCMC"); featureAdd = czcdydFeatureClassAPI.FeatureClass.CreateFeatureBuffer(); pFeature = null; string substr = ""; num = 0; while ((pFeature = pFeatureCursor.NextFeature()) != null) { featureAdd.Shape = pFeature.Shape; if (czclxIndex > -1) { featureAdd.set_Value(czclxIndex, pFeature.get_Value(cxmIndex)); featureAdd.set_Value(Index_2, pFeature.get_Value(Index_1)); featureAdd.set_Value(Index_4, pFeature.get_Value(Index_3)); if (string.IsNullOrEmpty(substr)) { substr = pFeature.get_Value(Index_1).ToString(); } } pInsertCursor.InsertFeature(featureAdd); } pInsertCursor.Flush(); if (czcdydFeatureClassAPI.FeatureClass is IFeatureClassLoad pFclsLoads) pFclsLoads.LoadOnlyMode = false; path = GetTempPath(); rdbHelper.ExecuteSQL(" drop table CZCDYDGX "); IFeatureWorkspace TempfeatureWorkspace = (MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX") as FeatureClass).Workspace as IFeatureWorkspace; TableToTable(TempfeatureWorkspace, pOutWork, "CZCDYDGX"); #region 201 201A { var result = GetXZQDic().Find(p => p.CODE == substr.Substring(0, 6)); if (result != null) { string SQLstr = $"UPDATE CZCDYDGX SET CZCMC = '{result.NAME}' WHERE CZCLX in ('201','201A')"; rdbHelper.ExecuteSQL(SQLstr); } } #endregion rdbHelper.ExecuteSQL(" drop table CJDCQGX "); TableToTable(TempfeatureWorkspace, pOutWork, "CJDCQGX"); DataTable dt = rdbHelper.ExecuteDatatable("CZCDYDGX", "select objectid,CZCMC from CZCDYDGX", true); string time = new DateTime(DateTime.Now.Year - 1, 12, 31).ToShortDateString(); // 标识码赋值 int maxValue = 1; string MaxBSM = GetMaxBSM(new List() { jc_Fc }); string BSM = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + "2931"; IFeatureCursor pFeatureCursor_LS = czcdydFeatureClassAPI.FeatureClass.Update(null, true); count = czcdydFeatureClassAPI.FeatureClass.FeatureCount(null); this.UpdateMsg("正在对城镇村等用地更新进行赋值......"); int bsmIndexof = czcdydFeatureClassAPI.FeatureClass.FindField("BSM"); int czclxindex = czcdydFeatureClassAPI.FeatureClass.FindField("CZCLX"); num = 0; IFeature pfeaFeature = pFeatureCursor_LS.NextFeature(); int czcdmIdx = czcdydFeatureClassAPI.FeatureClass.Fields.FindField("CZCDM"); while (pfeaFeature != null) { string bsmPrefix = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + MaxBSM.Substring(6, 4); int MaxNum = Convert.ToInt32(MaxBSM.Substring(10)); MaxBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); pfeaFeature.set_Value(bsmIndexof, MaxBSM); pfeaFeature.set_Value(czcdydFeatureClassAPI.FeatureClass.FindField("YSDM"), "2099030100"); string czclx = pfeaFeature.Value[czclxindex].ToTrim(); string czcmc = string.Empty; DataRow[] drSet = dt.Select(string.Format(" objectid='{0}' ", pfeaFeature.Value[0])); if (drSet != null && drSet.Length > 0) { czcmc = drSet[0]["CZCMC"].ToString(); } if (string.IsNullOrWhiteSpace(czcmc) && czcdmIdx != -1 && qsDic != null) { string strCZCDM = pfeaFeature.Value[czcdmIdx].ToTrim(); if (czclx == "203" || czclx == "203A" || czclx == "204" || czclx == "205") { if (strCZCDM.Length > 12) { DataDicTionary dic = qsDic.FirstOrDefault(qs => qs.CODE == strCZCDM || qs.CODE.StartsWith(strCZCDM.Substring(0, 12))); if (dic != null) czcmc = dic.NAME; } } else if (czclx == "202" || czclx == "202A") { if (strCZCDM.Length > 9) { DataDicTionary dic = qsDic.FirstOrDefault(qs => qs.CODE == strCZCDM || qs.CODE.StartsWith(strCZCDM.Substring(0, 9))); if (dic != null) czcmc = dic.NAME; } } else if (czclx == "201" || czclx == "201A") { if (strCZCDM.Length > 6) { DataDicTionary dic = qsDic.FirstOrDefault(qs => qs.CODE == strCZCDM || qs.CODE.StartsWith(strCZCDM.Substring(0, 6))); if (dic != null) czcmc = dic.NAME; } } } pfeaFeature.set_Value(czcdydFeatureClassAPI.FeatureClass.FindField("CZCMC"), czcmc); pfeaFeature.set_Value(czcdydFeatureClassAPI.FeatureClass.FindField("GXSJ"), time); pfeaFeature.set_Value(czcdydFeatureClassAPI.FeatureClass.FindField("CZCMJ"), pfeaFeature.ShapeCopy.GetEllipseArea()); pFeatureCursor_LS.UpdateFeature(pfeaFeature); maxValue++; pfeaFeature = pFeatureCursor_LS.NextFeature(); } pFeatureCursor_LS.Flush(); //设置基础城镇村选中 gPParamClass = new GPParamClass(); IFeatureWorkspace inWs = GetGdbWorkspace(path); IFeatureLayer czcUnionLayer = null; gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地"); gPParamClass.SecondFeatureClass = czcdydFeatureClassAPI.FeatureClass; gPParamClass.OutFeatureClassPath = path + "\\" + "TempCZCGXGC2"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.UnionAnalysis(gPParamClass, ref czcUnionLayer); gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureClass = czcUnionLayer.FeatureClass; gPParamClass.OutFeatureClassPath = path + "\\" + "TempCZCGXGC"; gPParamClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(gPParamClass, ref czcUnionLayer); rdbHelper.ExecuteSQL(" drop table TempCZCGXGC "); TableToTable(inWs, pOutWork, "TempCZCGXGC"); string FID_JC_CZCDYD = $"FID_{featureClass.Name}"; string strSql = $"select objectid,fid_czcdydgx from (select count(1) num,objectid,{FID_JC_CZCDYD},czclx bgqczclx,czclx_1 bghczclx,czcdm bgqczcdm,czcdm_1 bghczcdm,czcmc bgqczcmc,czcmc_1 bghczcmc,FID_CZCDYDGX from TempCZCGXGC group by {FID_JC_CZCDYD}) where num=1 and bgqczclx=bghczclx and bgqczcdm=bghczcdm and bgqczcmc=bghczcmc"; DataTable gxgcDT = rdbHelper.ExecuteDatatable("tempgxgc", strSql, true); strSql = $"select objectid,fid_czcdydgx from (select count(1) num,objectid,{FID_JC_CZCDYD},czclx bgqczclx,czclx_1 bghczclx,czcdm bgqczcdm,czcdm_1 bghczcdm,czcmc bgqczcmc,czcmc_1 bghczcmc,FID_CZCDYDGX from TempCZCGXGC group by FID_CZCDYDGX) where num=1 and bgqczclx=bghczclx and bgqczcdm=bghczcdm and bgqczcmc=bghczcmc"; DataTable gxgcDT2 = rdbHelper.ExecuteDatatable("tempgxgc", strSql, true); List AllowDelOIDs = new List(); if (gxgcDT2 != null) { foreach (DataRow row in gxgcDT2.Rows) { AllowDelOIDs.Add(Convert.ToInt32(row["FID_CZCDYDGX"])); } } if (gxgcDT != null) { List SqlList = new List(); foreach (DataRow row in gxgcDT.Rows) { int oid = Convert.ToInt32(row["OBJECTID"]); int gxOID = Convert.ToInt32(row["FID_CZCDYDGX"]); if (!AllowDelOIDs.Contains(gxOID)) continue; IFeature gx = czcdydFeatureClassAPI.FeatureClass.GetFeature(gxOID); gx.Delete(); IFeature gcF = czcUnionLayer.FeatureClass.GetFeature(oid); gcF.Delete(); SqlList.Add(string.Format("Delete from TempCZCGXGC where OBJECTID={0}", oid)); } rdbHelper.BeginTransaction(); try { foreach (var item in SqlList) { rdbHelper.ExecuteSQL(item); } rdbHelper.Commit(); } catch (Exception ex) { rdbHelper.Rollback(); } } IFeatureClassAPI czcGXGCAPI = new FeatureClassAPI(MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGXGC"));// .OpenFeatureClass("CZCDYDGXGC"); (czcGXGCAPI.FeatureClass as ITable).DeleteSearchedRows(null); IFeatureCursor cursor = czcUnionLayer.FeatureClass.Search(null, true); IFeature f = null; int idxBGQBSM = czcUnionLayer.FeatureClass.FindField("BSM"); int idxBGHBSM = czcUnionLayer.FeatureClass.FindField("BSM_1"); int idxBGQCZCLX = czcUnionLayer.FeatureClass.FindField("CZCLX"); int idxBGHCZCLX = czcUnionLayer.FeatureClass.FindField("CZCLX_1"); int idxBGQCZCDM = czcUnionLayer.FeatureClass.FindField("CZCDM"); int idxBGHCZCDM = czcUnionLayer.FeatureClass.FindField("CZCDM_1"); int idxBGQCZCMC = czcUnionLayer.FeatureClass.FindField("CZCMC"); int idxBGHCZCMC = czcUnionLayer.FeatureClass.FindField("CZCMC_1"); int idxCZCMJ = czcUnionLayer.FeatureClass.FindField("CZCMJ"); int t_idxBGQBSM = czcGXGCAPI.FeatureClass.FindField("BGQBSM"); int t_idxBGHBSM = czcGXGCAPI.FeatureClass.FindField("BGHBSM"); int t_idxBGQCZCLX = czcGXGCAPI.FeatureClass.FindField("BGQCZCLX"); int t_idxBGHCZCLX = czcGXGCAPI.FeatureClass.FindField("BGHCZCLX"); int t_idxBGQCZCDM = czcGXGCAPI.FeatureClass.FindField("BGQCZCDM"); int t_idxBGHCZCDM = czcGXGCAPI.FeatureClass.FindField("BGHCZCDM"); int t_idxBGQCZCMC = czcGXGCAPI.FeatureClass.FindField("BGQCZCMC"); int t_idxBGHCZCMC = czcGXGCAPI.FeatureClass.FindField("BGHCZCMC"); int t_idxBGMJ = czcGXGCAPI.FeatureClass.FindField("BGMJ"); int t_idxBGXW = czcGXGCAPI.FeatureClass.FindField("BGXW"); int t_idxGXSJ = czcGXGCAPI.FeatureClass.FindField("GXSJ"); //网格大小报错 if (czcGXGCAPI.FeatureClass is IFeatureClassLoad pFclsLoad2) pFclsLoad2.LoadOnlyMode = true; IFeatureCursor insertCur = czcGXGCAPI.FeatureClass.Insert(true); IFeatureBuffer buf = null; List pcList = new List(); IFeatureLayer czcgxLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("CZCDYDGX"); IFeatureLayer jcczcLayer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地"); int idxGXBSM = czcgxLayer.FeatureClass.FindField("BSM"); strSql = $"select BSM from (select count(1) num,objectid,bsm from TempCZCGXGC group by {FID_JC_CZCDYD}) where num>1"; DataTable txbgData = rdbHelper.ExecuteDatatable("tempgxgc", strSql, true); count = czcUnionLayer.FeatureClass.FeatureCount(null); num = 0; while ((f = cursor.NextFeature()) != null) { string s_bgqbsm = f.Value[idxBGQBSM].ToTrim(); string s_bghbsm = f.Value[idxBGHBSM].ToTrim(); string s_bgqczclx = f.Value[idxBGQCZCLX].ToTrim(); string s_bghczclx = f.Value[idxBGHCZCLX].ToTrim(); string s_bgqczcdm = f.Value[idxBGQCZCDM].ToTrim(); string s_bghczcdm = f.Value[idxBGHCZCDM].ToTrim(); string s_bgqczcmc = f.Value[idxBGQCZCMC].ToTrim(); string s_bghczcmc = f.Value[idxBGHCZCMC].ToTrim(); double czcmj = f.Value[idxCZCMJ].ToDouble(2); if ((s_bgqczclx == "203" || s_bgqczclx == "203A") && s_bgqczclx == s_bghczclx && s_bgqczcdm.Substring(0, 12) == s_bghczcdm.Substring(0, 12)) { List jcList = FeatureAPI.Identify2(f.ShapeCopy, jcczcLayer); if (jcList.Count == 1 && FeatureAPI.GetEqual(jcList[0].ShapeCopy, f.ShapeCopy)) { List gxList = FeatureAPI.Identify2(f.ShapeCopy, czcgxLayer); foreach (var tempGxItem in gxList) { tempGxItem.Shape = FeatureAPI.Difference(tempGxItem.ShapeCopy, f.ShapeCopy); tempGxItem.Store(); if (tempGxItem.Shape.IsEmpty) { tempGxItem.Delete(); } } continue; } else { } } string bgxw = string.Empty; if (string.IsNullOrWhiteSpace(s_bghczclx)) { bgxw = "0"; List gxList = FeatureAPI.Identify2(f.ShapeCopy, dltbgxLayer); if (gxList.Count == 0) { continue; } } else if (string.IsNullOrWhiteSpace(s_bgqczcdm)) { bgxw = "3"; List gxList = FeatureAPI.Identify2(f.ShapeCopy, dltbgxLayer); if (gxList.Count == 0) { List gxList2 = FeatureAPI.Identify2(f.ShapeCopy, czcgxLayer); foreach (var item in gxList2) { if (FeatureAPI.GetEqual(item.ShapeCopy, f.ShapeCopy)) item.Delete(); else { item.Shape = FeatureAPI.Difference(item.ShapeCopy, f.ShapeCopy); item.Store(); } } continue; } } else { bgxw = "2"; if (txbgData.Select(string.Format("BSM='{0}'", s_bgqbsm)).Length == 0) { List gxList = FeatureAPI.Identify2(f.ShapeCopy, czcgxLayer); if (gxList.Count == 1) { if (FeatureAPI.GetEqual(f.ShapeCopy, gxList[0].ShapeCopy)) { bgxw = "1"; s_bghbsm = s_bgqbsm; gxList[0].Value[idxGXBSM] = s_bghbsm; gxList[0].Store(); } } } } buf = czcGXGCAPI.FeatureClass.CreateFeatureBuffer(); buf.Shape = f.ShapeCopy; buf.Value[t_idxBGQCZCLX] = s_bgqczclx; buf.Value[t_idxBGQCZCDM] = s_bgqczcdm; buf.Value[t_idxBGQCZCMC] = s_bgqczcmc; buf.Value[t_idxBGQBSM] = s_bgqbsm; buf.Value[t_idxGXSJ] = time; buf.Value[t_idxBGXW] = bgxw; buf.Value[t_idxBGHCZCLX] = s_bghczclx; buf.Value[t_idxBGHCZCDM] = s_bghczcdm; buf.Value[t_idxBGHCZCMC] = s_bghczcmc; buf.Value[t_idxBGHBSM] = s_bghbsm; double bgmj = f.ShapeCopy.GetEllipseArea().ToDouble(2); if (bgxw == "3") { buf.Value[t_idxBGMJ] = bgmj; } object oid = insertCur.InsertFeature(buf); if (bgxw != "3") { PCModel pc = pcList.FirstOrDefault(e => e.BGQBSM == s_bgqbsm); if (pc == null) { pc = new PCModel(); pc.BGQBSM = s_bgqbsm; pc.KZMJ = czcmj; pc.GCData.Add(new GCMJModel() { OID = Convert.ToInt32(oid), MJ = bgmj }); pcList.Add(pc); } else { pc.GCData.Add(new GCMJModel() { OID = Convert.ToInt32(oid), MJ = bgmj }); } } } insertCur.Flush(); if (czcGXGCAPI.FeatureClass is IFeatureClassLoad pFclsLoad3) pFclsLoad3.LoadOnlyMode = false; foreach (var item in pcList) { item.PC2(); foreach (var gcOID in item.GCData) { IFeature gc = czcGXGCAPI.FeatureClass.GetFeature(gcOID.OID); gc.Value[t_idxBGMJ] = gcOID.MJ; gc.Store(); } } DataTable tempGcDt = new DataTable(); IQueryFilter filt = new QueryFilterClass(); filt.SubFields = "BGMJ,BGHBSM,BGQBSM,OBJECTID,BGXW"; filt.WhereClause = "BGXW <> '0'"; czcGXGCAPI.QueryFeaturesToDataTable(filt, -1, out tempGcDt); Dictionary bghMJs = new Dictionary(); foreach (DataRow item in tempGcDt.Rows) { string bsm = item["BGHBSM"].ToTrim(); if (string.IsNullOrWhiteSpace(bsm)) continue; if (bghMJs.ContainsKey(bsm)) { bghMJs[bsm] += item["BGMJ"].ToDouble(2); } else { bghMJs.Add(bsm, item["BGMJ"].ToDouble(2)); } } //List upMJSqlList = new List(); //foreach (var item in bghMJs.Keys) //{ // upMJSqlList.Add(string.Format("Update CZCDYDGX set CZCMJ={0} where BSM='{1}'", bghMJs[item].ToDouble(2), item)); //} ICursor upCursor = (czcgxLayer.FeatureClass as ITable).Update(null, true); IRow upRow = null; int idxGXCZCMJ = czcgxLayer.FeatureClass.FindField("CZCMJ"); while ((upRow = upCursor.NextRow()) != null) { string bsm = upRow.Value[idxGXBSM].ToTrim(); if (bghMJs.ContainsKey(bsm)) { upRow.Value[idxGXCZCMJ] = bghMJs[bsm].ToDouble(2); upCursor.UpdateRow(upRow); } } IFeatureLayer JC_CZC203Layer_Mem = GeoDBAPI.CreateFeatureLayerInmemeory("JCCZC203", "城镇村203范围", (jc_Fc as IGeoDataset).SpatialReference, jc_Fc.ShapeType, jc_Fc.Fields); filter.WhereClause = "CZCLX='203' or CZCLX='203A'"; InsertDataToMemeoryLayer(tempJCCZCLayer.FeatureClass, JC_CZC203Layer_Mem.FeatureClass, filter); cursor = czcgxLayer.FeatureClass.Search(new QueryFilterClass() { WhereClause = " CZCLX='203' or CZCLX='203A'" }, true); f = null; List feaOIDs = new List(); //int czclxIdx = czcgxLayer.FeatureClass.FindField("CZCLX"); int jcczclxIdx = JC_CZC203Layer_Mem.FeatureClass.FindField("CZCLX"); while ((f = cursor.NextFeature()) != null) { List jc203Features = FeatureAPI.Identify(f.ShapeCopy, JC_CZC203Layer_Mem); if (jc203Features != null) { foreach (var jcF in jc203Features) { if (FeatureAPI.GetEqual(jcF.ShapeCopy, f.ShapeCopy)) break; if (!FeatureAPI.IsInterSect(jcF.ShapeCopy, f.ShapeCopy)) continue; IGeometry InterGeo = FeatureAPI.InterSect(jcF.ShapeCopy, f.ShapeCopy); IGeometry DiffGeo = FeatureAPI.Difference(f.ShapeCopy, jcF.ShapeCopy); if (DiffGeo.IsEmpty) { break; } if (!feaOIDs.Contains(f.OID)) feaOIDs.Add(f.OID); } } } idxGXBSM = czcgxLayer.FeatureClass.FindField("BSM"); int idxGXCZCLX = czcgxLayer.FeatureClass.FindField("CZCLX"); int idxGXCZCDM = czcgxLayer.FeatureClass.FindField("CZCDM"); int idxGXCZCMC = czcgxLayer.FeatureClass.FindField("CZCMC"); idxGXCZCMJ = czcgxLayer.FeatureClass.FindField("CZCMJ"); int idxGXGXSJ = czcgxLayer.FeatureClass.FindField("GXSJ"); IFeatureLayer czcgxgcLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("CZCDYDGXGC"); int idxGXGCBGMJ = czcgxgcLayer.FeatureClass.FindField("BGMJ"); int idxGXGCBGHBSM = czcgxgcLayer.FeatureClass.FindField("BGHBSM"); insertCur = czcgxLayer.FeatureClass.Insert(true); foreach (int oid in feaOIDs) { f = czcgxLayer.FeatureClass.GetFeature(oid); string bsm = f.Value[idxGXBSM].ToTrim(); string czclx = f.Value[idxGXCZCLX].ToTrim(); List jc203Features = FeatureAPI.Identify(f.ShapeCopy, JC_CZC203Layer_Mem); if (jc203Features != null) { IGeometry jc203 = null; foreach (var jcF in jc203Features) { bool IsEquql = FeatureAPI.GetEqual(jcF.ShapeCopy, f.ShapeCopy); string jcczclx = jcF.Value[jcczclxIdx].ToTrim(); if (IsEquql && jcczclx == czclx) { f.Delete(); break; } if (!FeatureAPI.IsInterSect(jcF.ShapeCopy, f.ShapeCopy)) continue; if (FeatureAPI.IsContains(jcF.ShapeCopy, f.ShapeCopy)) { break; } if (jc203 == null) jc203 = jcF.ShapeCopy; else jc203 = FeatureAPI.Union(jc203, jcF.ShapeCopy); } IGeometry InterGeo = FeatureAPI.InterSect(jc203, f.ShapeCopy); IGeometry DiffGeo = FeatureAPI.Difference(f.ShapeCopy, jc203); if (DiffGeo.IsEmpty) { continue; } List Rings = FeatureAPI.DissolveGeometryByRing(InterGeo); List Rings2 = FeatureAPI.DissolveGeometryByRing(DiffGeo); if (Rings == null) Rings = new List(); if (Rings2 == null) Rings2 = new List(); if (Rings2.Count == 0) { f.Delete(); } else { IGeometry tempGeo = f.ShapeCopy; if (Rings2.Count > 0) tempGeo = Rings2[0]; ITopologicalOperator topo = tempGeo as ITopologicalOperator; IGeometry tempGeo2 = topo.Buffer(-0.00015); List gcList = FeatureAPI.Identify(tempGeo2, czcgxgcLayer); Marshal.ReleaseComObject(tempGeo2); double czcmj = 0; foreach (IFeature gcF in gcList) { if (!FeatureAPI.IsInterSect(tempGeo, gcF.ShapeCopy)) continue; czcmj += gcF.Value[idxGXGCBGMJ].ToDouble(2); gcF.Store(); } f.Value[idxGXCZCMJ] = czcmj.ToDouble(2); f.Shape = tempGeo; f.Store(); if (Rings2.Count > 0) Rings2.RemoveAt(0); } if (Rings2.Count > 0) Rings.AddRange(Rings2); foreach (var GeoRing in Rings) { string bsmPrefix = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + MaxBSM.Substring(6, 4); int MaxNum = Convert.ToInt32(MaxBSM.Substring(10)); MaxBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); IFeatureBuffer buff = czcgxLayer.FeatureClass.CreateFeatureBuffer(); buff.Value[idxGXBSM] = MaxBSM; buff.Value[idxGXCZCLX] = f.Value[idxGXCZCLX]; buff.Value[idxGXCZCDM] = f.Value[idxGXCZCDM]; buff.Value[idxGXCZCMC] = f.Value[idxGXCZCMC]; buff.Value[idxGXGXSJ] = time; buff.Shape = GeoRing; List gcList = FeatureAPI.Identify2(GeoRing, czcgxgcLayer); double czcmj = 0; foreach (IFeature gcF in gcList) { if (!FeatureAPI.IsInterSect(GeoRing, gcF.ShapeCopy)) continue; czcmj += gcF.Value[idxGXGCBGMJ].ToDouble(2); gcF.Value[idxGXGCBGHBSM] = MaxBSM; gcF.Store(); } buff.Value[idxGXCZCMJ] = czcmj.ToDouble(2); object addOid = insertCur.InsertFeature(buff); } } insertCur.Flush(); Marshal.ReleaseComObject(f); } cursor = czcgxLayer.FeatureClass.Search(null, true); f = null; List oids = new List(); while ((f = cursor.NextFeature()) != null) { List Rings = FeatureAPI.DissolveGeometryByRing(f.ShapeCopy); if (Rings == null) continue; if (Rings.Count == 1) continue; oids.Add(f.OID); } foreach (int oid in oids) { IFeature gxFeature = czcgxLayer.FeatureClass.GetFeature(oid); List Rings = FeatureAPI.DissolveGeometryByRing(gxFeature.ShapeCopy); if (Rings.Count > 1) { gxFeature.Shape = Rings[0]; { List gcList = FeatureAPI.Identify2(Rings[0], czcgxgcLayer); double czcmj = 0; foreach (IFeature gcF in gcList) { czcmj += gcF.Value[idxGXGCBGMJ].ToDouble(2); gcF.Store(); } gxFeature.Value[idxGXCZCMJ] = czcmj.ToDouble(2); } gxFeature.Store(); for (int i = 1; i < Rings.Count; i++) { if (Rings[i].IsEmpty) continue; string bsmPrefix = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + MaxBSM.Substring(6, 4); int MaxNum = Convert.ToInt32(MaxBSM.Substring(10)); MaxBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); IFeatureBuffer buff = czcgxLayer.FeatureClass.CreateFeatureBuffer(); buff.Value[idxGXBSM] = MaxBSM; buff.Value[idxGXCZCLX] = gxFeature.Value[idxGXCZCLX]; buff.Value[idxGXCZCDM] = gxFeature.Value[idxGXCZCDM]; buff.Value[idxGXCZCMC] = gxFeature.Value[idxGXCZCMC]; buff.Value[idxGXGXSJ] = time; buff.Shape = Rings[i]; List gcList = FeatureAPI.Identify2(Rings[i], czcgxgcLayer); double czcmj = 0; foreach (IFeature gcF in gcList) { czcmj += gcF.Value[idxGXGCBGMJ].ToDouble(2); gcF.Value[idxGXGCBGHBSM] = MaxBSM; gcF.Store(); } buff.Value[idxGXCZCMJ] = czcmj.ToDouble(2); insertCur.InsertFeature(buff); } } } insertCur.Flush(); if (IsDelMinMJ) { (czcgxLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL("Delete from CZCDYDGX where CZCMJ=0"); (czcgxgcLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL("Delete from CZCDYDGXGC where BGMJ=0"); } rdbHelper.ExecuteSQL(" drop table CZCDYDGXGC "); TableToTable(TempfeatureWorkspace, pOutWork, "CZCDYDGXGC"); rdbHelper.ExecuteSQL(" drop table CZCDYDGX "); TableToTable(TempfeatureWorkspace, pOutWork, "CZCDYDGX"); string sql = "select a.bsm aoid,b.objectid boid from czcdydgx a left join czcdydgxgc b on a.bsm=b.bghbsm where boid is null"; DataTable gxDT = rdbHelper.ExecuteDatatable("tempgx", sql, true); if (gxDT != null && gxDT.Rows.Count > 0) { foreach (DataRow dr in gxDT.Rows) { (czcgxLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL(string.Format("Delete from CZCDYDGX where bsm='{0}'", dr["AOID"])); } } rdbHelper.ExecuteSQL(" drop table CZCDYDGXGC "); TableToTable(TempfeatureWorkspace, pOutWork, "CZCDYDGXGC"); rdbHelper.ExecuteSQL(" drop table CZCDYDGX "); TableToTable(TempfeatureWorkspace, pOutWork, "CZCDYDGX"); sql = "select bgqbsm from czcdydgxgc where bgqbsm in (select bgqbsm from czcdydgxgc where bghbsm in (select bghbsm from czcdydgxgc group by bghbsm HAVING count(1)=1) and bgqbsm!='')group by bgqbsm HAVING count(1)=1"; gxgcDT = rdbHelper.ExecuteDatatable("tempgxgc", sql, true); string PrjCode = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE; sql = "select * from CZCDYDGXGC"; DataTable gxgcDTAll = rdbHelper.ExecuteDatatable("CZCDYDGXGC", sql, true); if (gxgcDT != null && gxgcDT.Rows.Count > 0) { foreach (DataRow dr in gxgcDT.Rows) { DataRow[] drs = gxgcDTAll.Select(string.Format("BGQBSM='{0}'", dr["BGQBSM"])); if (drs != null && drs.Length == 1) { if (drs[0]["BGQCZCLX"].ToTrim() == drs[0]["BGHCZCLX"].ToTrim() && drs[0]["BGQCZCDM"].ToTrim() == drs[0]["BGHCZCDM"].ToTrim() && drs[0]["BGQCZCMC"].ToTrim() == drs[0]["BGHCZCMC"].ToTrim()) { (czcgxLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL(string.Format("Delete from CZCDYDGX where bsm='{0}'", drs[0]["BGHBSM"])); (czcgxgcLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL(string.Format("Delete from CZCDYDGXGC where BGQBSM='{0}'", drs[0]["BGQBSM"])); } else { string bsm = dr["BGQBSM"].ToTrim(); if (!dr["BGQBSM"].ToTrim().StartsWith(PrjCode)) bsm = bsm.Replace(bsm.Substring(0, 6), PrjCode); (czcgxLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL(string.Format("Update CZCDYDGX set BSM='{0}' where bsm='{1}'", bsm, drs[0]["BGHBSM"])); (czcgxgcLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL(string.Format("Update CZCDYDGXGC set BGXW='1',BGHBSM='{0}' where BGQBSM='{1}' and BGHBSM='{2}'", bsm, dr["BGQBSM"], drs[0]["BGHBSM"])); } } } } } catch (Exception ex) { LogAPI.Debug("提取城镇村等用地数据异常:" + ex.Message); throw ex; } finally { if (LSczcdydFeatureclassAPI != null) LSczcdydFeatureclassAPI.CloseFeatureClass(); if (CZCDLTBFeatureClass != null) CZCDLTBFeatureClass.CloseFeatureClass(); if (pFeatureClass_4 != null) pFeatureClass_4.CloseFeatureClass(); if (pFeatureCursor != null) Marshal.ReleaseComObject(pFeatureCursor); if (pInsertCursor != null) Marshal.ReleaseComObject(pInsertCursor); if (czcdydFeatureClassAPI != null) czcdydFeatureClassAPI.CloseFeatureClass(); if (dltbFeatureClassAPI != null) dltbFeatureClassAPI.CloseFeatureClass(); if (Schemeworkspace != null) Schemeworkspace.CloseWorkspace(); if (Tempworkspace != null) Tempworkspace.CloseWorkspace(); if (pOutWorkFactory != null) Marshal.ReleaseComObject(pOutWorkFactory); if (outputWorkspaceFactory != null) Marshal.ReleaseComObject(outputWorkspaceFactory); } } private 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($"获取城镇村范围数据失败:{ex.Message}"); LogAPI.Debug(ex); } } private string GetMaxBSM(List fcList) { int xh = 0; string MaxBSM = ""; string leftStr = string.Empty; foreach (var fc in fcList) { 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; } if (BSM.Length != 18) continue; int xh2 = Convert.ToInt32(BSM.Substring(10)); leftStr = BSM.Substring(0, 10); if (xh < xh2) { xh = xh2; MaxBSM = BSM; } } return MaxBSM; } 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 ex) { LogAPI.Debug(ex + ":删除错误不处理"); } } private string GetTempPath() { string path = string.Empty; try { string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\城镇村用地变更临时数据"; if (!System.IO.Directory.Exists(gdbFolder)) { System.IO.Directory.CreateDirectory(gdbFolder); } try { DelectDir(gdbFolder);//能删除就删除 删除报错不处理 } catch { } string mdbFileName = Guid.NewGuid().ToString() + ".gdb"; path = System.IO.Path.Combine(gdbFolder, mdbFileName); var TempGDBPath = SysAppPath.GetTemplatePath() + "TempGDB.gdb";//模板 if (Directory.Exists(path)) { Directory.Delete(path, true); } Directory.CreateDirectory(path); CopyDirectInfo(TempGDBPath, path); return path; } catch (Exception ex) { LogAPI.Debug("提取城镇村等用地错误:" + ex.Message.ToString()); return path; } } private void CopyDirectInfo(string sourceDir, string toDir) { if (!Directory.Exists(sourceDir)) { throw new ApplicationException("未找到文件:" + sourceDir); } if (!Directory.Exists(toDir)) { Directory.CreateDirectory(toDir); } DirectoryInfo directInfo = new DirectoryInfo(sourceDir); FileInfo[] filesInfos = directInfo.GetFiles(); foreach (FileInfo fileinfo in filesInfos) { string fileName = fileinfo.Name; File.Copy(fileinfo.FullName, toDir + @"/" + fileName, true); } } /// /// 获取全国区县代码字典 /// /// public static List GetXZQDic() { List result = new List(); IRDBHelper rdbHelper = null; try { string systemPath = SysAppPath.GetDataBasePath() + "System.mdb"; if (System.IO.File.Exists(systemPath)) { string connStr = SysConfigsOprator.GetDBConnectionByName("MDBOledbConnection"); connStr = string.Format(connStr, systemPath); rdbHelper = RDBFactory.CreateDbHelper(connStr, DatabaseType.MSAccess); string strSQL = "select OBJECTID AS ID, XZQ AS CODE,XZQMC AS NAME from XZQ"; DataTable dt = rdbHelper.ExecuteDatatable("Dic", strSQL, true); if (dt != null) { result = TBToList.ToList(dt); foreach (var item in result) { item.DisplayName = item.CODE + "-" + item.NAME; } } } } catch (Exception ex) { LogAPI.Debug(ex); } finally { if (rdbHelper != null) { rdbHelper.DisConnect(); } } return result; } public IFeatureWorkspace GetGdbWorkspace(string pPathName) { try { IWorkspaceFactory factoryGdb = new FileGDBWorkspaceFactoryClass(); IWorkspace worckspace = factoryGdb.OpenFromFile(pPathName, 0); return worckspace as IFeatureWorkspace; } catch (Exception ex) { LogAPI.Debug(ex); return null; } } public bool TableToTable(IFeatureWorkspace pInWork, IWorkspace pOutWork, string tableName, IQueryFilter queryFilter = null) { try { if (pInWork == null || pOutWork == null || string.IsNullOrEmpty(tableName)) return false; IWorkspace2 workspace2 = pInWork as IWorkspace2; if (workspace2 != null) { if (!workspace2.get_NameExists(esriDatasetType.esriDTFeatureClass, tableName)) { return false; } } ITable pInTable = pInWork.OpenTable(tableName); if (pInTable == null) return false; IDataset pIndataset = (IDataset)pInTable; IDatasetName pInDatasetName = (IDatasetName)pIndataset.FullName; IEnumDataset enumDataset = pOutWork.get_Datasets(esriDatasetType.esriDTTable); IDataset dataset; enumDataset.Reset(); while ((dataset = enumDataset.Next()) != null) { string[] names = dataset.Name.Split('.'); if (string.Equals(names[names.Length - 1], tableName, StringComparison.CurrentCultureIgnoreCase)) { dataset.Delete(); break; } } IDataset pOutDataset = (IDataset)pOutWork; IDatasetName pOutDatasetName = new TableNameClass(); pOutDatasetName.WorkspaceName = (IWorkspaceName)pOutDataset.FullName; pOutDatasetName.Name = tableName; //Validate the field names because you are converting between different workspace types. IFieldChecker fieldChecker = new FieldCheckerClass(); IFields targetFeatureClassFields = pInTable.Fields; IFields sourceFeatureClassFields = pInTable.Fields; IEnumFieldError enumFieldError; // Most importantly set the input and validate workspaces! fieldChecker.InputWorkspace = pInWork as IWorkspace; fieldChecker.ValidateWorkspace = pOutWork; fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields); IFeatureDataConverter one2another = new FeatureDataConverterClass(); try { one2another.ConvertTable(pInDatasetName, queryFilter, pOutDatasetName, targetFeatureClassFields, "", 1000, 0); } finally { Marshal.ReleaseComObject(one2another); } return true; } catch (Exception ex) { LogAPI.Debug(ex); throw ex; } } } public class PCModel { public string BGQBSM { get; set; } public string BGHBSM { get; set; } public double BGHMJ { get; set; } public double KZMJ { get; set; } //public Dictionary GCData { get; set; } public List GCData { get; set; } public PCModel() { GCData = new List(); } public void PC() { //IOrderedEnumerable> GCData2 = GCData.OrderByDescending(e => e.Value); //GCData = new Dictionary(); //foreach (var item in GCData2) //{ // GCData.Add(item.Key, item.Value); //} GCData = GCData.OrderByDescending(o => o.MJ).ToList(); double zmj = GCData.Sum(s => s.MJ); double mjc = Math.Round(zmj - KZMJ, 2); if (Math.Round(mjc, 2) == 0) { return; } int num = 0; //平差 while (Math.Round(mjc, 2) != 0 && num < 10) { num++; int tpsm = (int)(Math.Abs(Math.Round(mjc, 2)) / 0.01); int e = tpsm / GCData.Count; int f = tpsm % GCData.Count; if (f != 0) { double tpmj = (e + 1) * 0.01; for (int j = 0; j < f; j++) { if (mjc < 0) GCData[j].MJ = GCData[j].MJ + tpmj; else if (GCData[j].MJ > 0.01) GCData[j].MJ = GCData[j].MJ - tpmj; } } if (e != 0) { double tpmj = e * 0.01; for (int j = f; j < GCData.Count; j++) { if (mjc < 0) GCData[j].MJ = GCData[j].MJ + tpmj; else if (GCData[j].MJ > 0.01) GCData[j].MJ = GCData[j].MJ - tpmj; } } zmj = GCData.Sum(s => s.MJ); mjc = Math.Round(zmj - KZMJ, 2); //mjc = Math.Round(shpList.Sum(s => s.MJ), 2) - pKZMJ; } } public void PC2() { //IOrderedEnumerable> GCData2 = GCData.OrderByDescending(e => e.Value); //GCData = new Dictionary(); //foreach (var item in GCData2) //{ // GCData.Add(item.Key, item.Value); //} GCData = GCData.OrderByDescending(o => o.MJ).ToList(); double zmj = GCData.Sum(s => s.MJ); double mjc = Math.Round(zmj - KZMJ, 2); if (Math.Round(mjc, 2) == 0 || (zmj == 0 && mjc < 0)) { return; } int num = 0; while (Math.Round(mjc, 2) != 0 && num < 10) { foreach (var item in GCData) { if (Math.Round(mjc, 2) == 0) break; if (mjc < 0) { if (item.MJ <= 0.01) continue; item.MJ = Math.Round(item.MJ + 0.01, 2); zmj = GCData.Sum(s => s.MJ); mjc = Math.Round(zmj - KZMJ, 2); } else { if (item.MJ <= 0.01) continue; item.MJ = Math.Round(item.MJ - 0.01, 2); zmj = GCData.Sum(s => s.MJ); mjc = Math.Round(zmj - KZMJ, 2); } } } ////平差 //while (Math.Round(mjc, 2) != 0 && num < 10) //{ // num++; // int tpsm = (int)(Math.Abs(Math.Round(mjc, 2)) / (double)0.01); // int e = tpsm / GCData.Count; // int f = tpsm % GCData.Count; // if (f != 0) // { // double tpmj = (e + 1) * 0.01; // for (int j = 0; j < f; j++) // { // if (mjc < 0) // GCData[j].MJ = GCData[j].MJ + tpmj; // else if (GCData[j].MJ > 0.01) // GCData[j].MJ = GCData[j].MJ - tpmj; // } // } // if (e != 0) // { // double tpmj = e * 0.01; // for (int j = f; j < GCData.Count; j++) // { // if (mjc < 0) // GCData[j].MJ = GCData[j].MJ + tpmj; // else if (GCData[j].MJ > 0.01) // GCData[j].MJ = GCData[j].MJ - tpmj; // } // } // zmj = GCData.Sum(s => s.MJ); // mjc = Math.Round(zmj - KZMJ, 2); // //mjc = Math.Round(shpList.Sum(s => s.MJ), 2) - pKZMJ; //} } } public class GCMJModel { public int OID { get; set; } public double MJ { get; set; } } }