using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geoprocessing; using ESRI.ArcGIS.Geoprocessor; //using IDEParameter; using KGIS.Framework.AE; using KGIS.Framework.AE.Enum; using KGIS.Framework.AE.GPHelper; using KGIS.Framework.Utils; using Kingo.PluginServiceInterface; //using KGIS.Framework.AE.GPHelper; using Kingo.PluginServiceInterface.Model; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace IDGForNDBG { public class BaseIDG { //private IFeatureLayer jCLayer; //private IFeatureLayer gXLayer; internal IFeatureLayer _jcTbLayer; internal IFeatureLayer _gxgcTBLayer; internal IFeatureLayer _gxTbLayer; internal IFeatureLayer _bgTbLayer; internal IFeatureLayer _jcCjdcqLayer; internal IFeatureLayer _jcCjdcqJxLayer; internal IFeatureLayer _gxCjdcqLayer; internal IFeatureLayer _gxgcCjdcqLayer; internal IFeatureLayer _gxCjdcqJxLayer; internal IFeatureLayer _jcXzqLayer; internal IFeatureLayer _jcXzqJxLayer; internal IFeatureLayer _gxXzqLayer; internal IFeatureLayer _gxgcXzqLayer; internal IFeatureLayer _gxXzqJxLayer; internal IFeatureLayer _jcCzcLayer; internal IFeatureLayer _gxCzcLayer; internal IFeatureLayer _gxgcCzcLayer; internal IFeatureLayer _jcGddbLayer; internal IFeatureLayer _gxGddbLayer; internal IFeatureLayer _jcPdtLayer; internal IFeatureLayer _gxPdtLayer; internal IFeatureLayer _nmTbLayer; public IWorkspaceAPI BgWsAPI { get; set; } public Dictionary DicWsAPI { get; set; } public IWorkspaceAPI ZlWsAPI { get; set; } public IWorkspaceAPI NmWsAPI { get; set; } //public IFeatureLayer JCLayer { get => jCLayer; set => jCLayer = value; } //public IFeatureLayer GXLayer { get => gXLayer; set => gXLayer = value; } public IFeatureLayer NmTbLayer { get => _nmTbLayer; set => _nmTbLayer = value; } #region 地类图斑 public IFeatureLayer JcTbLayer { get => _jcTbLayer; } public IFeatureLayer JcPdtLayer { get => _jcPdtLayer; } public IFeatureLayer GxgcTBLayer { get => _gxgcTBLayer; } public IFeatureLayer GxTbLayer { get => _gxTbLayer; } public IFeatureLayer GxPdtLayer { get => _gxPdtLayer; } public IFeatureLayer BgTbLayer { get => _bgTbLayer; } #endregion #region 村级调查区 public IFeatureLayer JcCjdcqLayer { get => _jcCjdcqLayer; set => _jcCjdcqLayer = value; } public IFeatureLayer JcCjdcqJxLayer { get => _jcCjdcqJxLayer; } public IFeatureLayer GxCjdcqLayer { get => _gxCjdcqLayer; } public IFeatureLayer GxgcCjdcqLayer { get => _gxgcCjdcqLayer; } public IFeatureLayer GxCjdcqJxLayer { get => _gxCjdcqJxLayer; } #endregion #region 行政区 public IFeatureLayer JcXzqLayer { get => _jcXzqLayer; set => _jcXzqLayer = value; } public IFeatureLayer JcXzqJxLayer { get => _jcXzqJxLayer; } public IFeatureLayer GxXzqLayer { get => _gxXzqLayer; } public IFeatureLayer GxgcXzqLayer { get => _gxgcXzqLayer; } public IFeatureLayer GxXzqJxLayer { get => _gxXzqJxLayer; } #endregion #region 城镇村 public IFeatureLayer JcCzcLayer { get => _jcCzcLayer; } public IFeatureLayer GxCzcLayer { get => _gxCzcLayer; } public IFeatureLayer GxgcCzcLayer { get => _gxgcCzcLayer; } #endregion #region 耕地等别 public IFeatureLayer JcGddbLayer { get => _jcGddbLayer; } public IFeatureLayer GxGddbLayer { get => _gxGddbLayer; } #endregion public virtual void CreateNMK2(IDGParameter parm) { try { //GeoprocessorHelper gpHelper = new GeoprocessorHelper(); //string path = Path.Combine(parm.PrjInfo.ProjDir, "NMDB" + ".gdb"); //FileInfo fileInfo = new FileInfo(parm.PrjInfo.BGDatabase); //string path = Path.Combine(fileInfo.DirectoryName, "NMDB" + ".gdb"); //if (JcTbLayer == null || GxTbLayer == null) // OpenDB(parm); IFeatureLayer TempNMKLayer = null; GPParamClass gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = JcTbLayer;//基础地类图斑要素类 gPParamClass.SecondFeatureLayer = GxTbLayer;//地类图斑更新要素类 gPParamClass.OutFeatureClassPath = parm.PrjInfo.NMDatabase + "\\" + "DLTB_NMK";//要添加的要素类图层 gPParamClass.IsGetOutPutFeature = true;//是否获取GP工具生成后的图层 gPParamClass.GPType = EnumGPType.Erase; GPHelper.Instance.ExeGPForProces(gPParamClass, ref TempNMKLayer);//擦除/相减分析 IFeatureClassAPI fcAPI = new FeatureClassAPI(TempNMKLayer.FeatureClass); fcAPI.AddField("XZQDM", esriFieldType.esriFieldTypeString, "行政区代码"); fcAPI.AddField("XZQTZLX", esriFieldType.esriFieldTypeInteger, "行政区调整类型"); //fcAPI.FcToFc(NMKLayer.FeatureClass, null, false); fcAPI = new FeatureClassAPI(GxTbLayer.FeatureClass); fcAPI.FcToFc(TempNMKLayer.FeatureClass, null, false); ITable nmkTable = TempNMKLayer.FeatureClass as ITable; //更新后年末库 ICursor nmkCur = nmkTable.Update(null, true); IRow nmkRow = null; int bsmIdx = nmkTable.FindField("BSM"); int zldwIdx = nmkTable.FindField("ZLDWDM"); int xzqdmIdx = nmkTable.FindField("XZQDM"); int XZQTZLXmIdx = nmkTable.FindField("XZQTZLX"); int HDMCIdx = nmkTable.FindField("HDMC"); while ((nmkRow = nmkCur.NextRow()) != null) { //string bsm = nmkRow.Value[bsmIdx].ToTrim(); //if (hcbghbsm.Contains(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 2; //} //else if (msbghbsm.Contains(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 4; //} //else if (msbgqbsm.Contains(bsm) && !bghbsmDic.ContainsKey(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 4; //} //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] = msbghbsm.Contains(bsm) ? "" : dr[bghField]; // } // else if (field.Type == esriFieldType.esriFieldTypeDouble) // { // nmkRow.Value[i] = msbghbsm.Contains(bsm) ? 0 : dr[bghField].ToDouble(); // } // } // } //} if (zldwIdx != -1 && xzqdmIdx != -1) { string zldwdm = nmkRow.Value[zldwIdx].ToTrim(); if (!string.IsNullOrWhiteSpace(zldwdm) && zldwdm.Length > 9) { nmkRow.Value[xzqdmIdx] = zldwdm.Substring(0, 9); } } if (HDMCIdx != -1) nmkRow.Value[HDMCIdx] = nmkRow.Value[HDMCIdx].ToString().ToTrim() == "" ? "" : nmkRow.Value[HDMCIdx].ToString().ToTrim(); nmkCur.UpdateRow(nmkRow); } nmkCur.Flush(); nmkTable.DeleteSearchedRows(new QueryFilterClass() { WhereClause = "XZQTZLX=4 or XZQTZLX=2" }); _nmTbLayer = TempNMKLayer; } catch (Exception ex) { throw ex; } } public void SetJcCzcLayer(IFeatureLayer pLayer) { _jcCzcLayer = pLayer; } public virtual void CreateNMK(IDGParameter parm) { IFeatureCursor _cursor = null; try { //GeoprocessorHelper gpHelper = new GeoprocessorHelper(); //string path = Path.Combine(parm.PrjInfo.ProjDir, "NMDB" + ".gdb"); //FileInfo fileInfo = new FileInfo(parm.PrjInfo.BGDatabase); //string path = Path.Combine(fileInfo.DirectoryName, "NMDB" + ".gdb"); //if (JcTbLayer == null || GxTbLayer == null) // OpenDB(parm); IFeatureLayer TempNMKLayer = null; GPParamClass gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = JcTbLayer;//基础地类图斑要素类 //gPParamClass.SecondFeatureLayer = GxTbLayer;//地类图斑更新要素类 gPParamClass.OutFeatureClassPath = parm.PrjInfo.NMDatabase;// + "\\" + "DLTB_NMK";//要添加的要素类图层 gPParamClass.IsGetOutPutFeature = true;//是否获取GP工具生成后的图层 gPParamClass.GPType = EnumGPType.FcToFc; gPParamClass.FcName = "DLTB_NMK"; GPHelper.Instance.ExeGPForProces(gPParamClass, ref TempNMKLayer);//擦除/相减分析 _cursor = GxgcTBLayer.FeatureClass.Search(new QueryFilterClass() { SubFields = "BGQTBBSM" }, true); Dictionary DicJcBSMs = new Dictionary(); IFeature f = null; int idx = GxgcTBLayer.FeatureClass.FindField("BGQTBBSM"); if (idx == -1) return; while ((f = _cursor.NextFeature()) != null) { string jcbsm = f.Value[idx].ToTrim(); if (!DicJcBSMs.ContainsKey(jcbsm)) DicJcBSMs.Add(jcbsm, 0); } _cursor = TempNMKLayer.FeatureClass.Update(null, true); idx = TempNMKLayer.FeatureClass.FindField("BSM"); if (idx == -1) return; while ((f = _cursor.NextFeature()) != null) { string bsm = f.Value[idx].ToTrim(); if (DicJcBSMs.ContainsKey(bsm)) { f.Value[idx] = "-1"; _cursor.UpdateFeature(f); } } _cursor.Flush(); (TempNMKLayer.FeatureClass as ITable).DeleteSearchedRows(new QueryFilterClass() { WhereClause = "BSM = '-1'" }); IFeatureClassAPI fcAPI = new FeatureClassAPI(GxTbLayer.FeatureClass); fcAPI.FcToFc(TempNMKLayer.FeatureClass, null, false); fcAPI = new FeatureClassAPI(TempNMKLayer.FeatureClass); fcAPI.AddField("XZQDM", esriFieldType.esriFieldTypeString, "行政区代码"); fcAPI.AddField("XZQTZLX", esriFieldType.esriFieldTypeInteger, "行政区调整类型"); ////fcAPI.FcToFc(NMKLayer.FeatureClass, null, false); //fcAPI = new FeatureClassAPI(GxTbLayer.FeatureClass); //fcAPI.FcToFc(TempNMKLayer.FeatureClass, null, false); ITable nmkTable = TempNMKLayer.FeatureClass as ITable; //更新后年末库 ICursor nmkCur = nmkTable.Update(null, true); IRow nmkRow = null; int bsmIdx = nmkTable.FindField("BSM"); int zldwIdx = nmkTable.FindField("ZLDWDM"); int xzqdmIdx = nmkTable.FindField("XZQDM"); int XZQTZLXmIdx = nmkTable.FindField("XZQTZLX"); int HDMCIdx = nmkTable.FindField("HDMC"); while ((nmkRow = nmkCur.NextRow()) != null) { //string bsm = nmkRow.Value[bsmIdx].ToTrim(); //if (hcbghbsm.Contains(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 2; //} //else if (msbghbsm.Contains(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 4; //} //else if (msbgqbsm.Contains(bsm) && !bghbsmDic.ContainsKey(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 4; //} //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] = msbghbsm.Contains(bsm) ? "" : dr[bghField]; // } // else if (field.Type == esriFieldType.esriFieldTypeDouble) // { // nmkRow.Value[i] = msbghbsm.Contains(bsm) ? 0 : dr[bghField].ToDouble(); // } // } // } //} if (zldwIdx != -1 && xzqdmIdx != -1) { string zldwdm = nmkRow.Value[zldwIdx].ToTrim(); if (!string.IsNullOrWhiteSpace(zldwdm) && zldwdm.Length > 9) { nmkRow.Value[xzqdmIdx] = zldwdm.Substring(0, 9); } } if (HDMCIdx != -1) nmkRow.Value[HDMCIdx] = nmkRow.Value[HDMCIdx].ToString().ToTrim() == "" ? "" : nmkRow.Value[HDMCIdx].ToString().ToTrim(); nmkCur.UpdateRow(nmkRow); } nmkCur.Flush(); //nmkTable.DeleteSearchedRows(new QueryFilterClass() { WhereClause = "XZQTZLX=4 or XZQTZLX=2" }); _nmTbLayer = TempNMKLayer; } catch (Exception ex) { throw ex; } } /// /// 生成年末库图层-GP创建年末库图层 /// /// public virtual void CreateNMK3(DBLayerSourceHelper pLayerSource) { IFeatureCursor _cursor = null; try { //GeoprocessorHelper gpHelper = new GeoprocessorHelper(); //string path = Path.Combine(parm.PrjInfo.ProjDir, "NMDB" + ".gdb"); //FileInfo fileInfo = new FileInfo(parm.PrjInfo.BGDatabase); //string path = Path.Combine(fileInfo.DirectoryName, "NMDB" + ".gdb"); //if (JcTbLayer == null || GxTbLayer == null) // OpenDB(parm); IFeatureLayer TempNMKLayer = null; GPParamClass gPParamClass = new GPParamClass(); gPParamClass.FirstFeatureLayer = pLayerSource.JcTbLayer;//基础地类图斑要素类 //gPParamClass.SecondFeatureLayer = GxTbLayer;//地类图斑更新要素类 gPParamClass.OutFeatureClassPath = pLayerSource.NmWsAPI.CurrentWorkspace.PathName;// + "\\" + "DLTB_NMK";//要添加的要素类图层 gPParamClass.IsGetOutPutFeature = true;//是否获取GP工具生成后的图层 gPParamClass.GPType = EnumGPType.FcToFc; gPParamClass.FcName = "DLTB_NMK"; GPHelper.Instance.ExeGPForProces(gPParamClass, ref TempNMKLayer);//擦除/相减分析 _cursor = pLayerSource.GxgcTBLayer.FeatureClass.Search(new QueryFilterClass() { SubFields = "BGQTBBSM" }, true); Dictionary DicJcBSMs = new Dictionary(); IFeature f = null; int idx = pLayerSource.GxgcTBLayer.FeatureClass.FindField("BGQTBBSM"); if (idx == -1) return; while ((f = _cursor.NextFeature()) != null) { string jcbsm = f.Value[idx].ToTrim(); if (!DicJcBSMs.ContainsKey(jcbsm)) DicJcBSMs.Add(jcbsm, 0); } _cursor = TempNMKLayer.FeatureClass.Update(null, true); idx = TempNMKLayer.FeatureClass.FindField("BSM"); if (idx == -1) return; while ((f = _cursor.NextFeature()) != null) { string bsm = f.Value[idx].ToTrim(); if (DicJcBSMs.ContainsKey(bsm)) { f.Value[idx] = "-1"; _cursor.UpdateFeature(f); } } _cursor.Flush(); (TempNMKLayer.FeatureClass as ITable).DeleteSearchedRows(new QueryFilterClass() { WhereClause = "BSM = '-1'" }); IFeatureClassAPI fcAPI = new FeatureClassAPI(pLayerSource.GxTbLayer.FeatureClass); fcAPI.FcToFc(TempNMKLayer.FeatureClass, null, false); fcAPI = new FeatureClassAPI(TempNMKLayer.FeatureClass); fcAPI.AddField("XZQDM", esriFieldType.esriFieldTypeString, "行政区代码"); fcAPI.AddField("XZQTZLX", esriFieldType.esriFieldTypeInteger, "行政区调整类型"); ////fcAPI.FcToFc(NMKLayer.FeatureClass, null, false); //fcAPI = new FeatureClassAPI(pLayerSource.GxTbLayer.FeatureClass); //fcAPI.FcToFc(TempNMKLayer.FeatureClass, null, false); ITable nmkTable = TempNMKLayer.FeatureClass as ITable; //更新后年末库 ICursor nmkCur = nmkTable.Update(null, true); IRow nmkRow = null; int bsmIdx = nmkTable.FindField("BSM"); int zldwIdx = nmkTable.FindField("ZLDWDM"); int xzqdmIdx = nmkTable.FindField("XZQDM"); int XZQTZLXmIdx = nmkTable.FindField("XZQTZLX"); int HDMCIdx = nmkTable.FindField("HDMC"); while ((nmkRow = nmkCur.NextRow()) != null) { //string bsm = nmkRow.Value[bsmIdx].ToTrim(); //if (hcbghbsm.Contains(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 2; //} //else if (msbghbsm.Contains(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 4; //} //else if (msbgqbsm.Contains(bsm) && !bghbsmDic.ContainsKey(bsm)) //{ // nmkRow.Value[XZQTZLXmIdx] = 4; //} //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] = msbghbsm.Contains(bsm) ? "" : dr[bghField]; // } // else if (field.Type == esriFieldType.esriFieldTypeDouble) // { // nmkRow.Value[i] = msbghbsm.Contains(bsm) ? 0 : dr[bghField].ToDouble(); // } // } // } //} if (zldwIdx != -1 && xzqdmIdx != -1) { string zldwdm = nmkRow.Value[zldwIdx].ToTrim(); if (!string.IsNullOrWhiteSpace(zldwdm) && zldwdm.Length > 9) { nmkRow.Value[xzqdmIdx] = zldwdm.Substring(0, 9); } } if (HDMCIdx != -1) nmkRow.Value[HDMCIdx] = nmkRow.Value[HDMCIdx].ToString().ToTrim() == "" ? "" : nmkRow.Value[HDMCIdx].ToString().ToTrim(); nmkCur.UpdateRow(nmkRow); } nmkCur.Flush(); //nmkTable.DeleteSearchedRows(new QueryFilterClass() { WhereClause = "XZQTZLX=4 or XZQTZLX=2" }); _nmTbLayer = TempNMKLayer; } catch (Exception ex) { throw ex; } } /// /// 生成年末库数据(BUG:新增 年末库 图层) /// /// public virtual void CreateNMK(DBLayerSourceHelper pLayerSource) { IFeatureCursor _cursor = null; try { (pLayerSource.NmTbLayer.FeatureClass as ITable).DeleteSearchedRows(null); IFeatureClassAPI featureClassAPI = new FeatureClassAPI(pLayerSource.JcTbLayer.FeatureClass); featureClassAPI.FcToFc(pLayerSource.NmTbLayer.FeatureClass, null, false); _cursor = pLayerSource.GxgcTBLayer.FeatureClass.Search(new QueryFilterClass() { SubFields = "BGQTBBSM" }, true); Dictionary DicJcBSMs = new Dictionary(); IFeature f = null; int idx = pLayerSource.GxgcTBLayer.FeatureClass.FindField("BGQTBBSM"); if (idx == -1) return; while ((f = _cursor.NextFeature()) != null) { string jcbsm = f.Value[idx].ToTrim(); if (!DicJcBSMs.ContainsKey(jcbsm)) DicJcBSMs.Add(jcbsm, 0); } _cursor = pLayerSource.NmTbLayer.FeatureClass.Update(null, true); idx = pLayerSource.NmTbLayer.FeatureClass.FindField("BSM"); if (idx == -1) return; while ((f = _cursor.NextFeature()) != null) { string bsm = f.Value[idx].ToTrim(); if (DicJcBSMs.ContainsKey(bsm)) { f.Value[idx] = "-1"; _cursor.UpdateFeature(f); } } _cursor.Flush(); (pLayerSource.NmTbLayer.FeatureClass as ITable).DeleteSearchedRows(new QueryFilterClass() { WhereClause = "BSM = '-1'" }); IFeatureClassAPI fcAPI = new FeatureClassAPI(pLayerSource.GxTbLayer.FeatureClass); fcAPI.FcToFc(pLayerSource.NmTbLayer.FeatureClass, null, false); ITable nmkTable = pLayerSource.NmTbLayer.FeatureClass as ITable; //更新后年末库 ICursor nmkCur = nmkTable.Update(null, true); IRow nmkRow = null; int bsmIdx = nmkTable.FindField("BSM"); int zldwIdx = nmkTable.FindField("ZLDWDM"); int xzqdmIdx = nmkTable.FindField("XZQDM"); int XZQTZLXmIdx = nmkTable.FindField("XZQTZLX"); int HDMCIdx = nmkTable.FindField("HDMC"); while ((nmkRow = nmkCur.NextRow()) != null) { if (zldwIdx != -1 && xzqdmIdx != -1) { string zldwdm = nmkRow.Value[zldwIdx].ToTrim(); if (!string.IsNullOrWhiteSpace(zldwdm) && zldwdm.Length > 9) { nmkRow.Value[xzqdmIdx] = zldwdm.Substring(0, 9); } } if (HDMCIdx != -1) nmkRow.Value[HDMCIdx] = nmkRow.Value[HDMCIdx].ToString().ToTrim() == "" ? "" : nmkRow.Value[HDMCIdx].ToString().ToTrim(); nmkCur.UpdateRow(nmkRow); } nmkCur.Flush(); _nmTbLayer = pLayerSource.NmTbLayer; } catch (Exception ex) { Console.WriteLine("Err:地类图斑数据提取-生成年末库数据异常!" + ex.Message); Console.WriteLine("Err:地类图斑数据提取-生成年末库数据异常!" + ex.StackTrace); throw ex; } } //public virtual void OpenDB(IDGParameter3 parm) //{ // IFeatureClassAPI BgTBFcAPI = null; // IFeatureClassAPI JcTBFcAPI = null; // IFeatureClassAPI GxTBFcAPI = null; // IFeatureClassAPI GxGcTBFcAPI = null; // GPParamClass paramClass = null;// new GPParamClass(); // //GeoprocessorHelper gpHelper = new GeoprocessorHelper(); // try // { // BgWsAPI = new WorkspaceAPI(parm.BgDbPath, WorkspaceTypeEnum.GDBFile); // if (BgWsAPI.CurrentWorkspace == null) // { // Console.WriteLine("打开变更数据库失败!"); // return; // } // JcWsAPI = new WorkspaceAPI(parm.JcDbPath, WorkspaceTypeEnum.GDBFile); // if (JcWsAPI.CurrentWorkspace == null) // { // Console.WriteLine("打开基础数据库失败!"); // return; // } // ZlWsAPI = new WorkspaceAPI(parm.ZLDbPath, WorkspaceTypeEnum.GDBFile); // if (ZlWsAPI.CurrentWorkspace == null) // { // Console.WriteLine("打开增量数据库失败!"); // return; // } // NmWsAPI = new WorkspaceAPI(parm.NmDbPath, WorkspaceTypeEnum.GDBFile); // BgTBFcAPI = BgWsAPI.OpenFeatureClass("DLTBBG"); // JcTBFcAPI = JcWsAPI.OpenFeatureClass("DLTB"); // GxTBFcAPI = ZlWsAPI.OpenFeatureClass("DLTBGX"); // GxGcTBFcAPI = ZlWsAPI.OpenFeatureClass("DLTBGXGC"); // if (JcTBFcAPI.FeatureClass != null) // { // //paramClass = new GPParamClass(); // //paramClass.FirstFeatureClass = JcTBFcAPI.FeatureClass; // //paramClass.OutFeatureClassPath = "DLTB"; // //paramClass.IsGetOutPutFeature = true; // //gpHelper.MakeFeatureLayer(paramClass, ref jCLayer); // jCLayer = new FeatureLayerClass(); // jCLayer.FeatureClass = JcTBFcAPI.FeatureClass; // jCLayer.Name = JcTBFcAPI.FeatureClass.AliasName; // } // if (GxTBFcAPI.FeatureClass != null) // { // //paramClass = new GPParamClass(); // //paramClass.FirstFeatureClass = GxTBFcAPI.FeatureClass; // //paramClass.OutFeatureClassPath = "DLTBGX"; // //paramClass.IsGetOutPutFeature = true; // //gpHelper.MakeFeatureLayer(paramClass, ref gXLayer); // gXLayer = new FeatureLayerClass(); // gXLayer.FeatureClass = GxTBFcAPI.FeatureClass; // gXLayer.Name = GxTBFcAPI.FeatureClass.AliasName; // } // } // catch (Exception ex) // { // throw ex; // } //} //public virtual 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 = 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 = 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 _JcPdtLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "坡度图"); // _jcPdtLayer = OpenLayer(_JcPdtLayerInfo); // if (_jcPdtLayer == null) // { // throw new Exception("Err:获取年初坡度图数据失败!"); // } // _bgTbLayer = OpenLayer(BgWsAPI, "DLTBBG"); // _gxTbLayer = OpenLayer(ZlWsAPI, "DLTBGX"); // _gxgcTBLayer = OpenLayer(ZlWsAPI, "DLTBGXGC"); // _gxPdtLayer = OpenLayer(ZlWsAPI, "PDTGX"); // } // if (parm.ExeCJDCQ) // { // LayerCfg _JcCjdcqLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "村级调查区"); // _jcCjdcqLayer = OpenLayer(_JcCjdcqLayerInfo); // if (_jcCjdcqLayer == null) // throw new Exception("Err:获取年初村级调查区数据失败!"); // LayerCfg _JcCjdcqJxLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "村级调查区界线"); // _jcCjdcqJxLayer = OpenLayer(_JcCjdcqJxLayerInfo); // if (_JcCjdcqJxLayerInfo == null) // throw new Exception("Err:获取年初村级调查区界线数据失败!"); // _gxCjdcqLayer = OpenLayer(ZlWsAPI, "CJDCQGX"); // _gxgcCjdcqLayer = OpenLayer(ZlWsAPI, "CJDCQGXGC"); // _gxCjdcqJxLayer = OpenLayer(ZlWsAPI, "CJDCQJXGX"); // _gxgcTBLayer = OpenLayer(ZlWsAPI, "DLTBGXGC"); // } // if (parm.ExeXZQ) // { // LayerCfg _JcXzqLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "行政区"); // _jcXzqLayer = OpenLayer(_JcXzqLayerInfo); // if (_JcXzqLayerInfo == null) // throw new Exception("Err:获取年初行政区数据失败!"); // LayerCfg _JcXzqJxLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "行政区界线"); // _jcXzqJxLayer = OpenLayer(_JcXzqJxLayerInfo); // if (_JcXzqJxLayerInfo == null) // throw new Exception("Err:获取年初行政区界线数据失败!"); // _gxXzqLayer = OpenLayer(ZlWsAPI, "XZQGX"); // _gxgcXzqLayer = OpenLayer(ZlWsAPI, "XZQGXGC"); // _gxXzqJxLayer = OpenLayer(ZlWsAPI, "XZQJXGX"); // _gxgcTBLayer = OpenLayer(ZlWsAPI, "DLTBGXGC"); // //if (_nmTbLayer != null) // // _nmTbLayer = OpenLayer(NmWsAPI, "DLTB_NMK"); // } // if (parm.ExeCZC) // { // LayerCfg _JcCzcLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "城镇村等用地"); // _jcCzcLayer = OpenLayer(_JcCzcLayerInfo); // if (_JcCzcLayerInfo == null) // throw new Exception("Err:获取年初城镇村等用地数据失败!"); // //if (_nmTbLayer != null) // // _nmTbLayer = OpenLayer(NmWsAPI, "DLTB_NMK"); // _gxCzcLayer = OpenLayer(ZlWsAPI, "CZCDYDGX"); // _gxgcCzcLayer = OpenLayer(ZlWsAPI, "CZCDYDGXGC"); // } // if (parm.ExeGDDB) // { // 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"); // } // } // catch (Exception ex) // { // throw ex; // } //} internal IFeatureLayer OpenLayer(LayerCfg pLayerInfo) { if (pLayerInfo == null) return null; if (string.IsNullOrWhiteSpace(pLayerInfo.FcPath) || string.IsNullOrWhiteSpace(pLayerInfo.FcName)) return null; if (!File.Exists(pLayerInfo.FcPath) && !Directory.Exists(pLayerInfo.FcPath)) return null; FileInfo fInfo = new FileInfo(pLayerInfo.FcPath); WorkspaceTypeEnum wsType = WorkspaceTypeEnum.GDBFile; if (fInfo.FullName.EndsWith(".gdb")) wsType = WorkspaceTypeEnum.GDBFile; else if (fInfo.FullName.EndsWith(".mdb")) wsType = WorkspaceTypeEnum.MDBFile; else wsType = WorkspaceTypeEnum.ShapeFile; if (DicWsAPI == null) DicWsAPI = new Dictionary(); if (!DicWsAPI.ContainsKey(fInfo.FullName)) { IWorkspaceAPI wsAPI = new WorkspaceAPI(fInfo.FullName, wsType); DicWsAPI.Add(fInfo.FullName, wsAPI); } IFeatureClassAPI fcAPI = DicWsAPI[fInfo.FullName].OpenFeatureClass(pLayerInfo.FcName); return new FeatureLayerClass() { FeatureClass = fcAPI.FeatureClass, Name = fcAPI.FeatureClass.AliasName }; } internal IFeatureLayer OpenLayer(IWorkspaceAPI pWsAPI, string pLayerName) { try { if (string.IsNullOrWhiteSpace(pLayerName)) return null; if (pWsAPI != null && pWsAPI.CurrentWorkspace != null) { IFeatureClassAPI fcAPI = pWsAPI.OpenFeatureClass(pLayerName); return new FeatureLayerClass() { FeatureClass = fcAPI.FeatureClass, Name = fcAPI.FeatureClass.AliasName }; } return null; } catch (Exception ex) { Console.WriteLine(string.Format("Err:{0}图层获取失败", pLayerName)); return null; } } public virtual string CreateTempDB(string pType, string pSubType = "") { string result = string.Empty; try { string dbPath = SysAppPath.GetCurrentAppPath() + "Template\\Temp.db"; string gdbFolder = pType; if (!Directory.Exists(gdbFolder)) Directory.CreateDirectory(gdbFolder); try { DelectDirect(gdbFolder); } catch { //删除临时数据异常 不做处理 } IWorkspaceFactory pFtWsFct = new FileGDBWorkspaceFactory(); string gdbFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");// Guid.NewGuid().ToString().Replace("-", ""); string path = System.IO.Path.Combine(gdbFolder, string.IsNullOrWhiteSpace(pSubType) ? gdbFileName : pSubType); pFtWsFct.Create(path, "TempGDB", null, 0); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } if (File.Exists(dbPath)) { File.Copy(dbPath, Path.Combine(path, "Temp.sqlite")); } else { Console.WriteLine(string.Format("文件{0}不存在!", dbPath)); } result = path;// System.IO.Path.Combine(path, "TempGDB.gdb");//临时数据存放路径 } catch (Exception ex) { Console.WriteLine("创建临时数据库失败!" + ex.Message); throw ex; } return result; } public virtual void DelectDirect(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 e) { throw; } } public bool DirectoryCopy(string sourceDir, string targetDirPath) { try { if (!Directory.Exists(sourceDir)) return false; string targetDir = targetDirPath + "\\" + System.IO.Path.GetFileName(sourceDir); if (!Directory.Exists(targetDir)) Directory.CreateDirectory(targetDir); // 文件及文件夹名称数组 string[] dirColl = Directory.GetDirectories(sourceDir); string[] fileColl = Directory.GetFiles(sourceDir); // 便利所有文件 if (fileColl.Length > 0) { string fileName; foreach (string fileDir in fileColl) { fileName = System.IO.Path.GetFileName(fileDir); File.Copy(sourceDir + "\\" + fileName, targetDir + "\\" + fileName, true); } } // 遍历所有文件夹 if (dirColl.Length > 0) { string folderName; foreach (string dir in dirColl) { folderName = System.IO.Path.GetFileName(dir); // 递归调用 Directory.CreateDirectory(targetDir + "\\" + folderName); DirectoryCopy(dir, targetDir + "\\" + folderName); } } return true; } catch (Exception ex) { //LogAPI.Debug("新建工程页面中,文件夹复制时失败,异常原因: " + ex + " ; "); Console.WriteLine("行政区提取时,数据拷贝失败!"); return false; //throw; } } public string GetTime(DateTime timeA) { //timeA 表示需要计算 DateTime timeB = DateTime.Now; //获取当前时间 TimeSpan ts = timeB - timeA; //计算时间差 //string time = ts.TotalSeconds.ToString(); //将时间差转换为秒 string str = ""; if (ts.Hours > 0) { str = String.Format("{0:00}", ts.Hours) + ":" + String.Format("{0:00}", ts.Minutes) + ":" + String.Format("{0:00}", ts.Seconds); } if (ts.Hours == 0 && ts.Minutes > 0) { str = "00:" + String.Format("{0:00}", ts.Minutes) + ":" + String.Format("{0:00}", ts.Seconds); } if (ts.Hours == 0 && ts.Minutes == 0) { str = "00:00:" + String.Format("{0:00}", ts.Seconds); } return str; } public void MakeFeatureLayer(GPParamClass paramClass, ref IFeatureLayer pFeatureLayer) { try { lock (this) { //融合 ESRI.ArcGIS.Geoprocessor.Geoprocessor geoprocessor = new Geoprocessor(); geoprocessor.OverwriteOutput = true; ESRI.ArcGIS.DataManagementTools.MakeFeatureLayer makeFly = new ESRI.ArcGIS.DataManagementTools.MakeFeatureLayer(); if (!string.IsNullOrWhiteSpace(paramClass.FirstFeatureClassPath)) { makeFly.in_features = paramClass.FirstFeatureClassPath; } else if (paramClass.FirstFeatureClass != null) { makeFly.in_features = paramClass.FirstFeatureClass; } else if (paramClass.FirstFeatureLayer != null) { makeFly.in_features = paramClass.FirstFeatureLayer; } else { throw new Exception("输入要素类参数为空!"); } makeFly.out_layer = paramClass.OutFeatureClassPath; IGeoProcessorResult tGeoResult = null; try { tGeoResult = (IGeoProcessorResult)geoprocessor.Execute(makeFly, null); } catch (Exception) { object sev = null; string message = geoprocessor.GetMessages(ref sev); throw new Exception(message); } if (paramClass.IsGetOutPutFeature && tGeoResult != null && tGeoResult.Status == ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded) { pFeatureLayer = GetOutPutFeatureClass(tGeoResult); } } } catch (Exception ex) { //LogAPI.Debug("融合分析失败,原因: " + ex + " ; "); throw ex; } } public IFeatureLayer GetOutPutFeatureClass(IGeoProcessorResult tGeoResult) { IGPUtilities pGPUtilities = new GPUtilitiesClass(); IFeatureClass pFeatureClass = null; IQueryFilter pQueryFilter = null; try { pGPUtilities.DecodeFeatureLayer(tGeoResult.GetOutput(0), out pFeatureClass, out pQueryFilter); //int count = pFeatureClass.FeatureCount(null);//统计Feature对象个数 //郑英杰 2018-09-06 发现多余无用代码 //IFeatureCursor pCursor = pFeatureClass.Insert(true); //提取FeatureCursor对象 IFeatureLayer pFeatureLayer = new FeatureLayerClass(); pFeatureLayer.FeatureClass = pFeatureClass; pFeatureLayer.Name = pFeatureClass.AliasName; return pFeatureLayer; } catch (Exception ex) { throw new Exception("获取生成图层异常:" + ex.Message); } finally { if (pQueryFilter != null) { Marshal.ReleaseComObject(pQueryFilter); } } } } public class DBLayerSourceHelper { public Dictionary DicWsAPI { get; set; } public IWorkspaceAPI BgWsAPI { get; set; } public IWorkspaceAPI ZlWsAPI { get; set; } public IWorkspaceAPI NmWsAPI { get; set; } //public IFeatureLayer JCLayer { get => jCLayer; set => jCLayer = value; } //public IFeatureLayer GXLayer { get => gXLayer; set => gXLayer = value; } public IFeatureLayer NmTbLayer { get; set; } #region 地类图斑 public IFeatureLayer JcTbLayer { get; set; } public IFeatureLayer JcPdtLayer { get; set; } public IFeatureLayer GxgcTBLayer { get; set; } public IFeatureLayer GxTbLayer { get; set; } public IFeatureLayer GxPdtLayer { get; set; } public IFeatureLayer BgTbLayer { get; set; } #endregion #region 村级调查区 public IFeatureLayer JcCjdcqLayer { get; set; } public IFeatureLayer JcCjdcqJxLayer { get; set; } public IFeatureLayer GxCjdcqLayer { get; set; } public IFeatureLayer GxgcCjdcqLayer { get; set; } public IFeatureLayer GxCjdcqJxLayer { get; set; } #endregion #region 行政区 public IFeatureLayer JcXzqLayer { get; set; } public IFeatureLayer JcXzqJxLayer { get; set; } public IFeatureLayer GxXzqLayer { get; set; } public IFeatureLayer GxgcXzqLayer { get; set; } public IFeatureLayer GxXzqJxLayer { get; set; } #endregion #region 城镇村 public IFeatureLayer JcCzcLayer { get; set; } public IFeatureLayer GxCzcLayer { get; set; } public IFeatureLayer GxgcCzcLayer { get; set; } #endregion #region 耕地等别 public IFeatureLayer JcGddbLayer { get; set; } public IFeatureLayer GxGddbLayer { get; set; } #endregion public IFeatureLayer OpenLayer(LayerCfg pLayerInfo) { if (pLayerInfo == null) return null; if (string.IsNullOrWhiteSpace(pLayerInfo.FcPath) || string.IsNullOrWhiteSpace(pLayerInfo.FcName)) return null; if (!File.Exists(pLayerInfo.FcPath) && !Directory.Exists(pLayerInfo.FcPath)) return null; FileInfo fInfo = new FileInfo(pLayerInfo.FcPath); WorkspaceTypeEnum wsType = WorkspaceTypeEnum.GDBFile; if (fInfo.FullName.EndsWith(".gdb")) wsType = WorkspaceTypeEnum.GDBFile; else if (fInfo.FullName.EndsWith(".mdb")) wsType = WorkspaceTypeEnum.MDBFile; else wsType = WorkspaceTypeEnum.ShapeFile; if (DicWsAPI == null) DicWsAPI = new Dictionary(); if (!DicWsAPI.ContainsKey(fInfo.FullName)) { IWorkspaceAPI wsAPI = new WorkspaceAPI(fInfo.FullName, wsType); DicWsAPI.Add(fInfo.FullName, wsAPI); } IFeatureClassAPI fcAPI = DicWsAPI[fInfo.FullName].OpenFeatureClass(pLayerInfo.FcName); return new FeatureLayerClass() { FeatureClass = fcAPI.FeatureClass, Name = fcAPI.FeatureClass.AliasName }; } public IFeatureLayer OpenLayer(IWorkspaceAPI pWsAPI, string pLayerName) { try { if (string.IsNullOrWhiteSpace(pLayerName)) return null; if (pWsAPI != null && pWsAPI.CurrentWorkspace != null) { IFeatureClassAPI fcAPI = pWsAPI.OpenFeatureClass(pLayerName); return new FeatureLayerClass() { FeatureClass = fcAPI.FeatureClass, Name = fcAPI.FeatureClass.AliasName }; } return null; } catch (Exception ex) { Console.WriteLine(string.Format("Err:{0}图层获取失败", pLayerName)); return null; } } } }