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.
275 lines
13 KiB
275 lines
13 KiB
using ESRI.ArcGIS.ADF; |
|
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.DataSourcesGDB; |
|
using ESRI.ArcGIS.Geodatabase; |
|
using ESRI.ArcGIS.Geometry; |
|
using KGIS.Framework.AE; |
|
using KGIS.Framework.AE.Enum; |
|
using KGIS.Framework.AE.ExtensionMethod; |
|
using KGIS.Framework.AE.GPHelper; |
|
using KGIS.Framework.DBOperator; |
|
using KGIS.Framework.Maps; |
|
using KGIS.Framework.Utils; |
|
using KGIS.Framework.Utils.ExtensionMethod; |
|
using KGIS.Framework.Utils.Helper; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Data; |
|
using System.IO; |
|
using System.Linq; |
|
using System.Runtime.InteropServices; |
|
using System.Text; |
|
using System.Text.RegularExpressions; |
|
using System.Threading.Tasks; |
|
|
|
namespace Kingo.PluginServiceInterface.Helper |
|
{ |
|
/// <summary> |
|
/// 在线建库软件地类图斑变更层检查 |
|
/// </summary> |
|
public static class BGTBDataCheckHelper |
|
{ |
|
#region 属性检查 |
|
/// <summary> |
|
/// 地类图斑变更层值域规范性和逻辑一致性检查检查 |
|
/// </summary> |
|
/// <returns></returns> |
|
public static List<string> CheckAttribute(IFeature feature, IFeatureClass featureClass, string code) |
|
{ |
|
List<string> allResultList =new List<string>(); |
|
IRDBHelper rdbHelper = null; |
|
try |
|
{ |
|
string dbPrjPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; |
|
rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPrjPath, DatabaseType.SQLite); |
|
int bsmIdx = featureClass.FindField("BSM"); |
|
if (bsmIdx != -1) |
|
{ |
|
string bsm = feature.Value[bsmIdx].ToTrim(); |
|
if (string.IsNullOrEmpty(bsm)) |
|
BSMHelper.UpdateBSM(MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo, "DLTBBG", featureClass, rdbHelper, false); |
|
} |
|
BSMHelper.CopyTable(rdbHelper, dbPrjPath, "DLTBBG", featureClass); |
|
|
|
string Sqlwhere = " where ( RuleType = '值域规范性' or RuleType = '逻辑一致性' ) and BGLayerName = 'DLTBBG_地类图斑变更' "; |
|
DataTable dataTable = rdbHelper.ExecuteDatatable("tab", $" SELECT * from CheckingRule {Sqlwhere} ", true); |
|
if (dataTable != null && dataTable.Rows.Count != 0) |
|
{ |
|
List<string> valueRangeList = CheckStandard(dataTable, dbPrjPath, featureClass, feature.OID, code); |
|
if (valueRangeList.Count > 0) |
|
allResultList.AddRange(valueRangeList); |
|
} |
|
return allResultList; |
|
|
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("值域规范性检查时发生异常:" + ex.Message); |
|
LogAPI.Debug("值域规范性检查时发生异常:" + ex.StackTrace); |
|
MessageHelper.ShowError("值域规范性检查时发生异常,详情请查看系统日志!"); |
|
return allResultList; |
|
} |
|
finally |
|
{ |
|
if (rdbHelper != null && rdbHelper.State != ConnectionState.Closed) |
|
rdbHelper.DisConnect(); |
|
|
|
} |
|
} |
|
|
|
private static List<string> CheckStandard(DataTable dataTable, string dbPrjPath, IFeatureClass featureClass, int OID, string code) |
|
{ |
|
List<string> sqlList = new List<string>(); |
|
IRDBHelper errdbHelper = null; |
|
IFeatureCursor cursur = null; |
|
IFeature f = null; |
|
try |
|
{ |
|
var ImplementSQL = string.Empty; |
|
var RuleCode = string.Empty; |
|
var RuleType = string.Empty; |
|
DataTable dt = null; |
|
string sqlStr = null; |
|
foreach (DataRow row in dataTable.Rows) |
|
{ |
|
ImplementSQL = row["ImplementSQL"].ToTrim();//执行语句 |
|
RuleCode = row["RuleCode"].ToTrim();//规则编码 |
|
RuleType = row["RuleType"].ToTrim();//规则类别 |
|
try |
|
{ |
|
#region 源代码 |
|
if (string.IsNullOrEmpty(ImplementSQL) || !ImplementSQL.ToLower().Contains("select")) continue; |
|
errdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPrjPath, DatabaseType.SQLite); |
|
dt = errdbHelper.ExecuteDatatable("tab", string.Format(ImplementSQL, "DLTBBG", "地类图斑变更", RuleCode, RuleType, code), true); |
|
if (dt != null && dt.Rows.Count > 0) |
|
{ |
|
foreach (DataRow item in dt.Rows) |
|
{ |
|
if (dt.Columns.Contains("MC")) |
|
{ |
|
if (string.IsNullOrEmpty(item["MC"].ToString())) continue; |
|
if (Regex.IsMatch(item["MC"].ToString(), @"^[0-9]+$") |
|
|| Regex.IsMatch(item["MC"].ToString().Substring(0, 1), @"^[A-Za-z]+$") |
|
|| Regex.IsMatch(item["MC"].ToString(), "[^0-9a-zA-Z\u4e00-\u9fa5-_()()、]") |
|
) |
|
{ |
|
sqlStr = $" OBJECTID = {OID} and "; |
|
if (ImplementSQL.Contains("ZLDWMC")) |
|
sqlStr += $" ZLDWMC = '{item["MC"]}' "; |
|
else if (ImplementSQL.Contains("QSDWMC")) |
|
sqlStr += $" QSDWMC = '{item["MC"]}' "; |
|
|
|
sqlStr = sqlStr.TrimEnd("and".ToCharArray()); |
|
cursur = featureClass.Search(new QueryFilterClass() { WhereClause = sqlStr }, true); |
|
while ((f = cursur.NextFeature()) != null) |
|
{ |
|
sqlList.Add(string.Format("(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea,ErrorDesc) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}');", f.OID.ToString(), f.Value[f.Fields.FindField("BSM")], item["ErrorLayer"], item["ErrorCode"], item["ErrorName"], item["RuleType"], f.Shape.ToJson(), item["MC"])); |
|
} |
|
} |
|
continue; |
|
} |
|
|
|
sqlStr = $" OBJECTID = {OID} and "; |
|
if (item["BSM"] == null || string.IsNullOrEmpty(item["BSM"].ToString())) |
|
sqlStr += $" (BSM is null or BSM = '' or BSM = ' ') "; |
|
else if (ImplementSQL.Contains("BZ字段不允许填写字段值")) |
|
sqlStr += $" BZ = '{item["BZ"]}' "; |
|
else |
|
sqlStr += $" BSM = '{item["BSM"]}' "; |
|
|
|
sqlStr = sqlStr.TrimEnd("and".ToCharArray()); |
|
cursur = featureClass.Search(new QueryFilterClass() { WhereClause = sqlStr }, true); |
|
string CheckFeatureClassName = featureClass.AliasName; |
|
while ((f = cursur.NextFeature()) != null) |
|
{ |
|
sqlList.Add(string.Format("(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}');", f.OID, f.Value[f.Fields.FindField("BSM")], item["ErrorLayer"], item["ErrorCode"], item["ErrorName"], item["RuleType"])); |
|
} |
|
} |
|
} |
|
#endregion |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug($"错误代码【{RuleCode}】对应的查询语句错误:[{ex.Message}]"); |
|
continue; |
|
} |
|
} |
|
return sqlList; |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("属性规范性检查发生异常:" + ex.Message); |
|
LogAPI.Debug("属性规范性检查发生异常:" + ex.StackTrace); |
|
return sqlList; |
|
} |
|
finally |
|
{ |
|
if (errdbHelper != null && errdbHelper.State != ConnectionState.Closed) |
|
errdbHelper.DisConnect(); |
|
|
|
if (cursur != null) |
|
Marshal.ReleaseComObject(cursur); |
|
if (f != null) |
|
Marshal.ReleaseComObject(f); |
|
} |
|
} |
|
#endregion |
|
|
|
#region 重叠 |
|
/// <summary> |
|
/// 自身重叠检查 |
|
/// </summary> |
|
/// <returns></returns> |
|
public static bool CheckTopology(IFeatureClass featureClass, IFeature feature) |
|
{ |
|
try |
|
{ |
|
bool isShowTips = false; |
|
IGeometry geometry = feature.ShapeCopy; |
|
List<IFeature> topologyFeatures = FeatureAPI.Identify2(geometry, new FeatureLayer() { FeatureClass = featureClass }); |
|
if (topologyFeatures != null && topologyFeatures.Count > 0) |
|
{ |
|
foreach (IFeature topologyFeature in topologyFeatures) |
|
{ |
|
if (feature.OID == topologyFeature.OID) continue; |
|
isShowTips = true; |
|
break; |
|
} |
|
return isShowTips; |
|
} |
|
return isShowTips; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 重叠修复(第一种情况,删除原来图层数据相交部分) |
|
/// </summary> |
|
/// <returns></returns> |
|
public static List<IGeometry> RepairTopology(IFeatureClass featureClass, IFeature feature) |
|
{ |
|
List<IGeometry> geometries = new List<IGeometry>(); |
|
try |
|
{ |
|
IGeometry geometry = feature.ShapeCopy; |
|
List<IFeature> topologyFeatures = FeatureAPI.Identify2(geometry, new FeatureLayer() { FeatureClass = featureClass }); |
|
if (topologyFeatures != null && topologyFeatures.Count > 0) |
|
{ |
|
foreach (IFeature topologyFeature in topologyFeatures) |
|
{ |
|
if (feature.OID == topologyFeature.OID) continue; |
|
IGeometry eraseGeometry = FeatureAPI.Difference(topologyFeature.ShapeCopy, geometry); |
|
geometries.Add(eraseGeometry); |
|
} |
|
} |
|
return geometries; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 重叠修复(第二种情况,删除当前变更数据相交部分) |
|
/// </summary> |
|
/// <returns></returns> |
|
public static IGeometry RepairTopology2(IFeatureClass featureClass, IFeature feature, out List<IGeometry> geometries) |
|
{ |
|
IGeometry geometry = feature.ShapeCopy; |
|
geometries = new List<IGeometry>(); |
|
try |
|
{ |
|
List<IFeature> topologyFeatures = FeatureAPI.Identify2(geometry, new FeatureLayer() { FeatureClass = featureClass }); |
|
if (topologyFeatures != null && topologyFeatures.Count > 0) |
|
{ |
|
IGeometry unionGeometry = null; |
|
foreach (IFeature topologyFeature in topologyFeatures) |
|
{ |
|
if (feature.OID == topologyFeature.OID) continue; |
|
geometries.Add(topologyFeature.ShapeCopy); |
|
if (unionGeometry == null) |
|
unionGeometry = topologyFeature.ShapeCopy; |
|
else |
|
unionGeometry = FeatureAPI.Union(unionGeometry, topologyFeature.ShapeCopy); |
|
} |
|
if (unionGeometry != null) |
|
{ |
|
IGeometry eraseGeometry = FeatureAPI.Difference(geometry, unionGeometry); |
|
return eraseGeometry; |
|
} |
|
} |
|
return geometry; |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
} |
|
#endregion |
|
|
|
} |
|
}
|
|
|