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; |
|
} |
|
} |
|
|
|
} |
|
}
|
|
|