You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							511 lines
						
					
					
						
							20 KiB
						
					
					
				
			
		
		
	
	
							511 lines
						
					
					
						
							20 KiB
						
					
					
				using ESRI.ArcGIS.DataSourcesGDB; | 
						|
using ESRI.ArcGIS.Geodatabase; | 
						|
using KGIS.Framework.DBOperator; | 
						|
using KGIS.Framework.Maps; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.ExtensionMethod; | 
						|
using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Data; | 
						|
using System.Runtime.InteropServices; | 
						|
 | 
						|
namespace Kingo.PluginServiceInterface.Helper | 
						|
{ | 
						|
    public static class BSMHelper | 
						|
    { | 
						|
        /// <summary> | 
						|
        /// 补充更新传入图层的标识码,只操作标识码为空或者重复的图斑 | 
						|
        /// </summary> | 
						|
        public static void UpdateBSM(ProjectInfo projectInfo, string layerName, IFeatureClass featureClass, IRDBHelper rdbHelper = null, bool isNeedDisConn = true) | 
						|
        { | 
						|
            IFeatureCursor pCursor = null; | 
						|
            IFeature f = null; | 
						|
            try | 
						|
            { | 
						|
                if (projectInfo == null || string.IsNullOrEmpty(projectInfo.CODE)) return; | 
						|
                string bsmLeftStr = ""; | 
						|
                if (featureClass == null) return; | 
						|
                int bsmIdx = featureClass.FindField("BSM"); | 
						|
                if (bsmIdx == -1) return; | 
						|
 | 
						|
                int xh = 0; | 
						|
                if (featureClass.FeatureCount(null) != 0) | 
						|
                { | 
						|
                    string MaxBSM = GetMaxBSM(featureClass); | 
						|
                    if (!string.IsNullOrEmpty(MaxBSM) && MaxBSM.Length == 18) | 
						|
                    { | 
						|
                        int xh2 = Convert.ToInt32(MaxBSM.Substring(10)); | 
						|
                        bsmLeftStr = MaxBSM.Substring(0, 10); | 
						|
                        if (xh < xh2) | 
						|
                            xh = xh2; | 
						|
                    } | 
						|
                    else | 
						|
                        bsmLeftStr = projectInfo.CODE + GetBsmCode(layerName); | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    bsmLeftStr = projectInfo.CODE + GetBsmCode(layerName); | 
						|
                } | 
						|
 | 
						|
                IQueryFilter queryFilter = new QueryFilterClass() { WhereClause = "BSM is null or BSM = '' or BSM = ' ' " }; | 
						|
 | 
						|
                string dbPrjPath = System.IO.Path.GetDirectoryName(projectInfo.GetProjFilePath()) + @"\BGTJ.sqlite"; | 
						|
                if (rdbHelper == null) | 
						|
                { | 
						|
                    rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPrjPath, DatabaseType.SQLite); | 
						|
                } | 
						|
                CopyTable(rdbHelper, dbPrjPath, layerName, featureClass); | 
						|
 | 
						|
                string strSql = $"select BSM from {(featureClass as IDataset).Name} GROUP BY BSM HAVING COUNT(BSM) > 1"; | 
						|
                DataTable ChangeDT = rdbHelper?.ExecuteDatatable("BSMRepeat", strSql, true); | 
						|
                if (ChangeDT != null) | 
						|
                { | 
						|
                    string BSMs = ""; | 
						|
                    foreach (DataRow dr in ChangeDT.Rows) | 
						|
                    { | 
						|
                        BSMs += $"'{dr["BSM"].ToTrim()}',"; | 
						|
                    } | 
						|
                    queryFilter = new QueryFilterClass() { WhereClause = $" BSM IN({BSMs.Trim(',')}) OR BSM IS NULL OR BSM = '' OR BSM = ' '" }; | 
						|
                    if (BSMs.Length < 18) | 
						|
                        queryFilter.WhereClause = $" BSM IS NULL OR BSM = '' OR BSM = ' ' "; | 
						|
                } | 
						|
                pCursor = featureClass.Search(queryFilter, true); | 
						|
                while ((f = pCursor.NextFeature()) != null) | 
						|
                { | 
						|
                    xh++; | 
						|
                    string newbsm = bsmLeftStr + xh.ToString().PadLeft(8, '0'); | 
						|
                    f.Value[bsmIdx] = newbsm; | 
						|
                    f.Store(); | 
						|
                } | 
						|
                pCursor.Flush(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug($"{layerName}标识码维护失败:" + ex.Message); | 
						|
                LogAPI.Debug($"{layerName}标识码维护失败:" + ex.StackTrace); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                if (pCursor != null) | 
						|
                    Marshal.ReleaseComObject(pCursor); | 
						|
                if (f != null) | 
						|
                    Marshal.ReleaseComObject(f); | 
						|
                if (isNeedDisConn) | 
						|
                { | 
						|
                    if (rdbHelper != null && rdbHelper.State != ConnectionState.Closed) | 
						|
                        rdbHelper.DisConnect(); | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 补充更新传入图层的标识码,全部重新编排 | 
						|
        /// </summary> | 
						|
        public static void UpdateAllBSM(ProjectInfo projectInfo, string layerName, IFeatureClass featureClass) | 
						|
        { | 
						|
            IFeatureCursor pCursor = null; | 
						|
            IFeature f = null; | 
						|
            try | 
						|
            { | 
						|
                if (projectInfo == null || string.IsNullOrEmpty(projectInfo.CODE)) return; | 
						|
                string bsmLeftStr = ""; | 
						|
                if (featureClass == null) return; | 
						|
                int bsmIdx = featureClass.FindField("BSM"); | 
						|
                if (bsmIdx == -1) return; | 
						|
 | 
						|
                int xh = 0; | 
						|
                if (featureClass.FeatureCount(null) != 0) | 
						|
                { | 
						|
                    string MaxBSM = GetMaxBSM(featureClass); | 
						|
                    if (!string.IsNullOrEmpty(MaxBSM) && MaxBSM.Length == 18) | 
						|
                    { | 
						|
                        int xh2 = Convert.ToInt32(MaxBSM.Substring(10)); | 
						|
                        bsmLeftStr = MaxBSM.Substring(0, 10); | 
						|
                        if (xh < xh2) | 
						|
                            xh = xh2; | 
						|
                    } | 
						|
                    else | 
						|
                        bsmLeftStr = projectInfo.CODE + GetBsmCode(layerName); | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    bsmLeftStr = projectInfo.CODE + GetBsmCode(layerName); | 
						|
                } | 
						|
 | 
						|
                pCursor = featureClass.Search(null, true); | 
						|
                while ((f = pCursor.NextFeature()) != null) | 
						|
                { | 
						|
                    xh++; | 
						|
                    string newbsm = bsmLeftStr + xh.ToString().PadLeft(8, '0'); | 
						|
                    f.Value[bsmIdx] = newbsm; | 
						|
                    f.Store(); | 
						|
                } | 
						|
                pCursor.Flush(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug($"{layerName}标识码维护失败:" + ex.Message); | 
						|
                LogAPI.Debug($"{layerName}标识码维护失败:" + ex.StackTrace); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                if (pCursor != null) | 
						|
                    Marshal.ReleaseComObject(pCursor); | 
						|
                if (f != null) | 
						|
                    Marshal.ReleaseComObject(f); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 获取每个图层的图层标识码的四位特殊编号 | 
						|
        /// </summary> | 
						|
        public static string GetBsmCode(string layerName) | 
						|
        { | 
						|
            string bsmLeftStr = string.Empty; | 
						|
            switch (layerName) | 
						|
            { | 
						|
                case "DLTBBG": | 
						|
                    bsmLeftStr = "2110"; | 
						|
                    break; | 
						|
                case "DLTBGX": | 
						|
                    bsmLeftStr = "2110"; | 
						|
                    break; | 
						|
                case "DLTBGXGC": | 
						|
                    bsmLeftStr = "2111"; | 
						|
                    break; | 
						|
                case "CZCDYDGX": | 
						|
                    bsmLeftStr = "2931"; | 
						|
                    break; | 
						|
                case "CZCDYDGXGC": | 
						|
                    bsmLeftStr = "2932"; | 
						|
                    break; | 
						|
                case "XZQGX": | 
						|
                    bsmLeftStr = "1210"; | 
						|
                    break; | 
						|
                case "XZQGXGC": | 
						|
                    bsmLeftStr = "1211"; | 
						|
                    break; | 
						|
                case "CJDCQGX": | 
						|
                    bsmLeftStr = "1240"; | 
						|
                    break; | 
						|
                case "CJDCQGXGC": | 
						|
                    bsmLeftStr = "1241"; | 
						|
                    break; | 
						|
                case "CJDCQJXGX": | 
						|
                    bsmLeftStr = "1250"; | 
						|
                    break; | 
						|
                case "XZQJXGX": | 
						|
                    bsmLeftStr = "1220"; | 
						|
                    break; | 
						|
                case "TTQGX": | 
						|
                    bsmLeftStr = "2981"; | 
						|
                    break; | 
						|
                case "GDDBGX": | 
						|
                    bsmLeftStr = "2941"; | 
						|
                    break; | 
						|
                case "PDTGX": | 
						|
                    bsmLeftStr = "1330"; | 
						|
                    break; | 
						|
                case "GCHZZGX": | 
						|
                    bsmLeftStr = "29C1"; | 
						|
                    break; | 
						|
                case "GFBQGX": | 
						|
                    bsmLeftStr = "2971"; | 
						|
                    break; | 
						|
                case "CCWJQGX": | 
						|
                    bsmLeftStr = "2991"; | 
						|
                    break; | 
						|
                case "LMFWGX": | 
						|
                    bsmLeftStr = "29A1"; | 
						|
                    break; | 
						|
 | 
						|
 | 
						|
                default: | 
						|
                    break; | 
						|
            } | 
						|
            return bsmLeftStr; | 
						|
        } | 
						|
 | 
						|
        #region 获取图层中的最大标识码 | 
						|
        /// <summary> | 
						|
        /// 获取图层中的最大标识码 | 
						|
        /// </summary> | 
						|
        public static string GetMaxBSM(IFeatureClass fc) | 
						|
        { | 
						|
            string BSM = string.Empty; | 
						|
            int BSMIndex = fc.FindField("BSM"); | 
						|
            if (BSMIndex == -1) return BSM; | 
						|
 | 
						|
            ITable table = (ITable)fc; | 
						|
            ITableSort tableSort = new TableSortClass(); | 
						|
            tableSort.Table = table; | 
						|
            tableSort.Fields = "BSM"; | 
						|
            tableSort.set_Ascending("BSM", false); | 
						|
            tableSort.Sort(null); | 
						|
            ICursor cursor = tableSort.Rows; | 
						|
            IRow row = cursor.NextRow(); | 
						|
            if (row != null) | 
						|
            { | 
						|
                int maxBSM = 0; | 
						|
                int currBSM = 0; | 
						|
                string BSMStr = row.Value[BSMIndex].ToString(); | 
						|
                if (BSMStr.Length != 18) return BSM; | 
						|
                string subBSMStr = BSMStr.Substring(9); | 
						|
                try | 
						|
                { | 
						|
                    currBSM = Convert.ToInt32(subBSMStr); | 
						|
                } | 
						|
                catch (Exception) | 
						|
                { | 
						|
                    return BSM; | 
						|
                } | 
						|
                if (currBSM > maxBSM) maxBSM = currBSM; | 
						|
 | 
						|
                if (BSMStr.Length != 18) return BSM; | 
						|
                string maxStr = maxBSM.ToString(); | 
						|
                int zeroNum = 9 - maxStr.Length; | 
						|
                for (int i = 0; i < zeroNum; i++) | 
						|
                { | 
						|
                    maxStr = 0 + maxStr; | 
						|
                } | 
						|
                BSM = BSMStr.Substring(0, 9) + maxStr; | 
						|
            } | 
						|
            return BSM; | 
						|
 | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 获取图层中的最大标识码 | 
						|
        /// </summary> | 
						|
        public static string GetMaxBSM(List<IFeatureClass> 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.QueryFilter = new QueryFilterClass() { WhereClause = $"BSM like '{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).CODE}%'" }; | 
						|
                if (System.IO.Path.GetExtension((fc as FeatureClass).Workspace.PathName).ToLower().Contains(".mdb")) | 
						|
                    tableSort.QueryFilter = new QueryFilterClass() { WhereClause = $"BSM like '{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).CODE}*'" }; | 
						|
                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; | 
						|
 | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 获取图层中的最大标识码 | 
						|
        /// </summary> | 
						|
        public static string GetMaxBSM(List<IFeatureClass> fcList, string strCode) | 
						|
        { | 
						|
            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.QueryFilter = new QueryFilterClass() { WhereClause = $"BSM like '{strCode}%'" }; | 
						|
                if (System.IO.Path.GetExtension((fc as FeatureClass).Workspace.PathName).ToLower().Contains(".mdb")) | 
						|
                    tableSort.QueryFilter = new QueryFilterClass() { WhereClause = $"BSM like '{strCode}*'" }; | 
						|
                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; | 
						|
 | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        #region 获取最新完整标识码 | 
						|
        /// <summary> | 
						|
        /// 获取最新完整标识码 | 
						|
        /// </summary> | 
						|
        public static string GetNewBSM(List<IFeatureClass> fcList, string prjCode, string layerCode) | 
						|
        { | 
						|
            string result = string.Empty; | 
						|
            int xh = 0; | 
						|
            string leftStr = string.Empty; | 
						|
            foreach (var item in fcList) | 
						|
            { | 
						|
                string MaxBSM = GetMaxBSM(item); | 
						|
                if (MaxBSM.Length != 18) | 
						|
                    continue; | 
						|
                int xh2 = Convert.ToInt32(MaxBSM.Substring(10)); | 
						|
                leftStr = MaxBSM.Substring(0, 10); | 
						|
                if (xh < xh2) | 
						|
                    xh = xh2; | 
						|
            } | 
						|
            xh++; | 
						|
            if (string.IsNullOrWhiteSpace(leftStr)) | 
						|
                leftStr = prjCode + layerCode; | 
						|
            result = leftStr + xh.ToString().PadLeft(8, '0'); | 
						|
            return result; | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        public static void CopyTable(IRDBHelper rdbHelper, string dbPrjPath, string layerName, IFeatureClass featureClass) | 
						|
        { | 
						|
            IWorkspaceFactory pOutWorkFactory = new SqlWorkspaceFactoryClass(); | 
						|
            try | 
						|
            { | 
						|
                if (rdbHelper == null) rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPrjPath, DatabaseType.SQLite); | 
						|
                IWorkspace pOutWork = pOutWorkFactory.OpenFromFile(dbPrjPath, 0); | 
						|
                rdbHelper.ExecuteSQL($" Drop Table {layerName}"); | 
						|
                TableToTable((featureClass as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, layerName); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug(ex); | 
						|
                return; | 
						|
            } | 
						|
        } | 
						|
        public static bool TableToTable(IFeatureWorkspace pInWork, IWorkspace pOutWork, string tableName, IQueryFilter queryFilter = null) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (pInWork == null || pOutWork == null || string.IsNullOrEmpty(tableName)) return false; | 
						|
                if (pInWork is IWorkspace2 workspace2) | 
						|
                { | 
						|
                    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; | 
						|
                IFieldChecker fieldChecker = new FieldCheckerClass(); | 
						|
                IFields targetFeatureClassFields = pInTable.Fields; | 
						|
                IFields sourceFeatureClassFields = pInTable.Fields; | 
						|
                IEnumFieldError enumFieldError; | 
						|
                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; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
    } | 
						|
}
 | 
						|
 |