using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; using KGIS.Framework.AE; using KGIS.Framework.AE.Enum; using KGIS.Framework.AE.GPHelper; using KGIS.Framework.ThreadManager; using KGIS.Framework.Utils; using Kingo.PluginServiceInterface; using Kingo.PluginServiceInterface.Model; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; namespace IDGForNDBG { public class GDDB_IDGHelper : BaseIDG { public string IDataChangeName { get => "XZQ_IDGHelper"; } private string TempGDBPath = string.Empty; private string TempDBPath = string.Empty; //IDGParameter IDGParm = null; public void Execute(IDGParameter pParm) { ThreadManager.Instance.QueueUserWorkItem(new System.Threading.WaitCallback(ExeGDDB), pParm, new System.Threading.WaitCallback(ComplateCallBack)); } public void ComplateCallBack(object obj) { Console.WriteLine($"Log:耕地等别数据提取完成。耗时:{GetTime(StartTime)}"); } DateTime StartTime = DateTime.Now; public void ExeGDDB(object obj) { StartTime = DateTime.Now; //IDGParameter Parm = obj as IDGParameter; Kingo.ThreadManager.TaskParameter taskParm = obj as Kingo.ThreadManager.TaskParameter; IDGParameter Parm = taskParm.Data as IDGParameter; //IFeatureLayer GDDBGXLayer = null; //IFeatureLayer JCGDDBLayer = JCGDDBLayer; //IFeatureLayer NMKLayer = null; IFeatureLayer featureLayer = null; IFeatureCursor sourCursor = null; IFeatureCursor gddbCursor = null; try { OpenDB(Parm); string TempDir = CreateTempDB("GDDB"); TempGDBPath = System.IO.Path.Combine(TempDir, "TempGDB.gdb"); TempDBPath = TempDir + @"\Temp" + ".sqlite"; //this.UpdateMsg("正在进行耕地等别数据提取,请稍候..."); //jcgddblayer = Parm.JC_GDDBLay as IFeatureLayer; Console.WriteLine("Log:正在进行耕地等别数据提取,请稍候..."); if (JcGddbLayer != null) { //GeoprocessorHelper gpHelper = new GeoprocessorHelper(); //string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\NMK"; //if (!System.IO.Directory.Exists(gdbFolder)) //{ // System.IO.Directory.CreateDirectory(gdbFolder); //} //try //{ DelectDir(gdbFolder); } //catch //{ } //string gdbFileName = Guid.NewGuid().ToString() + ".gdb"; //string path = System.IO.Path.Combine(gdbFolder, gdbFileName); //IWorkspaceFactory pFtWsFct = new FileGDBWorkspaceFactory(); //IWorkspaceName workspaceName = pFtWsFct.Create(gdbFolder, gdbFileName, null, 0); (GxGddbLayer.FeatureClass as ITable).DeleteSearchedRows(null);//删除耕地等别更新层所有数据 //空间联合赋值 GPParamClass gPParamClass = new GPParamClass(); IFeatureLayer TempNMKLayer = null; if (NmTbLayer == null) { Console.WriteLine("Log:正在进行耕地等别数据提取_数据准备..."); gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = JcTbLayer; gPParamClass.SecondFeatureLayer = GxTbLayer; gPParamClass.OutFeatureClassPath = Parm.PrjInfo.NMDatabase + "\\" + "DLTB_NMK";//要添加的要素类图层 gPParamClass.IsGetOutPutFeature = true; gPParamClass.GPType = EnumGPType.Erase; GPHelper.Instance.ExeGPForProces(gPParamClass, ref TempNMKLayer);//擦除/相减分析 } else TempNMKLayer = NmTbLayer; //GPParamClass gPParamClass = new GPParamClass(); gPParamClass = new GPParamClass(); //gPParamClass.FirstFeatureLayer = NmTbLayer; gPParamClass.FirstFeatureLayer = TempNMKLayer; gPParamClass.SecondFeatureLayer = JcGddbLayer; gPParamClass.OutFeatureClassPath = TempGDBPath + "\\" + "DLTB_GDDB"; gPParamClass.Match_option = "ARE_IDENTICAL_TO"; gPParamClass.IsGetOutPutFeature = true; gPParamClass.GPType = EnumGPType.SpatialJoin; gPParamClass.Join_type = "KEEP_ALL"; gPParamClass.JOIN_ONE_TO_ONE = true; GPHelper.Instance.ExeGPForProces(gPParamClass, ref featureLayer); if (featureLayer != null) { Console.WriteLine("Log:正在进行耕地等别数据提取_数据生成中..."); sourCursor = featureLayer.FeatureClass.Search(new QueryFilterClass() { WhereClause = " DLBM LIKE '01%'" }, true); IFeature f = null; gddbCursor = GxGddbLayer.FeatureClass.Insert(true); int gddbIdx = featureLayer.FeatureClass.FindField("GDDB"); int kcmjIdx = featureLayer.FeatureClass.FindField("KCMJ"); int tbmjIdx = featureLayer.FeatureClass.FindField("TBMJ"); DateTime dateTime = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); while ((f = sourCursor.NextFeature()) != null) { IFeatureBuffer buff = GxGddbLayer.FeatureClass.CreateFeatureBuffer(); buff.Shape = f.ShapeCopy; int sIndex = -1; for (int i = 0; i < buff.Fields.FieldCount; i++) { IField field = buff.Fields.Field[i]; if (field.Name.Contains(featureLayer.FeatureClass.ShapeFieldName) || !field.Editable) continue; sIndex = f.Fields.FindField(field.Name); if (field.Name.ToUpper() == "GXSJ") { buff.Value[i] = dateTime; } if (sIndex == -1) continue; else if (field.Name.ToUpper() == "KCDLMJ") { buff.Value[i] = f.Value[kcmjIdx]; } else if (field.Name.ToUpper() == "TBDLMJ") { buff.Value[i] = f.Value[tbmjIdx]; } else if (field.Name.ToUpper() == "LYD") { buff.Value[i] = f.Value[gddbIdx]; } else { string value = f.Value[sIndex].ToTrim(); if (string.IsNullOrWhiteSpace(value)) buff.Value[i] = DBNull.Value; else buff.Value[i] = f.Value[sIndex]; } } gddbCursor.InsertFeature(buff); if (buff != null) Marshal.ReleaseComObject(buff); } gddbCursor.Flush(); } Console.WriteLine($"Log:耕地等别数据提取完成。耗时:{GetTime(StartTime)}"); } else { Console.WriteLine($"Log:耕地等别数据获取失败。"); } } catch (Exception ex) { LogAPI.Debug("耕地等别数据提取错误:" + ex.Message.ToString()); LogAPI.Debug(ex); Console.WriteLine("Err:耕地等别数据提取错误:" + ex.Message.ToString()); //throw ex; } finally { if (sourCursor != null) Marshal.ReleaseComObject(sourCursor); if (gddbCursor != null) Marshal.ReleaseComObject(gddbCursor); } } public void OpenDB(IDGParameter parm) { try { LayerCfg layerInfo = null; if (parm.PrjInfo != null && !string.IsNullOrWhiteSpace(parm.PrjInfo.TempData)) { byte[] contentArray = Convert.FromBase64String(parm.PrjInfo.TempData); string LayerCfg = System.Text.Encoding.Default.GetString(contentArray); layerInfo = KGIS.Framework.Utils.SerializeAPI.DeserializeToObject(LayerCfg); } if (layerInfo == null) { throw new Exception("Err:获取图层信息失败!"); } //FileInfo fileInfo = new FileInfo(parm.PrjInfo.BGDatabase); string PathBgDB = parm.PrjInfo.BGDatabase;// Path.Combine(, "BGDB" + ".gdb"); string PathZLDB = parm.PrjInfo.ZLDatabase; string PathNMDB = parm.PrjInfo.NMDatabase;// System.IO.Path.Combine(fileInfo.DirectoryName, "NMDB" + ".gdb"); BgWsAPI = new WorkspaceAPI(PathBgDB, WorkspaceTypeEnum.GDBFile); if (BgWsAPI.CurrentWorkspace == null) { Console.WriteLine("打开变更数据库失败!"); return; } ZlWsAPI = new WorkspaceAPI(PathZLDB, WorkspaceTypeEnum.GDBFile); if (ZlWsAPI.CurrentWorkspace == null) { Console.WriteLine("打开增量数据库失败!"); return; } NmWsAPI = new WorkspaceAPI(PathNMDB, WorkspaceTypeEnum.GDBFile); LayerCfg JCLayerInfo = layerInfo.Layers.FirstOrDefault(f => f.LayerName == "年初数据"); if (JCLayerInfo == null) { throw new Exception("Err:获取年初数据库失败!"); } List NcList = JCLayerInfo.GetAllItem(); //if (parm.ExeDLTB) //{ LayerCfg _JcTBLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "地类图斑"); _jcTbLayer = OpenLayer(_JcTBLayerInfo); if (_jcTbLayer == null) { throw new Exception("Err:获取年初地类图斑数据失败!"); } //} LayerCfg _JcGddbLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "耕地等别"); _jcGddbLayer = OpenLayer(_JcGddbLayerInfo); if (_JcGddbLayerInfo == null) throw new Exception("Err:获取年初耕地等别数据失败!"); if (_nmTbLayer == null) _nmTbLayer = OpenLayer(NmWsAPI, "DLTB_NMK"); _gxGddbLayer = OpenLayer(ZlWsAPI, "GDDBGX"); _gxTbLayer = OpenLayer(ZlWsAPI, "DLTBGX"); } catch (Exception ex) { throw ex; } } #region DelectDir 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 + ":删除错误不处理"); } } #endregion } }