森林草原湿地荒漠调查
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

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