using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.DataManagementTools; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geoprocessor; 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.Platform; using KGIS.Framework.Platform.Helper; using KGIS.Framework.ThreadManager; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils.Helper; using KGIS.Framework.Views; using Kingo.PluginServiceInterface; using Kingo.PluginServiceInterface.Model; using KUI.Windows; using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using UIShell.OSGi; namespace Kingo.Plugin.DataCheck.View { /// /// V_DataCheck.xaml 的交互逻辑 /// public partial class V_DataCheck : UserControl, IDockPanel2, IDataCheckHelper { private DataCheckHelper m_Check = null; private Style _ExpanderStyle = null; private string _CheckName = string.Empty; private IHookHelper m_hookHelper = null; private string TempfilePath = string.Empty; /// /// 地图视图刷新 /// private ControlsMapRefreshViewCommandClass MapRefreshView = new ControlsMapRefreshViewCommandClass(); public V_DataCheck(string CheckName, DataCheckHelper dataCheckHelper = null, IHookHelper _hookHelper = null) { try { InitializeComponent(); DevExpress.Xpf.Core.ThemeManager.SetTheme(this, DevExpress.Xpf.Core.Theme.Office2013LightGray); m_hookHelper = _hookHelper; this.Resources = Application.LoadComponent(new Uri(string.Format("{0}.{1}", "/Kingo.Plugin.DataCheck;component/Views/V_Resources/V_ResDic", "xaml"), UriKind.Relative)) as ResourceDictionary; //DevExpress.Xpf.Core.ThemeManager.SetTheme(this, DevExpress.Xpf.Core.Theme.Office2013LightGray); this.DockAreas = DockStyle.DockBottom | DockStyle.Float; this.FloatSize = new System.Drawing.Size(600, 400); this.DefaultArea = DockStyle.DockBottom; this.ShowCloseButton = true; this.ShowAutoHideButton = true; //this.Title = "变更数据检查"; this.IsShowInMap = true; this.DockHeight = 350; _ExpanderStyle = (Style)this.Resources["ExpanderStyle"]; if (!string.IsNullOrEmpty(CheckName)) _CheckName = CheckName; #region 设置检查中状态样式-注释 //m_Check = dataCheckHelper; //this.DataContext = m_Check; //this.CloseViewHandler += (e, a) => //{ // UIShell.OSGi.BundleRuntime.Instance.RemoveService(this); //}; //UIShell.OSGi.BundleRuntime.Instance.AddService(this); //IdataChecks = new List(); //IdataChecks.Add(new BGHDataCheck()); //IdataChecks.Add(new BGQDataCheck()); //IdataChecks.Add(new JCDLTBDataCheck()); //IdataChecks.Add(new JCCZCDYDDataCheck()); //DataTemplate datatemplate = this.Resources["TvItemNode"] as DataTemplate; //foreach (var item in m_Check.CheckGroup) //{ // Expander exp = new Expander(); // exp.BorderThickness = new Thickness(0); // exp.Name = item.GroupName; // exp.DataContext = item; // exp.VerticalAlignment = VerticalAlignment.Stretch; // exp.IsExpanded = true; // exp.Style = _ExpanderStyle; // exp.SetBinding(Expander.HeaderProperty, new Binding("GroupName")); // TreeView tv = new TreeView(); // tv.Style = (Style)this.Resources["DefaultTreeView"]; // tv.ItemTemplate = datatemplate; // tv.ItemsSource = item.CheckRules; // exp.Content = tv; // spCheckRule.Children.Add(exp); //} #endregion InitView(out bool isFinishd); //LoadData(); } catch (Exception ex) { MessageHelper.Show("数据检查界面初始化失败!"); LogAPI.Debug("数据检查界面初始化失败:" + ex.Message); } } public List FieldsTempData = null; private void InitView(out bool isFinishd) { isFinishd = false; IRDBHelper rdbHelper = null; try { string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); DataTable dataTable = null; string DataCheckResultsSQL = string.Empty; if (_CheckName == "变更图斑") { dataTable = rdbHelper.ExecuteDatatable("tab", " SELECT RuleType from DataCheckResults ", true); DataCheckResultsSQL = " where ErrorLayer='DLTBBG' or ErrorLayer='地类图斑变更层' "; } else if (_CheckName == "增量图斑") { dataTable = rdbHelper.ExecuteDatatable("tab", " SELECT RuleType from DataCheckResults ", true); DataCheckResultsSQL = " where ErrorLayer!='DLTBBG' and ErrorLayer!='DLTB' and ErrorLayer!='地类图斑变更层' and ErrorLayer!='地类图斑' "; } else if (_CheckName == "基础图斑") { dataTable = rdbHelper.ExecuteDatatable("tab", " SELECT RuleType from DataCheckResults ", true); DataCheckResultsSQL = " where ErrorLayer='DLTB' or ErrorLayer='地类图斑' "; } string Msg = "检查完成:"; dataTable = rdbHelper.ExecuteDatatable("tab", $"select * from DataCheckResults {DataCheckResultsSQL}", true); DataTable dataTablegroupby = rdbHelper.ExecuteDatatable("dataTablegroupby", " select RuleType,RuleType RuleName from CheckingRule where BGLayerName NOTNULL GROUP BY RuleType ", true); FieldsTempData = new List(); var _ID = dataTable.Rows.Count + 1; int FieldsTempDataID = 0; foreach (DataRow row in dataTablegroupby.Rows) { var RuleTypeTab = dataTable.Select($"RuleType = '{row["RuleType"].ToString()}'").ToList(); //当前仅进行图形括扑检查; if (!row["RuleName"].ToString().ToTrim().Equals("图形拓扑") && _CheckName == "基础图斑") continue; if (!row["RuleName"].ToString().ToTrim().Equals("图形拓扑") && _CheckName == "增量图斑") continue; DataCheckResult checkingRule = new DataCheckResult() { ID = _ID, PID = _ID, ErrorDesc = row["RuleName"].ToString(), }; FieldsTempData.Add(checkingRule); if (RuleTypeTab.Count > 0) { string MsgItem = string.Format("{0} {1} 个错误;", row["RuleType"].ToString(), RuleTypeTab.Count); Msg += MsgItem; foreach (DataRow item in RuleTypeTab) { FieldsTempData.Add(new DataCheckResult() { //ID = Convert.ToInt32($"{checkingRule.ID}{item["ID"].ToString()}"), ID = FieldsTempDataID++, PID = checkingRule.ID, BSM = item["BSM"].ToString(), ErrorDesc = $"【{item["BSM"].ToString()}】{item["ErrorName"].ToString()}", ErrorCode = item["ErrorCode"].ToTrim(), ErrorLayer = item["ErrorLayer"].ToTrim(), PrimaryKey = "OBJECTID", PrimaryKeyValue = item["OBJECTID"].ToInt().ToTrim(), ErrorArea = item["ErrorArea"].ToTrim(), PrimaryKeyValue2 = item["MultipartOID"].ToTrim(), RepairfilePath = item["RepairfilePath"].ToString(), }); } } _ID++; } this.treeList.ItemsSource = FieldsTempData; labCheckMsg.Content = Msg.TrimEnd(";"); isFinishd = true; #region MyRegion //spCheckResult.Children.Clear(); //string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; //rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); //DataTable dataTable = null; //string DataCheckResultsSQL = string.Empty; //if (_CheckName == "变更图斑") //{ // dataTable = rdbHelper.ExecuteDatatable("tab", " SELECT RuleType from CheckingRule where BGIsSelect=true GROUP BY RuleType ", true); // DataCheckResultsSQL = " where ErrorLayer='DLTBBG' "; //} //else if (_CheckName == "增量图斑") //{ // dataTable = rdbHelper.ExecuteDatatable("tab", " SELECT RuleType from CheckingRule where ZLIsSelect=true GROUP BY RuleType ", true); // DataCheckResultsSQL = " where ErrorLayer!='DLTBBG' and ErrorLayer!='DLTB' "; //} //else if (_CheckName == "基础图斑") //{ // dataTable = rdbHelper.ExecuteDatatable("tab", " SELECT RuleType from CheckingRule where ImplementSQL='Topology_JCDLTB' GROUP BY RuleType ", true); // DataCheckResultsSQL = " where ErrorLayer='DLTB' "; //} //string Msg = "检查完成:"; //var MaxHeight = 200; //foreach (DataRow row in dataTable.Rows) //{ // List CheckResults = new List(); // Expander exp = new Expander(); // exp.Name = row["RuleType"].ToString(); // exp.DataContext = row; // exp.VerticalAlignment = VerticalAlignment.Stretch; // exp.Style = _ExpanderStyle; // exp.IsExpanded = true; // //exp.SetBinding(Expander.HeaderProperty, new Binding("GroupDesc")); // exp.Header = row["RuleType"].ToString(); // ContextMenu cm = new ContextMenu(); // cm.Opened += (s, e) => // { // var list = (cm.PlacementTarget as ListBox); // DataCheckResult data = list.SelectedItem as DataCheckResult; // if (data != null) // { // for (int i = 0; i < cm.Items.Count; i++) // { // MenuItem item = cm.Items[i] as MenuItem; // if (item.Header.ToTrim() == "自动修复") // { // continue; // } // item.IsEnabled = false; // } // for (int i = 0; i < cm.Items.Count; i++) // { // MenuItem item = cm.Items[i] as MenuItem; // if (data.PrimaryKeyValue == "-1" || data.PrimaryKeyValue == "0") // { // if (item.Header.ToTrim() == "合并") // { // item.IsEnabled = true; // } // } // else // { // if (item.Header.ToTrim() == "删除" || item.Header.ToTrim() == "擦除") // { // item.IsEnabled = true; // } // } // } // } // }; // MenuItem mitem = null; // if (row["RuleType"].ToString() == "图形拓扑") // { // mitem = new MenuItem { Header = "删除", IsEnabled = false }; // mitem.Click += new RoutedEventHandler(Delete_Click); // cm.Items.Add(mitem); // mitem = new MenuItem { Header = "合并", IsEnabled = false }; // mitem.Click += new RoutedEventHandler(Merge_Click); // cm.Items.Add(mitem); // mitem = new MenuItem { Header = "擦除", IsEnabled = false }; // mitem.Click += new RoutedEventHandler(Erase_Click); // cm.Items.Add(mitem); // } // else // { // mitem = new MenuItem { Header = "自动修复" }; // mitem.Click += new RoutedEventHandler(RepairItem_Click); // cm.Items.Add(mitem); // } // ListBox dg = new ListBox(); // dg.ContextMenu = cm; // dg.PreviewMouseDoubleClick += Dg_PreviewMouseDoubleClick;//双击 // dg.BorderThickness = new Thickness(0); // DataTemplate datatemplate = this.Resources["ItemNode"] as DataTemplate; // dg.ItemTemplate = datatemplate; // dg.VerticalAlignment = VerticalAlignment.Stretch; // dg.MaxHeight = MaxHeight; // dg.SetBinding(ListBox.ItemsSourceProperty, new Binding("CheckResults")); // exp.Content = dg; // DataTable dtFJ = rdbHelper.ExecuteDatatable("tab", $"select * from DataCheckResults {DataCheckResultsSQL} and RuleType='{row["RuleType"].ToString()}' ", true); // if (dtFJ == null) return; // string MsgItem = string.Format("{0} {1} 个错误;", row["RuleType"].ToString(), dtFJ.Rows.Count); // Msg += MsgItem; // for (int i = 0; i < dtFJ.Rows.Count; i++) // { // int id = dtFJ.Rows[i]["ID"].ToInt(); // int bgoid = dtFJ.Rows[i]["OBJECTID"].ToInt(); // string errorDesc = dtFJ.Rows[i]["ErrorName"].ToTrim(); // string jcErrorCode = dtFJ.Rows[i]["ErrorCode"].ToTrim(); // string errorLayer = dtFJ.Rows[i]["ErrorLayer"].ToTrim(); // string BSM = dtFJ.Rows[i]["BSM"].ToTrim(); // string ErrorArea = dtFJ.Rows[i]["ErrorArea"].ToTrim(); // string MultipartOID = dtFJ.Rows[i]["MultipartOID"].ToTrim(); // string RepairfilePath = dtFJ.Rows[i]["RepairfilePath"].ToTrim(); // EnumErrorType errType = (EnumErrorType)Enum.Parse(typeof(EnumErrorType), "错误"); // CheckResults.Add(new DataCheckResult() // { // ID = id, // ErrorDesc = $"【{BSM}】{errorDesc}", // ErrorCode = jcErrorCode, // ErrorLayer = errorLayer, // PrimaryKey = "OBJECTID", // PrimaryKeyValue = bgoid.ToTrim(), // ErrorType = errType, // ErrorArea = ErrorArea, // BSM = BSM, // PrimaryKeyValue2 = MultipartOID, // RepairfilePath = RepairfilePath, // Icon = string.Format("pack://siteoforigin:,,,/Images/{0}.{1}", errType.ToString(), "png") // }); // } // dg.ItemsSource = CheckResults; // spCheckResult.Children.Add(exp); // if (MaxHeight > 0) // MaxHeight = MaxHeight - 50; //} //labCheckMsg.Content = Msg.TrimEnd(";"); #endregion #region MyRegion //spCheckResult.Children.Clear(); //foreach (var item in m_Check.CheckGroup) //{ // Expander exp = new Expander(); // exp.Name = item.GroupName; // exp.DataContext = item; // exp.VerticalAlignment = VerticalAlignment.Stretch; // exp.Style = _ExpanderStyle; // exp.IsExpanded = true; // exp.SetBinding(Expander.HeaderProperty, new Binding("GroupDesc")); // ContextMenu cm = new ContextMenu(); // if (item.GroupName.StartsWith("城镇村与图斑边界套合性检查")) // { // MenuItem extBGTBItem = new MenuItem // { // Header = "提取为变更图斑,并标记203属性" // }; // extBGTBItem.Click += ExtBGTBItem_Click; // cm.Items.Add(extBGTBItem); // } // else if (item.GroupName.StartsWith("变更图斑拓扑检查")) // { // MenuItem mitem = new MenuItem // { // Header = "删除" // }; // mitem.Click += new RoutedEventHandler(Mitem_Click); // cm.Items.Add(mitem); // MenuItem titem = new MenuItem // { // Header = "合并" // }; // titem.Click += new RoutedEventHandler(Titem_Click); // cm.Items.Add(titem); // } // MenuItem sitem = new MenuItem // { // Header = "例外" // }; // sitem.Click += new RoutedEventHandler(Sitem_Click); // cm.Items.Add(sitem); // ListBox dg = new ListBox(); // dg.ContextMenu = cm; // dg.PreviewMouseDoubleClick += Dg_PreviewMouseDoubleClick;//双击 // dg.BorderThickness = new Thickness(0); // DataTemplate datatemplate = this.Resources["ItemNode"] as DataTemplate; // dg.ItemTemplate = datatemplate; // dg.VerticalAlignment = VerticalAlignment.Stretch; // dg.MaxHeight = 200; // dg.SetBinding(ListBox.ItemsSourceProperty, new Binding("CheckResults")); // exp.Content = dg; // spCheckResult.Children.Add(exp); //} #endregion } catch (Exception ex) { isFinishd = false; MessageHelper.Show("加载界面视图时发生错误,错误信息请查看系统日志!"); LogAPI.Debug("加载界面视图时发生异常,异常信息如下:"); LogAPI.Debug(ex); } finally { if (rdbHelper != null && rdbHelper.State != System.Data.ConnectionState.Closed) rdbHelper.DisConnect(); } } private void ExtBGTBItem_Click(object sender, RoutedEventArgs e) { try { List ts = new List(); IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); IFeatureLayer jcDLTB_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("JC_DLTB"); object obj = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedValue; int sd = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedIndex; if (obj != null) { if (!(obj is DataCheckResult result)) return; if (!string.IsNullOrWhiteSpace(result.ErrorArea)) { //result.ErrorArea = result.ErrorArea.Replace(".0,", ".0006,"); IGeometry geo = result.ErrorArea.ToGeometry(); if (geo != null && !geo.IsEmpty) { ITopologicalOperator topo = geo as ITopologicalOperator; topo.Simplify(); IGeometry tempGeo = topo.Buffer(-0.001); List bgFeatures = FeatureAPI.Identify(tempGeo, jcDLTB_Layer); IFeatureCursor insCursor = dltbbg_Layer.FeatureClass.Insert(true); for (int i = 0; i < bgFeatures.Count;) { IFeature jcFeature = bgFeatures[0]; IFeatureBuffer buf = dltbbg_Layer.FeatureClass.CreateFeatureBuffer(); buf.Shape = geo; for (int fIdx = 0; fIdx < jcFeature.Fields.FieldCount; fIdx++) { IField field = jcFeature.Fields.Field[fIdx]; if (!field.Editable || field.Name.ToUpper() == "SHAPE") continue; int bufIdx = buf.Fields.FindField(field.Name); if (bufIdx == -1) continue; if (field.Name.ToUpper() == "CZCSXM") { buf.Value[bufIdx] = result.ErrorData; } else { buf.Value[bufIdx] = jcFeature.Value[fIdx]; } } insCursor.InsertFeature(buf); insCursor.Flush(); DelDataCheck(result); ((((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).ItemsSource as List).RemoveAt(sd); (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).Items.Refresh(); Marshal.ReleaseComObject(jcFeature); MessageHelper.ShowTips("提取成功!"); return; } } } } } catch (Exception ex) { LogAPI.Debug(ex.Message); } } /// /// 修复-例外 /// /// /// private void Sitem_Click(object sender, RoutedEventArgs e) { try { string dbPath = System.IO.Path.Combine((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ProjDir, "DataCheckrResult.db"); object obj = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedValue; if (obj != null) { DataCheckResult result = obj as DataCheckResult; string sql = string.Format("UPDATE DataCheckResults SET ErrorType='{0}' WHERE ID='{1}'", EnumErrorType.例外, result.ID); SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, sql, null); result.ErrorType = EnumErrorType.例外; DataCheckRuleGroup group = ((((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).Parent as Expander).DataContext as DataCheckRuleGroup; group.UpdateInfo(null); MessageHelper.ShowTips("标记例外成功!"); } } catch (Exception ex) { LogAPI.Debug(ex.Message); MessageHelper.ShowTips("标记例外失败:" + ex.Message); } } private void Erase_Click(object sender, RoutedEventArgs e) { IGeometry geometry = null; IRDBHelper rdbHelper = null; try { IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); object obj = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedValue; if (obj != null) { string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); DataCheckResult result = obj as DataCheckResult; #region Topology if (result.ErrorCode == "32074304000007")//拓扑错误 { try { geometry = IPolygonExtension.ToGeometry(result.ErrorArea, true, esriGeometryType.esriGeometryPolygon); } catch { geometry = IPolygonExtension.ToGeometry(result.ErrorArea, false, esriGeometryType.esriGeometryPolyline); } if (geometry != null && geometry.IsEmpty) return; if (result.BSM == null || result.BSM == "") { MessageHelper.ShowError("此条标识码是空,未能找到对应矢量图斑,请设置后重试!"); return; } var OriginOID = result.BSM.Split('-')[0].ToInt(); var DestinationOID = result.BSM.Split('-')[1].ToInt(); IFeature OriginFC = dltbbg_Layer.FeatureClass.GetFeature(OriginOID); IFeature DestinationFC = dltbbg_Layer.FeatureClass.GetFeature(DestinationOID); if (geometry.GeometryType == esriGeometryType.esriGeometryPolyline) { var geo = RepairGeometry(OriginFC, geometry); IGeometry Union = FeatureAPI.Union(OriginFC.ShapeCopy, geo); OriginFC.Shape = Union; OriginFC.Store(); IGeometry difference = FeatureAPI.Difference(DestinationFC.ShapeCopy, Union);//擦除 DestinationFC.Shape = difference; DestinationFC.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={result.ID}"); } else if (geometry.GeometryType == esriGeometryType.esriGeometryPolygon && geometry.GetEllipseArea() < 20) { IGeometry Union = FeatureAPI.Union(OriginFC.Shape, geometry); List geoList = FeatureAPI.DissolveGeometryByRing(Union); if (geoList.Count > 1) { } OriginFC.Shape = Union; OriginFC.Store(); IGeometry difference = FeatureAPI.Difference(DestinationFC.Shape, Union);//擦除 geoList = FeatureAPI.DissolveGeometryByRing(difference); if (geoList.Count > 1) { } DestinationFC.Shape = difference; DestinationFC.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } } else if (result.ErrorCode == "32074304000006")//变更图斑与基础库联合出的错误 { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(TempfilePath, WorkspaceTypeEnum.GDBFile); IFeatureClassAPI featureClassAPI = workspaceAPI.OpenFeatureClass("Multipart"); geometry = featureClassAPI.GetFeature(result.PrimaryKeyValue2.ToInt()).ShapeCopy; if (geometry != null && geometry.IsEmpty) return; if (result.PrimaryKeyValue == "-1")//OBJECTID 为-1 的 需要与变更图斑合并 { var togologic = geometry as ITopologicalOperator; togologic.Simplify(); List bgFeatures = FeatureAPI.Identify(geometry, dltbbg_Layer); if (bgFeatures.Count == 1) { IGeometry geometrys = FeatureAPI.Union(bgFeatures[0].ShapeCopy, geometry); if (geometrys != null && !geometrys.IsEmpty) { bgFeatures[0].Shape = geometrys; bgFeatures[0].Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } } else if (bgFeatures.Count > 1) { //图形相邻与共边最长的图斑合并 IFeature UnionFeature = null; var Unionlength = 0.00; foreach (IFeature ifeature in bgFeatures) { var length = FeatureAPI.LengthOfSide(geometry, ifeature.Shape); if (length > Unionlength) { Unionlength = length; UnionFeature = ifeature; } } if (UnionFeature != null) { IGeometry geometrys = FeatureAPI.Union(UnionFeature.ShapeCopy, geometry); if (geometrys != null && !geometrys.IsEmpty) { UnionFeature.Shape = geometrys; UnionFeature.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } } } } else //OBJECTID >-1的 需要将碎图斑擦除 { IFeature OriginFC = dltbbg_Layer.FeatureClass.GetFeature(result.PrimaryKeyValue.ToInt()); List bgFeatures = FeatureAPI.Identify(geometry, dltbbg_Layer); if (bgFeatures.Count == 1) { OriginFC.Shape = FeatureAPI.Difference(OriginFC.ShapeCopy, geometry);//擦除 OriginFC.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } else if (bgFeatures.Count > 1) { //图形相邻与共边最长的图斑合并 IFeature UnionFeature = null; var Unionlength = 0.00; foreach (IFeature ifeature in bgFeatures) { if (ifeature.OID == result.PrimaryKeyValue.ToInt()) continue; var length = FeatureAPI.LengthOfSide(geometry, ifeature.Shape); if (length > Unionlength) { Unionlength = length; UnionFeature = ifeature; } } if (UnionFeature != null) { //IGeometry geometrys = FeatureAPI.Union(UnionFeature.ShapeCopy, geometry); //if (geometrys != null && !geometrys.IsEmpty) //{ OriginFC.Shape = FeatureAPI.Difference(OriginFC.ShapeCopy, geometry);//擦除 OriginFC.Store(); //UnionFeature.Shape = geometrys; //UnionFeature.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); //} } } } } #endregion } } catch (Exception) { } InitView(out bool isFinishd); //try //{ // string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; // object obj = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedValue; // if (obj != null) // { // DataCheckResult result = obj as DataCheckResult; // string sql = string.Format("UPDATE DataCheckResults SET ErrorType='{0}' WHERE ID='{1}'", EnumErrorType.例外, result.ID); // SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, sql, null); // MessageHelper.ShowTips("标记例外成功!"); // } //} //catch (Exception ex) //{ // LogAPI.Debug(ex.Message); // MessageHelper.ShowTips("属性修复失败:" + ex.Message); //} } /// /// 修复单条 /// /// /// private void RepairItem_Click(object sender, RoutedEventArgs e) { try { object obj = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedValue; int sum = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).Items.Count; int sd = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedIndex; if (obj == null) return; if (!(obj is DataCheckResult result)) return; string errorCode = result.ErrorCode.ToString(); string errorLayerEngish = result.ErrorLayer.ToString(); string errorBSM = result.BSM.ToString(); string errorDesc = result.ErrorDesc.ToString(); string objectId = result.ID.ToString(); string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; IRDBHelper rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); DataTable dicDt = rdbHelper.ExecuteDatatable("CheckingRule", string.Format($"SELECT * from CheckingRule where RuleCode = '{errorCode}' "), true); if (dicDt == null) return; foreach (DataRow row in dicDt.Rows) { string repairSql = row["RepairSQL"].ToString(); if (string.IsNullOrWhiteSpace(repairSql) || string.IsNullOrEmpty(repairSql)) continue; repairSql = string.Format(repairSql, errorLayerEngish, errorBSM, (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE); IFeatureLayer errorFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(errorLayerEngish); (errorFeatureLayer as FeatureClass).Workspace.ExecuteSQL(repairSql); DelDataCheck(result); result.ErrorType = EnumErrorType.已修复; ((((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).ItemsSource as List).RemoveAt(sd); (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).Items.Refresh(); rdbHelper.ExecuteSQL($"delete from DataCheckResults where ID = '{objectId}' "); } } catch (Exception ex) { LogAPI.Debug(ex.Message); MessageHelper.ShowTips("修复失败,请查看日志!"); } } /// /// 修复-合并 /// /// /// private void Merge_Click(object sender, RoutedEventArgs e) { V_Repair.FrmBGFeaterMerge bGFeaterMerge = null; IRDBHelper rdbHelper = null; try { IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); object obj = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedValue; string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); if (obj != null) { DataCheckResult result = obj as DataCheckResult; if (result.BSM.Contains("-"))//相交图形合并 { var OriginOID = result.BSM.Split('-')[0].ToInt(); var DestinationOID = result.BSM.Split('-')[1].ToInt(); IFeature OriginFC = dltbbg_Layer.FeatureClass.GetFeature(OriginOID); IFeature DestinationFC = dltbbg_Layer.FeatureClass.GetFeature(DestinationOID); List bgFeatures = new List(); bgFeatures.Add(OriginFC); bgFeatures.Add(DestinationFC); bGFeaterMerge = new V_Repair.FrmBGFeaterMerge(); bGFeaterMerge.GetViewData(bgFeatures, result); bGFeaterMerge.WindowStartupLocation = WindowStartupLocation.CenterScreen; bGFeaterMerge.Closed += (s1, e1) => { if (bGFeaterMerge.IsMerge)//是否合并成功 { rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={result.ID}"); } }; bGFeaterMerge.ShowInMainForm(false); //if (MessageHelper.ShowYesNoAndTips($"确定变更图斑【OBJECTID={OriginOID}】与变更图斑【OBJECTID={DestinationOID}】合并?") == System.Windows.Forms.DialogResult.Yes) //{ // IGeometry geometrys = FeatureAPI.Union(OriginFC.ShapeCopy, DestinationFC.ShapeCopy); // OriginFC.Shape = geometrys; // OriginFC.Store(); // ITable dltbbg = dltbbg_Layer.FeatureClass as ITable; // dltbbg.DeleteSearchedRows(new QueryFilterClass() { WhereClause = $"OBJECTID ={DestinationOID}" }); // rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={result.ID}"); //} } else if (!string.IsNullOrWhiteSpace(result.ErrorArea)) { IWorkspaceAPI wsAPI = new WorkspaceAPI(result.RepairfilePath, WorkspaceTypeEnum.GDBFile); IFeatureClassAPI featureClassAPI = wsAPI.OpenFeatureClass("Multipart"); var MultipartOID = result.PrimaryKeyValue2.ToInt(); IFeature f = featureClassAPI.GetFeature(MultipartOID); IGeometry geo = f.ShapeCopy; if (geo != null && !geo.IsEmpty) { List bgFeatures = FeatureAPI.Identify(geo, dltbbg_Layer); if (bgFeatures.Count > 0) { bGFeaterMerge = new V_Repair.FrmBGFeaterMerge(); bGFeaterMerge.GetViewData(bgFeatures, result); bGFeaterMerge.WindowStartupLocation = WindowStartupLocation.CenterScreen; bGFeaterMerge.ShowInMainForm(false); return; } } //if (bgFeatures.Count == 1) //{ // if (FeatureAPI.IsAdjacent(bgFeatures[0].ShapeCopy, geo) && !FeatureAPI.IsContains(bgFeatures[0].ShapeCopy, geo)) // { // if (MessageHelper.ShowYesNoAndTips(string.Format("确定变更图斑【OBJECTID={0}】与零碎图斑合并?", bgFeatures[0].OID)) == System.Windows.Forms.DialogResult.Yes) // { // int FOID = bgFeatures[0].OID; // IGeometry geometrys = FeatureAPI.Union(bgFeatures[0].Shape, geo); // bgFeatures[0].Shape = geometrys; // bgFeatures[0].Store(); // //刷新数据 // //((listBoxItem as ListBox).ItemsSource as List).RemoveAt(sd); // (listBoxItem as ListBox).Items.Refresh(); // DelDataCheck(result);//删除数据 // result.ErrorType = EnumErrorType.已修复; // //刷新组头部信息 // DataCheckRuleGroup group = (assa as Expander).DataContext as DataCheckRuleGroup; // group.UpdateInfo(null); // MessageHelper.ShowTips(string.Format("变更图斑【OBJECTID={0}】与零碎图斑合并成功!", FOID)); // } // } // else // { // MessageHelper.ShowTips("合并失败,选择的图斑可能为不相邻或包含关系!"); // } //} //else //{ // for (int i = 0; i < bgFeatures.Count; i++) // { // if (!FeatureAPI.IsContains(bgFeatures[i].ShapeCopy, geo) && FeatureAPI.IsAdjacent(bgFeatures[i].ShapeCopy, geo)) // { // if (bGFeaterMerge == null) // { // bGFeaterMerge = new V_Repair.FrmBGFeaterMerge(); // bGFeaterMerge.GetViewData(bgFeatures, result); // bGFeaterMerge.WindowStartupLocation = WindowStartupLocation.CenterScreen; // bGFeaterMerge.Closed += (s1, e1) => // { // if (bGFeaterMerge.IsMerge)//是否合并成功 // { // //((listBoxItem as ListBox).ItemsSource as List).RemoveAt(sd); // (listBoxItem as ListBox).Items.Refresh(); // DelDataCheck(result);//删除数据 // result.ErrorType = EnumErrorType.已修复; // DataCheckRuleGroup group = ((listBoxItem as ListBox).Parent as Expander).DataContext as DataCheckRuleGroup; // group.UpdateInfo(null); // } // }; // bGFeaterMerge.ShowInMainForm(false); // return; // } // } // } //} //} } } } catch (Exception ex) { LogAPI.Debug(ex.Message); MessageHelper.ShowTips("合并图斑失败,请查看日志!"); } } #region 删除 private void Delete_Click(object sender, RoutedEventArgs e) { IRDBHelper rdbHelper = null; try { string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); object obj = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedValue; int sd = (((sender as MenuItem).Parent as ContextMenu).PlacementTarget as ListBox).SelectedIndex; if (obj != null) { DataCheckResult result = obj as DataCheckResult; if (result.BSM == null || result.BSM == "") { MessageHelper.ShowError("此条标识码是空,未能找到对应矢量图斑,请设置后重试!"); return; } var OriginOID = result.BSM.Split('-')[0].ToInt(); var DestinationOID = result.BSM.Split('-')[1].ToInt(); if (MessageHelper.ShowYesNoAndTips(string.Format("确认删除变更图斑【OBJECTID={0}】?", DestinationOID)) == System.Windows.Forms.DialogResult.Yes) { ITable dltbbg = dltbbg_Layer.FeatureClass as ITable; dltbbg.DeleteSearchedRows(new QueryFilterClass() { WhereClause = $"OBJECTID ={DestinationOID}" }); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={result.ID}"); InitView(out bool isFinishd); } } } catch (Exception ex) { LogAPI.Debug($"删除图斑失败:{ex.Message}"); LogAPI.Debug(ex); MessageHelper.ShowTips("删除图斑失败,请查看日志!"); } } #endregion /// /// 删除擦除后数据 /// /// public void DelDataCheck(DataCheckResult result) { try { string dbPath = System.IO.Path.Combine((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ProjDir, "DataCheckrResult.db"); string sql = string.Format("update DataCheckResults set ErrorType='已修复' where ID = '{0}'", result.ID); SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, sql, null); } catch (Exception ex) { LogAPI.Debug("删除数据失败:" + ex.Message); } } /// /// 双击高亮 /// /// /// private void Dg_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { try { object obj = (sender as ListBox).SelectedValue; if (obj != null) { DataCheckResult result = obj as DataCheckResult; if (result == null) return; if (result.BSM.Contains("-")) { IFeature feature = GetErrorFeatures(result.RepairfilePath, result.BSM.Split('-')[0].ToInt(), result.BSM.Split('-')[1].ToInt()); { if (feature != null) { IGeometry geometry = feature.ShapeCopy; if (geometry != null && !geometry.IsEmpty) { MapsManager.Instance.MapService.DrawGraph(geometry, true); MapsManager.Instance.MapService.Zoom(geometry); return; } } } } else if (!string.IsNullOrEmpty(result.PrimaryKeyValue2)) { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(result.RepairfilePath, WorkspaceTypeEnum.GDBFile); IFeatureClassAPI featureClassAPI = workspaceAPI.OpenFeatureClass("Multipart"); IGeometry geometry = featureClassAPI.GetFeature(result.PrimaryKeyValue2.ToInt()).ShapeCopy; if (geometry != null && !geometry.IsEmpty) { MapsManager.Instance.MapService.DrawGraph(geometry, true); MapsManager.Instance.MapService.Zoom(geometry); return; } } else if (!string.IsNullOrWhiteSpace(result.ErrorArea)) { IGeometry geometry = null; try { geometry = IPolygonExtension.ToGeometry(result.ErrorArea, true, esriGeometryType.esriGeometryPolygon); } catch { geometry = IPolygonExtension.ToGeometry(result.ErrorArea, false, esriGeometryType.esriGeometryPolyline); } if (geometry != null && !geometry.IsEmpty) { MapsManager.Instance.MapService.DrawGraph(geometry, true); MapsManager.Instance.MapService.Zoom(geometry); } } else { if (!string.IsNullOrWhiteSpace(result.BSM) && !string.IsNullOrWhiteSpace(result.ErrorLayer)) { var layer = MapsManager.Instance.MapService.GetFeatureClassByName(result.ErrorLayer); if (layer != null && layer.FeatureCount(null) > 0) { IFeatureCursor pCursor = null; pCursor = layer.Search(new QueryFilterClass() { WhereClause = $"BSM='{result.BSM}' " }, true); IFeature feature = pCursor.NextFeature(); if (feature != null) MapsManager.Instance.MapService.SelectFeature(result.ErrorLayer, feature.OID.ToString()); } } else if (string.IsNullOrWhiteSpace(result.ErrorLayer) || string.IsNullOrWhiteSpace(result.PrimaryKey) || string.IsNullOrWhiteSpace(result.PrimaryKeyValue)) return; else if (result.PrimaryKey.ToUpper() == "OBJECTID") { MapsManager.Instance.MapService.SelectFeature(result.ErrorLayer, result.PrimaryKeyValue); } } } } catch (Exception ex) { LogAPI.Debug("Dg_PreviewMouseDoubleClick错误:" + ex.Message); } } public IFeature GetErrorFeatures(string RepairfilePath, int OriginOID, int DestinationOID) { IFeature pFeature = null; try { string fcName = "DLTBBG"; string topoName = "TopologyCheck_DLTBBG"; if (_CheckName == "基础图斑") { fcName = "DLTB"; topoName = "TopologyCheck_DLTB"; } IWorkspaceAPI workspaceAPI = new WorkspaceAPI(RepairfilePath, WorkspaceTypeEnum.GDBFile); var api = workspaceAPI.OpenFeatureClass(fcName); IFeatureDataset featureDataset = api.FeatureClass.FeatureDataset; ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset; ITopology topology = topologyContainer.get_TopologyByName(topoName); IErrorFeatureContainer errorFeatureContainer = (IErrorFeatureContainer)topology; IGeoDataset geoDataset = (IGeoDataset)topology; ISpatialReference spatialReference = geoDataset.SpatialReference; ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology; bool bTopExists = (featureDataset.Workspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTTopology, topoName); if (bTopExists) { var topologyErrorFeature = errorFeatureContainer.get_ErrorFeature(spatialReference, esriTopologyRuleType.esriTRTAreaNoOverlap, esriGeometryType.esriGeometryPolygon, api.FeatureClass.ObjectClassID, OriginOID, api.FeatureClass.ObjectClassID, DestinationOID); if (topologyErrorFeature == null) topologyErrorFeature = errorFeatureContainer.get_ErrorFeature(spatialReference, esriTopologyRuleType.esriTRTAreaNoOverlap, esriGeometryType.esriGeometryPolyline, api.FeatureClass.ObjectClassID, OriginOID, api.FeatureClass.ObjectClassID, DestinationOID); pFeature = topologyErrorFeature as IFeature; } } catch (Exception ex) { } return pFeature; } public IFeature GetErrorFeatures(string RepairfilePath, int OriginOID, int DestinationOID, string fcName, string topoName) { IFeature pFeature = null; try { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(RepairfilePath, WorkspaceTypeEnum.GDBFile); var api = workspaceAPI.OpenFeatureClass(fcName); IFeatureDataset featureDataset = api.FeatureClass.FeatureDataset; ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset; ITopology topology = topologyContainer.get_TopologyByName(topoName); IErrorFeatureContainer errorFeatureContainer = (IErrorFeatureContainer)topology; IGeoDataset geoDataset = (IGeoDataset)topology; ISpatialReference spatialReference = geoDataset.SpatialReference; ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology; bool bTopExists = (featureDataset.Workspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTTopology, topoName); if (bTopExists) { var topologyErrorFeature = errorFeatureContainer.get_ErrorFeature(spatialReference, esriTopologyRuleType.esriTRTAreaNoOverlap, esriGeometryType.esriGeometryPolygon, api.FeatureClass.ObjectClassID, OriginOID, api.FeatureClass.ObjectClassID, DestinationOID); if (topologyErrorFeature == null) topologyErrorFeature = errorFeatureContainer.get_ErrorFeature(spatialReference, esriTopologyRuleType.esriTRTAreaNoOverlap, esriGeometryType.esriGeometryPolyline, api.FeatureClass.ObjectClassID, OriginOID, api.FeatureClass.ObjectClassID, DestinationOID); pFeature = topologyErrorFeature as IFeature; } } catch (Exception ex) { } return pFeature; } public bool IsShowInMap { get; set; } public Guid ID { get; set; } public DockStyle DockAreas { get; set; } public System.Drawing.Size FloatSize { get; set; } public int DockWidth { get; set; } public int DockHeight { get; set; } public DockStyle DefaultArea { get; set; } public bool ShowCloseButton { get; set; } public bool ShowAutoHideButton { get; set; } public string Title { get; set; } public IDataCheck IDataCheck { get; set; } public List IdataChecks { get; set; } public event EventHandler CloseViewHandler; public void ShowPanel() { Platform.Instance.OpenView(this, false); if (MapsManager.Instance.MapService != null) { MapsManager.Instance.MapService.ProjectClosed += (sender, e) => { ClosePanel(); }; } } public void ClosePanel() { Platform.Instance.CloseView(this); } public void ClosePanelInvoke() { CloseViewHandler?.Invoke(this, null); } private string CreateTempDB(string mPrjDbPath, string pTargetFolder) { string result = System.IO.Path.Combine(pTargetFolder, "Temp" + ".sqlite"); try { //string dbPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Temp" + ".db"); string dbPath = mPrjDbPath; if (!Directory.Exists(pTargetFolder)) Directory.CreateDirectory(pTargetFolder); //try //{ // DelectDirect(pTargetFolder); //} //catch //{ // //删除临时数据异常 不做处理 //} if (File.Exists(dbPath)) { File.Copy(dbPath, result, true); } else { Console.WriteLine(string.Format("文件{0}不存在!", dbPath)); } //result;// System.IO.Path.Combine(path, "TempGDB.gdb");//临时数据存放路径 } catch (Exception ex) { Console.WriteLine("创建临时数据库失败!" + ex.Message); throw ex; } return result; } List sqlList = null; private void BtnSetCheckState_Click(object sender, RoutedEventArgs e) { (sender as Button).IsEnabled = false; ExtensionShowWindow.MainWinForm.Enabled = false; IRDBHelper rdbHelper = null; IRDBHelper errdbHelper = null; IFeatureCursor cursur = null; IFeature f = null; try { this.ShowLoading($"正在进行【{_CheckName}】数据检查...", 0, 0); ProjectInfo prjInfo = MapsManager.Instance.CurrProjectInfo as ProjectInfo; IDGParameter Parm = new IDGParameter(); Parm.StrProjInfo = System.IO.Path.Combine(prjInfo.ProjDir, prjInfo.ProjName + prjInfo.ProjSuffix); string mOutLocation = string.Empty; FileInfo fInfo = null; if (_CheckName == "变更图斑") { Parm.CheckType = "BGDB"; if (!Directory.Exists(prjInfo.BGDatabase) && !File.Exists(prjInfo.BGDatabase)) { Console.WriteLine("参数路径不存在!"); MessageHelper.ShowWarning("参数路径不存在!请先创建变更数据库!"); return; } fInfo = new FileInfo(prjInfo.BGDatabase); } else if (_CheckName == "增量图斑") { Parm.CheckType = "ZLDB"; if (!Directory.Exists(prjInfo.ZLDatabase) && !File.Exists(prjInfo.ZLDatabase)) { Console.WriteLine("参数路径不存在!"); MessageHelper.ShowWarning("参数路径不存在!请先创建增量数据库!"); return; } fInfo = new FileInfo(prjInfo.ZLDatabase); } string dbPrjPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; #region 将图层数据写入到db中 rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPrjPath, DatabaseType.SQLite); string Sqlwhere = " where 1=2 "; if (_CheckName == "变更图斑") Sqlwhere = " where BGIsSelect=true and BGLayerName NOTNULL "; else if (_CheckName == "增量图斑") Sqlwhere = " where ZLIsSelect=true AND BGLayerName ISNULL AND RuleType='图形拓扑'"; else if (_CheckName == "基础图斑") Sqlwhere = " where ImplementSQL='Topology_JCDLTB' AND RuleType='图形拓扑' "; DataTable dataTable = rdbHelper.ExecuteDatatable("tab", $" SELECT * from CheckingRule {Sqlwhere} ", true); if (dataTable == null || dataTable.Rows.Count == 0) { MessageHelper.ShowTips("至少要在系统设置中,选择图形括扑中的一条!"); return; } CopyTable(rdbHelper, dbPrjPath, dataTable); #endregion if (dataTable.Rows.Count > 0) rdbHelper.ExecuteSQL("delete from DataCheckResults "); if (_CheckName != "基础图斑" && _CheckName != "增量图斑") { this.UpdateMsg($"正在进行【{_CheckName}】数据GP检查..."); mOutLocation = System.IO.Path.Combine(fInfo.DirectoryName, "DataCheck", Parm.CheckType); if (Directory.Exists(mOutLocation)) { DelectDirect(mOutLocation); } else { Directory.CreateDirectory(mOutLocation); } StopProcess("KDataCheck"); StopProcess("GPHelper"); mOutLocation = System.IO.Path.Combine(mOutLocation, DateTime.Now.ToString("yyyyMMddHHmmssfff")); string tempdbPath = CreateTempDB(dbPrjPath, mOutLocation); Parm.OutLocation = mOutLocation; Parm.TempdbPath = tempdbPath; Parm.PrjDbPath = dbPrjPath; ProcesHelper.Instance.ExeGPForProces(Parm); } sqlList = new List(); string LayerName = string.Empty; //变更图斑图层名称 string Alias = string.Empty;//别名 List list = new List(); Dictionary> ThreadParamDic = new Dictionary>(); List errorList = new List(); var ImplementSQL = string.Empty; var RuleCode = string.Empty; var RuleType = string.Empty; var RuleName = string.Empty; DataTable dt = null; string sqlStr = null; int i = 0; this.UpdateMsg($"正在进行【{_CheckName}】数据逻辑检查..."); foreach (DataRow row in dataTable.Rows) { if (sqlList.Count > 10000) { InsertSQLiteData(dbPrjPath, sqlList); sqlList.Clear(); } if (errorList != null) errorList.Clear(); ImplementSQL = row["ImplementSQL"].ToTrim();//执行语句 LogAPI.Debug(ImplementSQL); if (_CheckName != "基础图斑" && ImplementSQL == "Topology_JCDLTB") continue; RuleCode = row["RuleCode"].ToTrim();//规则编码 RuleType = row["RuleType"].ToTrim();//规则类别 RuleName = row["RuleName"].ToTrim();//规则名称 try { if (_CheckName == "变更图斑" || _CheckName == "基础图斑") { LayerName = row["BGLayerName"].ToTrim().Split('_')[0]; Alias = row["BGLayerName"].ToTrim().Split('_')[1]; } else if (_CheckName == "增量图斑") { LayerName = row["ZLLayerName"].ToTrim().Split('_')[0]; Alias = row["ZLLayerName"].ToTrim().Split('_')[1]; } switch (ImplementSQL) { case "SameGraphic"://无变化和灭失要素的图形与基础库对应图形一致 GetJCLayerName(LayerName, out string JCLayerName); errorList = SameGraphic(LayerName, JCLayerName, RuleCode, RuleName, mOutLocation); if (errorList != null) sqlList.AddRange(errorList); break; case "SameBSM"://无变化、灭失的标识码与基础库界线标识码一致 GetJCLayerName(LayerName, out string JcLayerName); errorList = SameBSM(LayerName, JcLayerName, RuleCode, RuleName, mOutLocation); if (errorList != null) sqlList.AddRange(errorList); break; case "LMFWGXKD"://路面范围更新层KD取值大于等于0,且不能为空值(允许新增道路不填宽度) errorList = JudgeNewRoad(LayerName, "LMFW", RuleCode, RuleName, RuleType); if (errorList != null) sqlList.AddRange(errorList); break; case "SameGDPDJB"://地类图斑更新层耕地图斑GDPDJB字段取值与对应 坡度图更新层 或 坡度图层 PDJB字段取值一致 errorList = SameGDPDJB(LayerName, RuleName.Contains("坡度图更新层") ? "PDTGX" : "PDT", RuleCode, RuleName, RuleType); if (errorList != null) sqlList.AddRange(errorList); break; case "Topology_JCDLTB"://基础地类图斑重叠,缝隙 errorList = GetTopology_DLTB(RuleCode); if (errorList != null) sqlList.AddRange(errorList); break; case "Topology"://增量图斑重叠 errorList = GetTopology_DLTBBG(RuleCode, LayerName); if (errorList != null) sqlList.AddRange(errorList); break; case "LineNoDangles"://悬挂线 errorList = LineNoDangles(RuleCode, LayerName, Alias); if (errorList != null) sqlList.AddRange(errorList); break; default: #region 源代码 if (string.IsNullOrEmpty(ImplementSQL) || !ImplementSQL.ToLower().Contains("select")) continue; IFeatureClass featureClass = MapsManager.Instance.MapService.GetFeatureClassByName(LayerName); if (featureClass == null) continue; errdbHelper = RDBFactory.CreateDbHelper("Data Source=" + Parm.PrjDbPath, DatabaseType.SQLite); dt = errdbHelper.ExecuteDatatable("tab", string.Format(ImplementSQL, LayerName, Alias, RuleCode, RuleType, prjInfo.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-_()()]") ) { if (item["BSM"] == null || string.IsNullOrEmpty(item["BSM"].ToString())) sqlStr = $" (BSM is null or BSM = '' or BSM = ' ') "; else sqlStr = $" BSM = '{item["BSM"]}' "; cursur = featureClass.Search(new QueryFilterClass() { WhereClause = sqlStr }, true); while ((f = cursur.NextFeature()) != null) { sqlList.Add(string.Format("INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}');", item["ObjectID"], item["BSM"], item["ErrorLayer"], item["ErrorCode"], item["ErrorName"], item["RuleType"], f.Shape.ToJson())); } } continue; } if (item["BSM"] == null || string.IsNullOrEmpty(item["BSM"].ToString())) sqlStr = $" (BSM is null or BSM = '' or BSM = ' ') "; else sqlStr = $" BSM = '{item["BSM"]}' "; cursur = featureClass.Search(new QueryFilterClass() { WhereClause = sqlStr }, true); string CheckFeatureClassName = featureClass.AliasName; while ((f = cursur.NextFeature()) != null) { sqlList.Add(string.Format("INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}');", item["ObjectID"], item["BSM"], item["ErrorLayer"], item["ErrorCode"], item["ErrorName"], item["RuleType"])); } } } #endregion break; } } catch (Exception ex) { LogAPI.Debug($"错误代码【{RuleCode}】对应的查询语句错误:[{ex.Message}]"); continue; } } this.UpdateMsg($"正在进行【{_CheckName}】数据检查..."); InsertSQLiteData(dbPrjPath, sqlList); this.UpdateMsg($"正在进行【{_CheckName}】数据检查..."); InitView(out bool isFinishd); this.CloseLoading(); if (isFinishd) { MapRefreshView.OnCreate(m_hookHelper.Hook); MapRefreshView.OnClick(); MessageHelper.ShowTips("数据检查完成。"); } } catch (Exception ex) { MessageHelper.ShowError("数据检查时发生异常,详情请查看系统日志!"); LogAPI.Debug("数据检查时发生异常,异常信息如下:"); LogAPI.Debug(ex); } finally { this.CloseLoading(); (sender as Button).IsEnabled = true; ExtensionShowWindow.MainWinForm.Enabled = true; if (rdbHelper != null && rdbHelper.State != ConnectionState.Closed) rdbHelper.DisConnect(); if (errdbHelper != null && errdbHelper.State != ConnectionState.Closed) errdbHelper.DisConnect(); if (cursur != null) Marshal.ReleaseComObject(cursur); if (f != null) Marshal.ReleaseComObject(f); StopProcess("KDataCheck"); } } private void CopyTable(IRDBHelper rdbHelper, string dbPrjPath, DataTable dataTable) { IFeatureClass DLTBBG = null; IFeatureClass CCWJQGX = null; IWorkspaceFactory pOutWorkFactory = new SqlWorkspaceFactoryClass(); try { IWorkspace pOutWork = pOutWorkFactory.OpenFromFile(dbPrjPath, 0); if (_CheckName == "变更图斑") { #region 变更图斑 DLTBBG = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG"); //JudgeNullBSMAssign(DLTBBG); if (DLTBBG != null) { Geoprocessor gp = new Geoprocessor(); gp.OverwriteOutput = true; CalculateField calc = new CalculateField(); calc.in_table = DLTBBG; calc.field = "BSM"; calc.expression = "!OBJECTID!"; calc.expression_type = "PYTHON"; gp.Execute(calc, null); rdbHelper.ExecuteSQL(" Drop Table DLTBBG"); TableToTable((DLTBBG as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "DLTBBG"); //CopyTableToDB((DLTBBG as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "DLTBBG"); } #endregion } else if (_CheckName == "增量图斑") { #region 拆除未尽区更新层 if (dataTable.Select(" LayerName='拆除未尽区更新层' ").Length > 0) { CCWJQGX = MapsManager.Instance.MapService.GetFeatureClassByName("CCWJQGX"); rdbHelper.ExecuteSQL(" Drop Table CCWJQGX"); if (CCWJQGX != null && CCWJQGX.FeatureCount(null) != 0) { TableToTable((CCWJQGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "CCWJQGX"); //CopyTableToDB((CCWJQGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "CCWJQGX"); } } #endregion #region 城镇村等用地更新层 if (dataTable.Select(" LayerName='城镇村等用地更新层' ").Length > 0) { IFeatureClass CZCDYDGX = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX"); rdbHelper.ExecuteSQL(" Drop Table CZCDYDGX"); if (CZCDYDGX != null && CZCDYDGX.FeatureCount(null) != 0) { TableToTable((CZCDYDGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "CZCDYDGX"); //CopyTableToDB((CZCDYDGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "CZCDYDGX"); } } #endregion #region 城镇村等用地更新过程层 if (dataTable.Select(" LayerName='城镇村等用地更新过程层' ").Length > 0) { IFeatureClass CZCDYDGXGC = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGXGC"); rdbHelper.ExecuteSQL(" Drop Table CZCDYDGXGC"); if (CZCDYDGXGC != null && CZCDYDGXGC.FeatureCount(null) != 0) { TableToTable((CZCDYDGXGC as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "CZCDYDGXGC"); //CopyTableToDB((CZCDYDGXGC as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "CZCDYDGXGC"); } } #endregion #region 村级调查区更新层 if (dataTable.Select(" LayerName='村级调查区更新层' ").Length > 0) { IFeatureClass CJDCQGX = MapsManager.Instance.MapService.GetFeatureClassByName("CJDCQGX"); rdbHelper.ExecuteSQL(" Drop Table CJDCQGX"); if (CJDCQGX != null && CJDCQGX.FeatureCount(null) != 0) { TableToTable((CJDCQGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "CJDCQGX"); //CopyTableToDB((CJDCQGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "CJDCQGX"); } } #endregion #region 村级调查区更新过程层 if (dataTable.Select(" LayerName='村级调查区更新过程层' ").Length > 0) { IFeatureClass CJDCQGXGC = MapsManager.Instance.MapService.GetFeatureClassByName("CJDCQGXGC"); rdbHelper.ExecuteSQL(" Drop Table CJDCQGXGC"); if (CJDCQGXGC != null && CJDCQGXGC.FeatureCount(null) != 0) { TableToTable((CJDCQGXGC as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "CJDCQGXGC"); //CopyTableToDB((CJDCQGXGC as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "CJDCQGXGC"); } } #endregion #region 村级调查区界线更新层 if (dataTable.Select(" LayerName='村级调查区界线更新层' ").Length > 0) { IFeatureClass CJDCQJXGX = MapsManager.Instance.MapService.GetFeatureClassByName("CJDCQJXGX"); rdbHelper.ExecuteSQL(" Drop Table CJDCQJXGX"); if (CJDCQJXGX != null && CJDCQJXGX.FeatureCount(null) != 0) { TableToTable((CJDCQJXGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "CJDCQJXGX"); //CopyTableToDB((CJDCQJXGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "CJDCQJXGX"); } if (dataTable.Select(" Requirement like '%基础库%' ").Length > 0) { IFeatureClass CJDCQJX = MapsManager.Instance.MapService.GetFeatureClassByName("CJDCQJX"); rdbHelper.ExecuteSQL(" Drop Table CJDCQJX"); if (CJDCQJX != null && CJDCQJX.FeatureCount(null) != 0) { TableToTable((CJDCQJX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "CJDCQJX"); //CopyTableToDB((CJDCQJX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "CJDCQJX"); } } } #endregion #region 地类图斑更新层 if (dataTable.Select(" LayerName='地类图斑更新层' ").Length > 0) { IFeatureClass DLTBGX = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGX"); rdbHelper.ExecuteSQL(" Drop Table DLTBGX"); if (DLTBGX != null && DLTBGX.FeatureCount(null) != 0) { TableToTable((DLTBGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "DLTBGX"); //CopyTableToDB((DLTBGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "DLTBGX"); } if (dataTable.Select(" RuleName like '%坡度图更新层%' ").Length > 0) { IFeatureClass PDTGX = MapsManager.Instance.MapService.GetFeatureClassByName("PDTGX"); rdbHelper.ExecuteSQL(" Drop Table PDTGX"); if (PDTGX != null && PDTGX.FeatureCount(null) != 0) { TableToTable((PDTGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "PDTGX"); //CopyTableToDB((PDTGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "PDTGX"); } } if (dataTable.Select(" RuleName like '%坡度图层%' ").Length > 0) { IFeatureClass PDT = MapsManager.Instance.MapService.GetFeatureClassByName("PDT"); rdbHelper.ExecuteSQL(" Drop Table PDT"); if (PDT != null && PDT.FeatureCount(null) != 0) { TableToTable((PDT as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "PDT"); //CopyTableToDB((PDT as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "PDT"); } } } #endregion #region 地类图斑更新过程层 if (dataTable.Select(" LayerName='地类图斑更新过程层' ").Length > 0) { IFeatureClass DLTBGXGC = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGXGC"); rdbHelper.ExecuteSQL(" Drop Table DLTBGXGC"); if (DLTBGXGC != null && DLTBGXGC.FeatureCount(null) != 0) { TableToTable((DLTBGXGC as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "DLTBGXGC"); //CopyTableToDB((DLTBGXGC as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "DLTBGXGC"); } } #endregion #region 耕地等别更新层 if (dataTable.Select(" LayerName='耕地等别更新层' ").Length > 0) { IFeatureClass GDDBGX = MapsManager.Instance.MapService.GetFeatureClassByName("GDDBGX"); rdbHelper.ExecuteSQL(" Drop Table GDDBGX"); if (GDDBGX != null && GDDBGX.FeatureCount(null) != 0) { TableToTable((GDDBGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "GDDBGX"); //CopyTableToDB((GDDBGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "GDDBGX"); } } #endregion #region 光伏板区更新层 if (dataTable.Select(" LayerName='光伏板区更新层' ").Length > 0) { IFeatureClass GFBQGX = MapsManager.Instance.MapService.GetFeatureClassByName("GFBQGX"); rdbHelper.ExecuteSQL(" Drop Table GFBQGX"); if (GFBQGX != null && GFBQGX.FeatureCount(null) != 0) { TableToTable((GFBQGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "GFBQGX"); //CopyTableToDB((GFBQGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "GFBQGX"); } } #endregion #region 路面范围更新层 if (dataTable.Select(" LayerName='路面范围更新层' ").Length > 0) { IFeatureClass LMFWGX = MapsManager.Instance.MapService.GetFeatureClassByName("LMFWGX"); rdbHelper.ExecuteSQL(" Drop Table LMFWGX"); if (LMFWGX != null && LMFWGX.FeatureCount(null) != 0) { TableToTable((LMFWGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "LMFWGX"); //CopyTableToDB((LMFWGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "LMFWGX"); } if (dataTable.Select(" Requirement like '%KD取值%' ").Length > 0) { IFeatureClass LMFW = MapsManager.Instance.MapService.GetFeatureClassByName("LMFW"); rdbHelper.ExecuteSQL(" Drop Table LMFW"); if (LMFW != null && LMFW.FeatureCount(null) != 0) { TableToTable((LMFW as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "LMFW"); //CopyTableToDB((LMFW as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "LMFW"); } } } #endregion #region 推土区更新层 if (dataTable.Select(" LayerName='推土区更新层' ").Length > 0) { IFeatureClass TTQGX = MapsManager.Instance.MapService.GetFeatureClassByName("TTQGX"); rdbHelper.ExecuteSQL(" Drop Table TTQGX"); if (TTQGX != null && TTQGX.FeatureCount(null) != 0) { TableToTable((TTQGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "TTQGX"); //CopyTableToDB((TTQGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "TTQGX"); } } #endregion #region 行政区更新层 if (dataTable.Select(" LayerName='行政区更新层' ").Length > 0) { IFeatureClass XZQGX = MapsManager.Instance.MapService.GetFeatureClassByName("XZQGX"); rdbHelper.ExecuteSQL(" Drop Table XZQGX"); if (XZQGX != null && XZQGX.FeatureCount(null) != 0) { TableToTable((XZQGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "XZQGX"); //CopyTableToDB((XZQGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "XZQGX"); } } #endregion #region 行政区更新过程层 if (dataTable.Select(" LayerName='行政区更新过程层' ").Length > 0) { IFeatureClass XZQGXGC = MapsManager.Instance.MapService.GetFeatureClassByName("XZQGXGC"); rdbHelper.ExecuteSQL(" Drop Table XZQGXGC"); if (XZQGXGC != null && XZQGXGC.FeatureCount(null) != 0) { TableToTable((XZQGXGC as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "XZQGXGC"); //CopyTableToDB((XZQGXGC as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "XZQGXGC"); } } #endregion #region 行政区界线更新层 if (dataTable.Select(" LayerName='行政区界线更新层' ").Length > 0) { IFeatureClass XZQJXGX = MapsManager.Instance.MapService.GetFeatureClassByName("XZQJXGX"); rdbHelper.ExecuteSQL(" Drop Table XZQJXGX"); if (XZQJXGX != null && XZQJXGX.FeatureCount(null) != 0) { TableToTable((XZQJXGX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "XZQJXGX"); //CopyTableToDB((XZQJXGX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "XZQJXGX"); } if (dataTable.Select(" Requirement like '%基础库%' ").Length > 0) { IFeatureClass XZQJX = MapsManager.Instance.MapService.GetFeatureClassByName("XZQJX"); rdbHelper.ExecuteSQL(" Drop Table XZQJX"); if (XZQJX != null && XZQJX.FeatureCount(null) != 0) { TableToTable((XZQJX as FeatureClass).Workspace as IFeatureWorkspace, pOutWork, "XZQJX"); //CopyTableToDB((XZQJX as FeatureClass).Workspace as IFeatureWorkspace, rdbHelper, "XZQJX"); } } } #endregion } } catch (Exception ex) { LogAPI.Debug(ex); return; } } private void JudgeNullBSMAssign(IFeatureClass featureClass) { IFeatureCursor pCursor = null; IFeature feature = null; try { IFeatureCursor jcCursor = featureClass.Search(new QueryFilter() { WhereClause = "BSM='' or BSM=' ' or BSM is NULL" }, true); if (jcCursor.NextFeature() == null) return; int iBSM = featureClass.Fields.FindField("BSM");//标识码 pCursor = featureClass.Update(null, true); int bsm = 1; while ((feature = pCursor.NextFeature()) != null) { feature.Value[iBSM] = $"{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).CODE}2110{(bsm++).ToString().PadLeft(8, '0')}"; feature.Store(); } pCursor.Flush(); } catch (Exception ex) { LogAPI.Debug("JudgeNullBSMAssign 异常:" + ex.Message); LogAPI.Debug("JudgeNullBSMAssign 异常:" + ex.StackTrace); } finally { if (pCursor != null) Marshal.ReleaseComObject(pCursor); if (feature != null) Marshal.ReleaseComObject(feature); } } private List LineNoDangles(string ErrorCode, string LayerName, string AliasName) { IEnvelope envelope = null; string topologyName = "LineNoDangles"; try { IFeatureLayer JC_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(LayerName); TopologyVerification(topologyName, JC_featureLayer.FeatureClass, new List { esriTopologyRuleType.esriTRTLineNoDangles }, ref envelope); return FindAllError(topologyName, envelope, JC_featureLayer.FeatureClass, LayerName, ErrorCode, AliasName); } catch (Exception ex) { throw ex; } } public void StopProcess(string processName) { try { System.Diagnostics.Process[] ps = Process.GetProcessesByName(processName); foreach (Process p in ps) { p.Kill(); } } catch (Exception ex) { LogAPI.Debug("停止进程失败:" + ex.Message); return; } } private void GetJCLayerName(string layerName, out string JCLayerName) { JCLayerName = null; if (layerName.Contains("XZQJXGX")) JCLayerName = "XZQJX"; else if (layerName.Contains("CJDCQJXGX")) JCLayerName = "CJDCQJX"; } private List SameGraphic(string layerName, string JC_layerName, string RuleCode, string RuleName, string TempfilePath) { GPParamClass paramClass = null; IFeatureLayer SameGraphic_Intersect = null; IFeatureLayer multipartToSingleFeatureLayer = null; List sqlList = new List(); IFeatureLayer GXFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(layerName); IFeatureLayer JC_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(JC_layerName); ICursor nmkCur = null; IRow nmkRow = null; IFeatureCursor pCursor = null; IFeature feature = null; try { if (GXFeatureLayer == null || GXFeatureLayer.FeatureClass.FeatureCount(null) == 0 || JC_featureLayer == null || JC_featureLayer.FeatureClass.FeatureCount(null) == 0) { return sqlList; } paramClass = new GPParamClass() { FirstFeatureLayer = GXFeatureLayer, GPType = EnumGPType.UnsplitLine, SecondFeatureLayer = JC_featureLayer, OutFeatureClassPath = $"{TempfilePath}\\SameGraphic_Intersect", FcName = GXFeatureLayer.Name, IsGetOutPutFeature = true }; GeoprocessorHelper.IntersectAnalysis(paramClass, ref SameGraphic_Intersect); paramClass = new GPParamClass(); paramClass.FirstFeatureLayer = SameGraphic_Intersect; paramClass.OutFeatureClassPath = $"{TempfilePath}\\SameGraphic_Multipart"; paramClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(paramClass, ref multipartToSingleFeatureLayer); if (multipartToSingleFeatureLayer.FeatureClass == null) return null; int fid_DLTBBGIndex = 0; for (int i = 0; i < multipartToSingleFeatureLayer.FeatureClass.Fields.FieldCount; i++) { if (multipartToSingleFeatureLayer.FeatureClass.Fields.Field[i].Name.Contains("FID_")) { fid_DLTBBGIndex = i; break; } } ITable nmkTable = multipartToSingleFeatureLayer.FeatureClass as ITable; int rowCount = nmkTable.RowCount(new QueryFilterClass() { WhereClause = "BGXW in ('0','4')" }); if (rowCount <= 0) return null; nmkCur = nmkTable.Update(new QueryFilterClass() { WhereClause = "BGXW in ('0','4')" }, true); List allIntersectObjectId = new List(); while ((nmkRow = nmkCur.NextRow()) != null) { allIntersectObjectId.Add(nmkRow.Value[fid_DLTBBGIndex].ToString()); } pCursor = GXFeatureLayer.FeatureClass.Search(new QueryFilterClass() { WhereClause = "BGXW in ('0','4')" }, true); int iTableBSM = GXFeatureLayer.FeatureClass.FindField("BSM"); int objectid = GXFeatureLayer.FeatureClass.FindField("OBJECTID"); var FID_DLTBBG = string.Empty; var BSM = string.Empty; while ((feature = pCursor.NextFeature()) != null) { FID_DLTBBG = feature.Value[objectid].ToString(); BSM = feature.Value[iTableBSM].ToString(); if (!allIntersectObjectId.Contains(FID_DLTBBG.ToString())) { sqlList.Add(string.Format("INSERT INTO DataCheckResults (OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}','值域规范性','{5}');", FID_DLTBBG, BSM, layerName, RuleCode, RuleName, feature.Shape.ToJson())); } } //删除临时文件 DeleteTempFeatureLayer(multipartToSingleFeatureLayer); DeleteTempFeatureLayer(SameGraphic_Intersect); } catch (Exception ex) { LogAPI.Debug($"SameGraphic执行错误:{ex.Message}"); LogAPI.Debug(ex); } finally { if (SameGraphic_Intersect != null) Marshal.ReleaseComObject(SameGraphic_Intersect); if (multipartToSingleFeatureLayer != null) Marshal.ReleaseComObject(multipartToSingleFeatureLayer); if (GXFeatureLayer != null) Marshal.ReleaseComObject(GXFeatureLayer); if (JC_featureLayer != null) Marshal.ReleaseComObject(JC_featureLayer); if (nmkCur != null) Marshal.ReleaseComObject(nmkCur); if (nmkRow != null) Marshal.ReleaseComObject(nmkRow); if (pCursor != null) Marshal.ReleaseComObject(pCursor); if (feature != null) Marshal.ReleaseComObject(feature); GC.Collect(); } return sqlList; } private List SameBSM(string layerName, string JC_layerName, string RuleCode, string RuleName, string TempfilePath) { GPParamClass paramClass = null; IFeatureLayer SameBSM_Intersect = null; IFeatureLayer multipartToSingleFeatureLayer = null; List sqlList = new List(); IFeatureLayer GXFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(layerName); IFeatureLayer JC_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(JC_layerName); IFeatureCursor pCursor = null; IFeature feature = null; try { if (GXFeatureLayer == null || GXFeatureLayer.FeatureClass.FeatureCount(null) == 0 || JC_featureLayer == null || JC_featureLayer.FeatureClass.FeatureCount(null) == 0) { return sqlList; } paramClass = new GPParamClass() { FirstFeatureLayer = GXFeatureLayer, GPType = EnumGPType.UnsplitLine, SecondFeatureLayer = JC_featureLayer, OutFeatureClassPath = $"{TempfilePath}\\SameBSM_Intersect", FcName = GXFeatureLayer.Name, IsGetOutPutFeature = true }; GeoprocessorHelper.IntersectAnalysis(paramClass, ref SameBSM_Intersect); paramClass = new GPParamClass(); paramClass.FirstFeatureLayer = SameBSM_Intersect; paramClass.OutFeatureClassPath = $"{TempfilePath}\\SameBSM_Multipart"; paramClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(paramClass, ref multipartToSingleFeatureLayer); if (multipartToSingleFeatureLayer.FeatureClass == null) return null; int fid_BGXWIndex = multipartToSingleFeatureLayer.FeatureClass.Fields.FindField("BGXW"); int fid_DLTBBGIndex = 0; for (int i = 0; i < multipartToSingleFeatureLayer.FeatureClass.Fields.FieldCount; i++) { if (multipartToSingleFeatureLayer.FeatureClass.Fields.Field[i].Name.Contains("FID_")) { fid_DLTBBGIndex = i; break; } } int iBSM = multipartToSingleFeatureLayer.FeatureClass.FindField("BSM"); int iBSM_1 = multipartToSingleFeatureLayer.FeatureClass.FindField("BSM_1"); ITable nmkTable = multipartToSingleFeatureLayer.FeatureClass as ITable; int rowCount = nmkTable.RowCount(new QueryFilterClass() { WhereClause = "BGXW in ('0','4')" }); if (rowCount <= 0) return null; pCursor = multipartToSingleFeatureLayer.FeatureClass.Search(new QueryFilterClass() { WhereClause = "BGXW in ('0','4')" }, true); var FID_OBJECTID = string.Empty; var BSM = string.Empty; var BGXW = string.Empty; while ((feature = pCursor.NextFeature()) != null) { FID_OBJECTID = feature.Value[fid_DLTBBGIndex].ToString(); BSM = feature.Value[iBSM].ToString(); BGXW = feature.Value[fid_BGXWIndex].ToString(); if (string.IsNullOrEmpty(BGXW.ToString()) || (BGXW.ToString() != "0" && BGXW.ToString() != "4")) continue; if (BSM.ToString() != feature.Value[iBSM_1].ToString()) { sqlList.Add(string.Format("INSERT INTO DataCheckResults (OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}','值域规范性','{5}');", FID_OBJECTID, BSM, layerName, RuleCode, RuleName, feature.Shape.ToJson())); } } //删除临时文件 DeleteTempFeatureLayer(multipartToSingleFeatureLayer); DeleteTempFeatureLayer(SameBSM_Intersect); } catch (Exception ex) { LogAPI.Debug($"SameBSM执行错误:{ex.Message}"); LogAPI.Debug(ex); } finally { if (SameBSM_Intersect != null) Marshal.ReleaseComObject(SameBSM_Intersect); if (multipartToSingleFeatureLayer != null) Marshal.ReleaseComObject(multipartToSingleFeatureLayer); if (GXFeatureLayer != null) Marshal.ReleaseComObject(GXFeatureLayer); if (JC_featureLayer != null) Marshal.ReleaseComObject(JC_featureLayer); if (pCursor != null) Marshal.ReleaseComObject(pCursor); if (feature != null) Marshal.ReleaseComObject(feature); GC.Collect(); } return sqlList; } private List JudgeNewRoad(string layerName, string JC_layerName, string RuleCode, string RuleName, string RuleType) { GPParamClass paramClass = null; IFeatureLayer SameLMFW_Intersect = null; IFeatureLayer LMFW_Intersect = null; List sqlList = new List(); IFeatureLayer GXFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(layerName); IFeatureLayer JC_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(JC_layerName); ICursor nmkCur = null; IRow nmkRow = null; IFeatureCursor pCursor = null; IFeature feature = null; try { if (GXFeatureLayer == null || GXFeatureLayer.FeatureClass.FeatureCount(null) == 0 || JC_featureLayer == null || JC_featureLayer.FeatureClass.FeatureCount(null) == 0) return null; paramClass = new GPParamClass() { FirstFeatureLayer = GXFeatureLayer, SecondFeatureLayer = JC_featureLayer, FcName = GXFeatureLayer.Name, IsGetOutPutFeature = true }; GeoprocessorHelper.IntersectAnalysis(paramClass, ref SameLMFW_Intersect); paramClass = new GPParamClass(); paramClass.FirstFeatureLayer = SameLMFW_Intersect; paramClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(paramClass, ref LMFW_Intersect); if (LMFW_Intersect.FeatureClass == null) return null; int fid_gxIndex = 0; for (int i = 0; i < LMFW_Intersect.FeatureClass.Fields.FieldCount; i++) { if (LMFW_Intersect.FeatureClass.Fields.Field[i].Name.Contains("FID_")) { fid_gxIndex = i; break; } } ITable nmkTable = LMFW_Intersect.FeatureClass as ITable; int rowCount = nmkTable.RowCount(null); if (rowCount <= 0) return null; nmkCur = nmkTable.Update(null, true); List allIntersectObjectId = new List(); while ((nmkRow = nmkCur.NextRow()) != null) { allIntersectObjectId.Add(nmkRow.Value[fid_gxIndex].ToString()); } pCursor = GXFeatureLayer.FeatureClass.Search(null, true); int iTableBSM = GXFeatureLayer.FeatureClass.FindField("BSM"); int objectid = GXFeatureLayer.FeatureClass.FindField("OBJECTID"); int iKD = GXFeatureLayer.FeatureClass.FindField("KD"); var FID_LMFWGX = string.Empty; var BSM = string.Empty; var kdValue = string.Empty; while ((feature = pCursor.NextFeature()) != null) { FID_LMFWGX = feature.Value[objectid].ToString(); BSM = feature.Value[iTableBSM].ToString(); kdValue = feature.Value[iKD].ToString(); if (!allIntersectObjectId.Contains(FID_LMFWGX.ToString()))//新增道路 允许为空 { if (!string.IsNullOrEmpty(kdValue.ToString()) && double.Parse(kdValue.ToString()) < 0) { sqlList.Add(string.Format("INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}');", FID_LMFWGX.ToString(), BSM.ToString(), layerName, RuleCode, RuleName, RuleType, feature.Shape.ToJson())); } } else //不是新增 不允许为空 { if (string.IsNullOrEmpty(kdValue.ToString()) || double.Parse(kdValue.ToString()) < 0) { sqlList.Add(string.Format("INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}');", FID_LMFWGX.ToString(), BSM.ToString(), layerName, RuleCode, RuleName, RuleType, feature.Shape.ToJson())); } } } DeleteTempFeatureLayer(LMFW_Intersect); DeleteTempFeatureLayer(SameLMFW_Intersect); } catch (Exception ex) { LogAPI.Debug($"JudgeNewRoad执行错误:{ex.Message}"); LogAPI.Debug(ex); } finally { if (LMFW_Intersect != null) Marshal.ReleaseComObject(LMFW_Intersect); if (SameLMFW_Intersect != null) Marshal.ReleaseComObject(SameLMFW_Intersect); if (GXFeatureLayer != null) Marshal.ReleaseComObject(GXFeatureLayer); if (JC_featureLayer != null) Marshal.ReleaseComObject(JC_featureLayer); if (nmkCur != null) Marshal.ReleaseComObject(nmkCur); if (nmkRow != null) Marshal.ReleaseComObject(nmkRow); if (pCursor != null) Marshal.ReleaseComObject(pCursor); if (feature != null) Marshal.ReleaseComObject(feature); GC.Collect(); } return sqlList; } private List SameGDPDJB(string layerName, string PDT_layerName, string RuleCode, string RuleName, string RuleType) { GPParamClass paramClass = null; IFeatureLayer GDPDJB_Union = null; List sqlList = new List(); IFeatureLayer DLTBGXFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(layerName); IFeatureLayer PDT_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(PDT_layerName); ICursor nmkCur = null; IRow nmkRow = null; IFeatureCursor pCursor = null; IFeature feature = null; try { if (DLTBGXFeatureLayer == null || DLTBGXFeatureLayer.FeatureClass.FeatureCount(null) == 0 || PDT_featureLayer == null || PDT_featureLayer.FeatureClass.FeatureCount(null) == 0) return null; paramClass = new GPParamClass() { FirstFeatureLayer = DLTBGXFeatureLayer, GPType = EnumGPType.Union, SecondFeatureLayer = PDT_featureLayer, FcName = DLTBGXFeatureLayer.Name, IsGetOutPutFeature = true }; GeoprocessorHelper.UnionAnalysis(paramClass, ref GDPDJB_Union); if (GDPDJB_Union == null) return null; int fid_DLTBGXIndex = GDPDJB_Union.FeatureClass.Fields.FindField("FID_" + layerName); int fid_PDTIndex = GDPDJB_Union.FeatureClass.Fields.FindField("FID_" + PDT_layerName); int iDLTBGXPDJB = GDPDJB_Union.FeatureClass.FindField("GDPDJB"); int iPDTPDJB = GDPDJB_Union.FeatureClass.FindField("PDJB"); int bsmIndex = GDPDJB_Union.FeatureClass.Fields.FindField("BSM"); int shapeAreaIndex = GDPDJB_Union.FeatureClass.Fields.FindField("SHAPE_AREA"); ITable nmkTable = GDPDJB_Union.FeatureClass as ITable; IQueryFilter queryfilter = new QueryFilterClass(); queryfilter.WhereClause = string.Format("DLBM like '01%' "); nmkCur = nmkTable.Search(queryfilter, true); if (iDLTBGXPDJB == -1 || iPDTPDJB == -1) return null; double shapeArea = 0.00; List gDPDJBInfoList = new List(); bool changedInfo = false; var dltbgxValue = string.Empty; var pdtValue = string.Empty; string bsmValue = string.Empty; string pdjbValue = string.Empty; List tempGDPDJBInfo = new List(); while ((nmkRow = nmkCur.NextRow()) != null) { dltbgxValue = nmkRow.Value[fid_DLTBGXIndex].ToString(); pdtValue = nmkRow.Value[fid_PDTIndex].ToString(); if (dltbgxValue.ToString() == "-1" || pdtValue.ToString() == "-1") continue; bsmValue = nmkRow.Value[bsmIndex].ToString(); pdjbValue = nmkRow.Value[iPDTPDJB].ToString(); shapeArea = nmkRow.Value[shapeAreaIndex].ToDouble(); changedInfo = false; if (gDPDJBInfoList.Exists(a => a.BSM == bsmValue)) { tempGDPDJBInfo.Clear(); tempGDPDJBInfo = gDPDJBInfoList.FindAll(a => a.BSM == bsmValue); foreach (GDPDJBInfo item in tempGDPDJBInfo) { if (item.PDJB == pdjbValue) { item.Area += shapeArea; changedInfo = true; break; } } if (!changedInfo) gDPDJBInfoList.Add(new GDPDJBInfo() { BSM = bsmValue, PDJB = pdjbValue, Area = shapeArea }); } else { gDPDJBInfoList.Add(new GDPDJBInfo() { BSM = bsmValue, PDJB = pdjbValue, Area = shapeArea }); } } List areaList = new List(); double maxArea = 0; string maxAreaPDJB = "-1"; pCursor = DLTBGXFeatureLayer.FeatureClass.Search(queryfilter, true); fid_DLTBGXIndex = DLTBGXFeatureLayer.FeatureClass.Fields.FindField("OBJECTID"); iDLTBGXPDJB = DLTBGXFeatureLayer.FeatureClass.FindField("GDPDJB"); bsmIndex = DLTBGXFeatureLayer.FeatureClass.Fields.FindField("BSM"); var dltbPDJBValue = string.Empty; while ((feature = pCursor.NextFeature()) != null) { areaList.Clear(); maxArea = 0; maxAreaPDJB = "-1"; dltbgxValue = feature.Value[fid_DLTBGXIndex].ToString(); dltbPDJBValue = feature.Value[iDLTBGXPDJB].ToString(); bsmValue = feature.Value[bsmIndex].ToString(); tempGDPDJBInfo.Clear(); tempGDPDJBInfo = gDPDJBInfoList.FindAll(a => a.BSM == bsmValue); foreach (GDPDJBInfo item in tempGDPDJBInfo) { if (maxArea < item.Area) { maxArea = item.Area; maxAreaPDJB = item.PDJB; } } if (!string.IsNullOrEmpty(maxAreaPDJB) && maxAreaPDJB != "-1" && !string.IsNullOrEmpty(dltbPDJBValue.ToString()) && !string.IsNullOrEmpty(dltbPDJBValue.ToString()) && dltbPDJBValue.ToString() != maxAreaPDJB) { sqlList.Add(string.Format("INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}','{5}','{6}');", dltbgxValue.ToString(), feature.Value[bsmIndex], layerName, RuleCode, RuleName, RuleType, feature.Shape.ToJson())); } } DeleteTempFeatureLayer(GDPDJB_Union); } catch (Exception ex) { LogAPI.Debug($"SameGDPDJB执行错误:{ex.Message}"); LogAPI.Debug(ex); } finally { if (GDPDJB_Union != null) Marshal.ReleaseComObject(GDPDJB_Union); if (DLTBGXFeatureLayer != null) Marshal.ReleaseComObject(DLTBGXFeatureLayer); if (PDT_featureLayer != null) Marshal.ReleaseComObject(PDT_featureLayer); if (nmkCur != null) Marshal.ReleaseComObject(nmkCur); if (nmkRow != null) Marshal.ReleaseComObject(nmkRow); if (pCursor != null) Marshal.ReleaseComObject(pCursor); if (feature != null) Marshal.ReleaseComObject(feature); GC.Collect(); } return sqlList; } //删除临时文件 public static void DeleteTempFeatureLayer(IFeatureLayer pFeatureLayer) { if (pFeatureLayer == null) return; try { ITable tempTable = pFeatureLayer.FeatureClass as ITable; if (tempTable == null) return; IFeatureWorkspaceManage pWorkspaceManager = (pFeatureLayer.FeatureClass as FeatureClass).Workspace as IFeatureWorkspace as IFeatureWorkspaceManage; pWorkspaceManager.DeleteByName((IDatasetName)((IDataset)tempTable).FullName); } catch (Exception ex) { LogAPI.Debug("删除临时文件异常:" + ex); } } #region TableToTable public 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; } } #endregion #region 其他方式复制矢量到DB表 private void CopyTableToDB(IFeatureWorkspace pInWork, IRDBHelper rdbHelper, string tableName) { ICursor pCursor = null; IRow pRow = null; try { if (pInWork == null || string.IsNullOrEmpty(tableName)) return; IWorkspace2 workspace2 = pInWork as IWorkspace2; if (workspace2 != null) { if (!workspace2.get_NameExists(esriDatasetType.esriDTFeatureClass, tableName)) return; } ITable pInTable = pInWork.OpenTable(tableName); if (pInTable == null) return; int shapeIndex = pInTable.Fields.FindField("SHAPE"); if (shapeIndex < 0) { throw new Exception("未找到SHAPE字段"); } List listSQL = new List(); string fieldStr = string.Empty; string insertField = string.Empty; Dictionary listFieldIndex = new Dictionary(); for (int f = 0; f < pInTable.Fields.FieldCount; f++) { IField field = pInTable.Fields.Field[f]; if (field.Name.ToUpper() == "SHAPE") { continue; } switch (field.Type) { case esriFieldType.esriFieldTypeSmallInteger: fieldStr += field.Name + " INTEGER,"; insertField += field.Name + ","; listFieldIndex.Add(f, false); break; case esriFieldType.esriFieldTypeInteger: fieldStr += field.Name + " INTEGER,"; insertField += field.Name + ","; listFieldIndex.Add(f, false); break; case esriFieldType.esriFieldTypeOID: fieldStr += field.Name + " INTEGER,"; insertField += field.Name + ","; listFieldIndex.Add(f, false); break; case esriFieldType.esriFieldTypeDouble: fieldStr += field.Name + " INTEGER,"; insertField += field.Name + ","; listFieldIndex.Add(f, false); break; case esriFieldType.esriFieldTypeSingle: fieldStr += field.Name + " NUMERIC,"; insertField += field.Name + ","; listFieldIndex.Add(f, false); break; case esriFieldType.esriFieldTypeString: fieldStr += field.Name + " TEXT,"; insertField += field.Name + ","; listFieldIndex.Add(f, true); break; case esriFieldType.esriFieldTypeDate: fieldStr += field.Name + " TEXT,"; insertField += field.Name + ","; listFieldIndex.Add(f, true); break; default: fieldStr += field.Name + " TEXT,"; insertField += field.Name + ","; listFieldIndex.Add(f, true); break; } } //rdbHelper.ExecuteSQL($"Drop table {tableName}"); string createTableSQL = string.Format("CREATE TABLE if not exists {1} ({0})", fieldStr.TrimEnd(','), tableName); rdbHelper.ExecuteNonQueryWithException(createTableSQL, CommandType.Text); string insertSQL = "insert into " + tableName + "(" + insertField.TrimEnd(',') + ")values({0});"; int count = pInTable.RowCount(null); int i = 0; pCursor = pInTable.Search(null, true); while ((pRow = pCursor.NextRow()) != null) { string value = string.Empty; foreach (var item in listFieldIndex) { object obj = pRow.get_Value(item.Key); if (item.Value) { if (obj == null || string.IsNullOrWhiteSpace(obj.ToString())) { value += "'',"; } else { value += "'" + obj.ToString().Replace("'", "") + "',"; } } else { if (obj == null || string.IsNullOrWhiteSpace(obj.ToString())) { obj = 0; } value += obj + ","; } } listSQL.Add(string.Format(insertSQL, value.TrimEnd(','))); //i++; //if (i % 100 == 0 || i == count) //{ // this.UpdateMsg($"正在数据写入...【{i}/{count}】"); // rdbHelper.ExecuteNonQueryWithException(item, CommandType.Text); //} //if (listSQL.Count > 10) //{ // InsertDB(listSQL, rdbHelper); // listSQL.Clear(); //} //else if (i == count) //{ // InsertDB(listSQL, rdbHelper); // listSQL.Clear(); //} } for (int m = 0; m < listSQL.Count; m++) { this.UpdateMsg($"正在数据写入...【{m}/{count}】"); rdbHelper.ExecuteNonQueryWithException(listSQL[m], CommandType.Text); } } catch (Exception ex) { LogAPI.Debug("CopyTableToDB 异常:" + ex.Message); LogAPI.Debug("CopyTableToDB 异常:" + ex.StackTrace); } finally { if (pCursor != null) { Marshal.ReleaseComObject(pCursor); } if (pRow != null) { Marshal.ReleaseComObject(pRow); } } } #endregion /// /// 将检查数据存储在DB中 /// public void SaveDataToDB() { string dbPath = System.IO.Path.Combine((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ProjDir, "DataCheckrResult.db"); SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, "drop table DataCheckResults", null); string sql = "CREATE TABLE " + " DataCheckResults " + " (`ID` INTEGER, `ErrorLayer` TEXT,`PrimaryKey` TEXT, `PrimaryKeyValue` TEXT,`PrimaryKey2` TEXT, `PrimaryKeyValue2` TEXT,`ErrorType` TEXT,`ErrorCode` TEXT,`ErrorDesc` TEXT,`ErrorData` TEXT,`ErrorArea` TEXT,`ErrorMJ` NUMERIC,PRIMARY KEY(`ID`))"; //if (!_IsExit)//不存在,则创建该表 SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, sql, null); List sqlList = new List(); sqlList.Add("delete from DataCheckResults"); foreach (var item in m_Check.CheckResults) { sqlList.Add(string.Format("INSERT INTO DataCheckResults (ErrorLayer,PrimaryKey, PrimaryKeyValue,PrimaryKey2, PrimaryKeyValue2,ErrorType,ErrorCode,ErrorDesc,ErrorData,ErrorArea,ErrorMJ) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}',{10})", item.ErrorLayer, item.PrimaryKey, item.PrimaryKeyValue, item.BSM, item.PrimaryKeyValue2, item.ErrorType, item.ErrorCode, item.ErrorDesc, item.ErrorData, item.ErrorArea, item.ErrorMJ)); } InsertSQLiteData(dbPath, sqlList); ProgressHelper.CloseProcessBar(); MessageHelper.Show("数据检查完成。"); LoadData(); } public void InsertSQLiteData(string dbPath, List sqlList) { try { //DateTime dtS = DateTime.Now; using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath)) { conn.Open(); using (SQLiteTransaction pTrans = conn.BeginTransaction()) { using (SQLiteCommand cmd = new SQLiteCommand(conn)) { for (int i = 0; i < sqlList.Count(); i++) { cmd.CommandText = sqlList[i]; cmd.ExecuteNonQuery(); } pTrans.Commit(); } } conn.Close(); } } catch (Exception ex) { LogAPI.Debug("批量插入SQLite数据(地址:" + dbPath + ") 执行失败,异常原因: " + ex.Message + " ; "); return; } } V_Repair.FrmBachRepair repairView = null; /// /// 批量修复 /// /// /// private void BtnBatchRepair_Click(object sender, RoutedEventArgs e) { IGeometry geometry = null; IRDBHelper rdbHelper = null; IFeatureLayer dltbbg_Layer = null; IFeatureLayer JcTb_Layer = null; IFeatureLayer mErrLayer = null; try { (sender as Button).IsEnabled = false; ExtensionShowWindow.MainWinForm.Enabled = false; this.ShowLoading($"正在进行批量修复...", 0, 0); System.Threading.Thread.Sleep(1000); string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); string DataCheckResultsSQL = string.Empty; if (_CheckName == "变更图斑") { DataCheckResultsSQL = " where ErrorLayer='DLTBBG' or ErrorLayer='地类图斑变更层' "; } DataTable DataCheckResults = rdbHelper.ExecuteDatatable("tab", $"select * from DataCheckResults {DataCheckResultsSQL} order by BSM desc", true); if (DataCheckResults != null && DataCheckResults.Rows.Count > 0) { dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); JcTb_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); if (_CheckName == "基础图斑") { dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); //PluginServiceInterface.CommonHelper.RemoveReadOnly((JcTb_Layer.FeatureClass as FeatureClass).Workspace.PathName); //修复几何 try { GeoprocessorHelper.RepairGeo(JcTb_Layer.FeatureClass, true); } catch { } } IWorkspaceAPI workspaceAPI = null;// new WorkspaceAPI((MapsManager.Instance.CurrProjectInfo as ProjectInfo).DataCheckPath, WorkspaceTypeEnum.GDBFile); IFeatureClassAPI featureClassAPI = null;// workspaceAPI.OpenFeatureClass("Multipart"); List repairEntities = new List(); var ErrorCode = string.Empty; var BSM = string.Empty; var OBJECTID = string.Empty; var ID = string.Empty; var ErrorArea = string.Empty; var ErrorName = string.Empty; var errorLayerEngish = string.Empty; var mOID = string.Empty; foreach (DataRow row in DataCheckResults.Rows) { try { ErrorCode = row["ErrorCode"].ToString(); BSM = row["BSM"].ToString(); OBJECTID = row["OBJECTID"].ToString(); ErrorName = row["ErrorName"].ToString(); if (ErrorName.Contains("批量不处理")) continue; ID = row["ID"].ToString(); ErrorArea = row["ErrorArea"].ToString(); errorLayerEngish = row["ErrorLayer"].ToString(); mOID = row["MultipartOID"].ToString(); #region Topology if (ErrorCode == "32074304000007")//拓扑错误 { try { geometry = IPolygonExtension.ToGeometry(ErrorArea, true, esriGeometryType.esriGeometryPolygon); } catch { geometry = IPolygonExtension.ToGeometry(ErrorArea, false, esriGeometryType.esriGeometryPolyline); } //geometry = feature.ShapeCopy; if (geometry == null || geometry.IsEmpty) continue; var OriginOID = BSM.Split('-')[0].ToInt(); var DestinationOID = BSM.Split('-')[1].ToInt(); IFeature OriginFC = dltbbg_Layer.FeatureClass.GetFeature(OriginOID); IFeature DestinationFC = dltbbg_Layer.FeatureClass.GetFeature(DestinationOID); if (geometry.GeometryType == esriGeometryType.esriGeometryPolyline) { var geo = RepairGeometry(OriginFC, geometry); IGeometry Union = FeatureAPI.Union(OriginFC.ShapeCopy, geo); OriginFC.Shape = Union; OriginFC.Store(); IGeometry difference = FeatureAPI.Difference(DestinationFC.ShapeCopy, Union);//擦除 DestinationFC.Shape = difference; DestinationFC.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } else if (geometry.GeometryType == esriGeometryType.esriGeometryPolygon && geometry.GetEllipseArea() < 20) { IGeometry Union = FeatureAPI.Union(OriginFC.Shape, geometry); List geoList = FeatureAPI.DissolveGeometryByRing(Union); OriginFC.Shape = Union; OriginFC.Store(); IGeometry difference = FeatureAPI.Difference(DestinationFC.Shape, Union);//擦除 geoList = FeatureAPI.DissolveGeometryByRing(difference); DestinationFC.Shape = difference; DestinationFC.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } } else if (ErrorCode == "32074304000006")//变更图斑与基础库联合出的错误 { if (workspaceAPI == null) { workspaceAPI = new WorkspaceAPI(row["RepairfilePath"].ToString(), WorkspaceTypeEnum.GDBFile); if (featureClassAPI == null) featureClassAPI = workspaceAPI.OpenFeatureClass("DLTBBG_Err"); } var MultipartOID = row["MultipartOID"].ToString(); if (string.IsNullOrEmpty(MultipartOID)) continue; IFeature ErrorFeature = featureClassAPI.GetFeature(MultipartOID.ToInt()); geometry = ErrorFeature.ShapeCopy; if (geometry != null && geometry.IsEmpty) continue; if (OBJECTID == "-1")//OBJECTID 为-1 的 需要与变更图斑合并 { var togologic = geometry as ITopologicalOperator; togologic.Simplify(); IPointCollection bgFeatures = GetSplitFeatures2(ErrorFeature, dltbbg_Layer, JcTb_Layer); if (RepairBgtbForPoint(ErrorFeature, dltbbg_Layer, bgFeatures)) { rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } else { int idx = ErrorFeature.Fields.FindField("FID_DLTB"); if (idx == -1) idx = ErrorFeature.Fields.FindField("FID_JCDLTB"); var errJcOID = ErrorFeature.Value[idx].ToTrim(); if (mErrLayer == null) { mErrLayer = new FeatureLayerClass() { FeatureClass = featureClassAPI.FeatureClass, SpatialReference = ErrorFeature.ShapeCopy.SpatialReference }; } List TempFeatures = FeatureAPI.Identify(ErrorFeature.ShapeCopy, dltbbg_Layer); List JCTempFeatures = FeatureAPI.Identify(ErrorFeature.ShapeCopy, mErrLayer); int bgOID = -1; int idxBgOID = ErrorFeature.Fields.FindField("FID_DLTBBG"); //List unOIDs = new List(); //foreach (var item in JCTempFeatures) //{ // var jcOID = item.Value[idx].ToTrim(); // if (jcOID == errJcOID) // { // bgOID = item.Value[idxBgOID].ToInt(); // if (bgOID != -1 && !unOIDs.Contains(bgOID)) // unOIDs.Add(bgOID); // } //} if (JCTempFeatures.Count == 1) { //图形相邻与共边最长的图斑合并 IFeature UnionFeature = null; var Unionlength = 0.00; foreach (IFeature ifeature in TempFeatures) { var length = FeatureAPI.LengthOfSide(ErrorFeature.ShapeCopy, ifeature.Shape); if (length > Unionlength) { Unionlength = length; UnionFeature = ifeature; } } if (UnionFeature != null) { IGeometry geometrys = FeatureAPI.Union(UnionFeature.ShapeCopy, ErrorFeature.ShapeCopy); if (geometrys != null && !geometrys.IsEmpty) { UnionFeature.Shape = geometrys; UnionFeature.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } } } } #region 代码注释 //List bgFeatures = GetSplitFeatures(ErrorFeature, dltbbg_Layer);// FeatureAPI.Identify(geometry, dltbbg_Layer); //if (bgFeatures == null) // continue; //if (bgFeatures.Count == 1) //{ // IGeometry geometrys = FeatureAPI.Union(bgFeatures[0].ShapeCopy, geometry); // if (geometrys != null && !geometrys.IsEmpty) // { // bgFeatures[0].Shape = geometrys; // bgFeatures[0].Store(); // rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); // } //} //else if (bgFeatures.Count > 1) //{ // foreach (var item in bgFeatures) // { // List TempFeatures = FeatureAPI.Identify(item.ShapeCopy, dltbbg_Layer); // //图形相邻与共边最长的图斑合并 // IFeature UnionFeature = null; // var Unionlength = 0.00; // foreach (IFeature ifeature in TempFeatures) // { // var length = FeatureAPI.LengthOfSide(item.ShapeCopy, ifeature.Shape); // if (length > Unionlength) // { // Unionlength = length; // UnionFeature = ifeature; // } // } // if (UnionFeature != null) // { // IGeometry geometrys = FeatureAPI.Union(UnionFeature.ShapeCopy, item.ShapeCopy); // if (geometrys != null && !geometrys.IsEmpty) // { // UnionFeature.Shape = geometrys; // UnionFeature.Store(); // rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); // } // } // } //} //else //{ // List TempFeatures = FeatureAPI.Identify(geometry, dltbbg_Layer); // //图形相邻与共边最长的图斑合并 // IFeature UnionFeature = null; // var Unionlength = 0.00; // foreach (IFeature ifeature in TempFeatures) // { // var length = FeatureAPI.LengthOfSide(geometry, ifeature.Shape); // if (length > Unionlength) // { // Unionlength = length; // UnionFeature = ifeature; // } // } // if (UnionFeature != null) // { // IGeometry geometrys = FeatureAPI.Union(UnionFeature.ShapeCopy, geometry); // if (geometrys != null && !geometrys.IsEmpty) // { // UnionFeature.Shape = geometrys; // UnionFeature.Store(); // rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); // } // } //} #endregion } else //OBJECTID >-1的 需要将碎图斑擦除 { //continue; IFeature OriginFC = null; try { if (Convert.ToInt32(BSM) > 0) { OriginFC = dltbbg_Layer.FeatureClass.GetFeature(BSM.ToInt()); } } catch (Exception ex) { throw; } OriginFC.Shape = FeatureAPI.Difference(OriginFC.ShapeCopy, geometry);//擦除 OriginFC.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); List bgFeatures = FeatureAPI.Identify(geometry, dltbbg_Layer); #region 碎图斑与相邻共边长的图斑合并 if (bgFeatures.Count > 1) { IFeature UnionFeature = null; var Unionlength = 0.00; foreach (IFeature ifeature in bgFeatures) { if (ifeature.OID == BSM.ToInt()) continue; var length = FeatureAPI.LengthOfSide(ErrorFeature.ShapeCopy, ifeature.Shape); if (length > Unionlength) { Unionlength = length; UnionFeature = ifeature; } } if (UnionFeature != null) { IGeometry geometrys = FeatureAPI.Union(UnionFeature.ShapeCopy, ErrorFeature.ShapeCopy); if (geometrys != null && !geometrys.IsEmpty) { UnionFeature.Shape = geometrys; UnionFeature.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } } } #endregion //if (bgFeatures.Count > 1) //{ // int idxDLBM = ErrorFeature.Fields.FindField("DLBM_1"); // string dl = ErrorFeature.Value[idxDLBM].ToTrim(); // ITopologicalOperator tempTopo = geometry as ITopologicalOperator; // IPolyline tempLine = tempTopo.Boundary as IPolyline; // var Length = tempLine.Length; // int idxBgDLBM = dltbbg_Layer.FeatureClass.FindField("DLBM"); // foreach (IFeature ifeature in bgFeatures) // { // if (ifeature.OID == BSM.ToInt()) continue; // string bgDL = ifeature.Value[idxBgDLBM].ToTrim(); // if (dl == bgDL) // { // var length = FeatureAPI.LengthOfSide(geometry, ifeature.Shape); // if (length / Length > 0.3) // { // IGeometry geometrys = FeatureAPI.Union(ifeature.ShapeCopy, geometry); // if (geometrys != null && !geometrys.IsEmpty) // { // ifeature.Shape = geometrys; // ifeature.Store(); // rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); // } // break; // } // } // } //} //if (bgFeatures.Count == 1) //{ // OriginFC.Shape = FeatureAPI.Difference(OriginFC.ShapeCopy, geometry);//擦除 // OriginFC.Store(); // rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); //} //else if (bgFeatures.Count > 1) //{ // //图形相邻与共边最长的图斑合并 // IFeature UnionFeature = null; // var Unionlength = 0.00; // foreach (IFeature ifeature in bgFeatures) // { // if (ifeature.OID == OBJECTID.ToInt()) continue; // var length = FeatureAPI.LengthOfSide(geometry, ifeature.Shape); // IPolyline polyline; // ITopologicalOperator topoOper = geometry as ITopologicalOperator; // polyline = topoOper.Intersect(ifeature.ShapeCopy, esriGeometryDimension.esriGeometry1Dimension) as IPolyline; // if (polyline.IsEmpty) // { // } // if (length > Unionlength) // { // Unionlength = length; // UnionFeature = ifeature; // } // } // if (UnionFeature != null) // { // IGeometry geometrys = FeatureAPI.Union(UnionFeature.ShapeCopy, geometry); // if (geometrys != null && !geometrys.IsEmpty) // { // OriginFC.Shape = FeatureAPI.Difference(OriginFC.ShapeCopy, geometry);//擦除 // OriginFC.Store(); // UnionFeature.Shape = geometrys; // UnionFeature.Store(); // rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); // } // } //} } } else if (ErrorCode == "32074304000008")//基础地类图斑图层内部存在缝隙,根据错误图形,与相邻的 同一行政区的图形合并 { IFeatureLayer CJDCQLayer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("村级调查区"); try { //图形转化模式 默认大地坐标系4900 geometry = GeometryConvertHelper.ConvertWKTToIGeometry(ErrorArea); geometry.SpatialReference = m_hookHelper.FocusMap.SpatialReference; //geometry = IPolygonExtension.ToGeometry(ErrorArea, true, esriGeometryType.esriGeometryPolygon); } catch { geometry = IPolygonExtension.ToGeometry(ErrorArea, false, esriGeometryType.esriGeometryPolyline); } if (geometry == null || geometry.IsEmpty) continue; List bgFeatures = FeatureAPI.Identify(geometry, JcTb_Layer);//相邻的基础地类图斑 List cjdcqFeatures = FeatureAPI.Identify2(geometry, CJDCQLayer);//图斑所在村级调查区 IFeature UnionFeature = null; var Unionlength = 0.00; foreach (IFeature ifeature in bgFeatures) { var length = FeatureAPI.LengthOfSide(geometry, ifeature.Shape); if (length > Unionlength) { var cjdcq = FeatureAPI.Identify2(geometry, CJDCQLayer);//图斑所在村级调查区 if (cjdcqFeatures.Count == 1 && cjdcq.Count == 1 && cjdcqFeatures[0].OID == cjdcq[0].OID) { Unionlength = length; UnionFeature = ifeature; } else if (cjdcqFeatures.Count >= 2) { rdbHelper.ExecuteSQL($"update DataCheckResults set ErrorName = '{ErrorName}(存在跨村界批量不处理)' where ID in ({ID}) "); break; } } } if (UnionFeature != null) { try { if (geometry.GeometryType == esriGeometryType.esriGeometryPolyline) { //IGeometry Union = FeatureAPI.Union(UnionFeature.ShapeCopy, FeatureAPI.ConstructPolygonFromPolyline(geometry as IPolyline)); //UnionFeature.Shape = Union; } else if (geometry.GeometryType == esriGeometryType.esriGeometryPolygon) { IGeometry Union = FeatureAPI.Union(UnionFeature.ShapeCopy, geometry); UnionFeature.Shape = Union; } UnionFeature.Store(); rdbHelper.ExecuteSQL($" delete from DataCheckResults where ID={ID}"); } catch (Exception ex) { LogAPI.Debug("基础数据库文件发生占用,可重启系统再试!异常信息如下:" + ex); MessageHelper.ShowWarning("基础数据库文件发生占用,可重启系统再试!"); return; } } } else { DataTable ruleDt = rdbHelper.ExecuteDatatable("CheckingRule", string.Format($"SELECT * from CheckingRule where RuleCode = '{ErrorCode}' "), true); if (ruleDt != null && ruleDt.Rows.Count > 0) { foreach (DataRow ruleRow in ruleDt.Rows) { string repairSql = ruleRow["RepairSQL"].ToString(); if (string.IsNullOrWhiteSpace(repairSql) || string.IsNullOrEmpty(repairSql)) continue; IFeatureLayer errorFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(errorLayerEngish); RepairEntity repairEntity = new RepairEntity { RepairSQL = repairSql, LayerName = errorLayerEngish, BSMList = new List() { BSM }, IDList = new List() { ID } }; RepairEntity repair = repairEntities.Where(x => x.RepairSQL == repairSql && x.LayerName == errorLayerEngish).FirstOrDefault(); if (repair != null) { repair.BSMList.Add(BSM); repair.IDList.Add(ID); } else { repairEntities.Add(repairEntity); } } } } } catch (Exception ex) { LogAPI.Debug(ex.Message + ex.StackTrace); continue; } #endregion } if (repairEntities.Count > 0) { foreach (RepairEntity item in repairEntities) { //string newRepairSQL = item.RepairSQL.Replace("BSM =''", "BSM in ({1})"); string repairSql = string.Format(item.RepairSQL, item.LayerName, string.Join(",", item.BSMList.Select(x => $"'{x}'")), (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE); IFeatureLayer errorFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(item.LayerName); (errorFeatureLayer as FeatureClass).Workspace.ExecuteSQL(repairSql); rdbHelper.ExecuteSQL($"delete from DataCheckResults where ID in ({string.Join(",", item.IDList.Select(x => $"'{x}'"))}) "); } } InitView(out bool isFinishd); if (isFinishd) { this.CloseLoading(); MessageHelper.Show("修复完成!"); } } else MessageHelper.ShowTips("没有可修复的数据!"); this.CloseLoading(); } catch (Exception ex) { MessageHelper.Show("批量修复时发生错误,错误信息请查看系统日志!"); this.CloseLoading(); LogAPI.Debug("批量修复时发生异常,异常信息如下:"); LogAPI.Debug(ex.Message); LogAPI.Debug(ex.StackTrace); } finally { this.CloseLoading(); (sender as Button).IsEnabled = true; ExtensionShowWindow.MainWinForm.Enabled = true; if (rdbHelper != null && rdbHelper.State != ConnectionState.Closed) rdbHelper.DisConnect(); if (dltbbg_Layer != null) Marshal.ReleaseComObject(dltbbg_Layer); if (JcTb_Layer != null) Marshal.ReleaseComObject(JcTb_Layer); if (mErrLayer != null) Marshal.ReleaseComObject(mErrLayer); if (geometry != null) Marshal.ReleaseComObject(geometry); GC.Collect(); } } private List GetSplitFeatures(IFeature pF, IFeatureLayer dltbbg_Layer) { List result = new List(); try { List bgFeatures = FeatureAPI.Identify(pF.ShapeCopy, dltbbg_Layer); if (bgFeatures.Count == 1) { result = bgFeatures; } else if (bgFeatures.Count > 1) { ITopologicalOperator topo = pF.ShapeCopy as ITopologicalOperator; IPolyline tempLine = topo.Boundary as IPolyline; //图形相邻与共边最长的图斑合并 //IFeature UnionFeature = null; var Unionlength = 0.00; List lines = new List(); IFeature tempFeature = null; for (int i = 0; i < bgFeatures.Count; i++) { IGeometry geo1 = bgFeatures[i].ShapeCopy; Unionlength = FeatureAPI.LengthOfSide(geo1, pF.ShapeCopy); if (Unionlength < 0.0001) { continue; } tempFeature = bgFeatures[i]; topo = geo1 as ITopologicalOperator; geo1 = topo.Boundary; for (int j = i + 1; j < bgFeatures.Count; j++) { IGeometry geo2 = bgFeatures[j].ShapeCopy; Unionlength = FeatureAPI.LengthOfSide(geo2, pF.ShapeCopy); if (Unionlength < 0.0001) { continue; } IGeometry line1 = FeatureAPI.InterSect(geo1, geo2); if (line1.IsEmpty) continue; lines.Add(line1 as IPolyline); } } if (lines.Count == 0) { if (tempFeature != null) result.Add(tempFeature); return result; } List SplitLines = new List(); IPointCollection temps = pF.ShapeCopy as IPointCollection; for (int i = 0; i < lines.Count; i++) { IPointCollection ps = lines[i] as IPointCollection; IPolyline line = new PolylineClass(); line.FromPoint = ps.Point[1]; line.ToPoint = ps.Point[0]; IPoint newPoint = GeometryAPI.GetExtendedLinePoint(line, 1); line.ToPoint = newPoint; SplitLines.Add(line); SplitLines.Add(lines[i]); IPolyline line2 = new PolylineClass(); line2.FromPoint = ps.Point[ps.PointCount - 2]; line2.ToPoint = ps.Point[ps.PointCount - 1]; IPoint newPoint2 = GeometryAPI.GetExtendedLinePoint(line2, 1); line2.ToPoint = newPoint2; SplitLines.Add(line2); } IGeometry spGeo = FeatureAPI.MergeGeometry(SplitLines); IFeatureEdit featureEdit = pF as IFeatureEdit; try { MapsManager.Instance.MapService.DrawGraph(spGeo, true); MapsManager.Instance.MapService.Zoom(spGeo); //List list = SplitFeature(pF, spGeo as IPolyline); //return list; ESRI.ArcGIS.esriSystem.ISet newFeaturesSet = featureEdit.Split(spGeo); if (newFeaturesSet != null) { newFeaturesSet.Reset(); IFeature pSplitFeature = null; pSplitFeature = newFeaturesSet.Next() as IFeature; while (pSplitFeature != null) { result.Add(pSplitFeature); pSplitFeature = newFeaturesSet.Next() as IFeature; } } } catch (Exception ex) { return result; } } return result; } catch (Exception ex) { return null; } } private IPointCollection GetSplitFeatures(IFeature pF, IFeatureLayer dltbbg_Layer, IFeatureLayer pJcTb_Layer) { IPointCollection result = null;// new List(); try { //IPointCollection bgPoint = null; { List lines = new List(); List points = new List(); List bgFeatures = FeatureAPI.Identify(pF.ShapeCopy, pJcTb_Layer); ITopologicalOperator eTopo = pF.ShapeCopy as ITopologicalOperator; foreach (var item in bgFeatures) { ITopologicalOperator bgTopo = item.ShapeCopy as ITopologicalOperator; IGeometry bound = bgTopo.Boundary; IGeometry geo = eTopo.Intersect(bound, esriGeometryDimension.esriGeometry1Dimension); if (!geo.IsEmpty && (geo as IPolyline).Length > 0.0001) { IPointCollection tempPs = geo as IPointCollection; Dictionary pCount = new Dictionary(); for (int i = 0; i < tempPs.PointCount; i++) { List tempFs = FeatureAPI.Identify(tempPs.Point[i], pJcTb_Layer); if (tempFs.Count > 0) { if (!pCount.ContainsKey(tempPs.Point[i])) pCount.Add(tempPs.Point[i], tempFs.Count); else pCount[tempPs.Point[i]] = tempFs.Count; } } int num = pCount.Max(m => m.Value); lines.Add(geo); continue; } if (lines.Count == 0) { geo = eTopo.Intersect(bound, esriGeometryDimension.esriGeometry0Dimension); if (!geo.IsEmpty) { IPointCollection tempPs = geo as IPointCollection; for (int i = 0; i < tempPs.PointCount; i++) { points.Add(tempPs.Point[i]); } } } } if (lines.Count > 0) { IGeometry spGeo = FeatureAPI.MergeGeometry(lines); //MapsManager.Instance.MapService.DrawGraph(spGeo, true); //MapsManager.Instance.MapService.Zoom(spGeo); result = spGeo as IPointCollection; //foreach (var item in lines) //{ // result.AddPoint((item as IPolyline).FromPoint); // result.AddPoint((item as IPolyline).ToPoint); //} } else { result = new PolylineClass(); foreach (var p in points) { result.AddPoint(p as IPoint); } } } return result; } catch (Exception ex) { return null; } } private IPointCollection GetSplitFeatures2(IFeature pF, IFeatureLayer dltbbg_Layer, IFeatureLayer pJcTb_Layer) { IPointCollection result = null;// new List(); try { //IPointCollection bgPoint = null; { List lines = new List(); List points = new List(); List bgFeatures = FeatureAPI.Identify(pF.ShapeCopy, pJcTb_Layer); ITopologicalOperator eTopo = pF.ShapeCopy as ITopologicalOperator; IPointCollection resultLine = new PolylineClass(); { IPointCollection tempPs = pF.ShapeCopy as IPointCollection; if (tempPs.PointCount > 3) { tempPs.RemovePoints(tempPs.PointCount - 1, 1); } //if (tempPs.PointCount == 3) //{ // tempPs.RemovePoints(1, 1); // resultLine = new PolylineClass(); // for (int i = 0; i < tempPs.PointCount; i++) // { // resultLine.AddPoint(tempPs.Point[i]); // } // return resultLine; //} Dictionary mDicCount = new Dictionary(); int num = 0; int idx = 0; int bgNum = -1; for (int i = 0; i < tempPs.PointCount; i++) { List tempFs = FeatureAPI.Identify(tempPs.Point[i], pJcTb_Layer); List tempFs2 = FeatureAPI.Identify(tempPs.Point[i], dltbbg_Layer); if (tempFs.Count > tempFs2.Count && num < tempFs.Count) { num = tempFs.Count; if (resultLine.PointCount > 0) resultLine.RemovePoints(resultLine.PointCount - 1, 1); resultLine.AddPoint(tempPs.Point[i]); } //if ((tempFs.Count > 0 && tempFs2.Count == 0) || (tempFs.Count == bgFeatures.Count && tempFs2.Count != 0)) //{ // bgNum = tempFs2.Count; // idx = i; // resultLine.AddPoint(tempPs.Point[i]); //} } //if (resultLine.PointCount == 1 && bgNum > 0) //{ // tempPs.RemovePoints(idx, 1); // tempPs.RemovePoints(tempPs.PointCount - 1, 1); // resultLine = new PolylineClass(); // for (int i = 0; i < tempPs.PointCount; i++) // { // resultLine.AddPoint(tempPs.Point[i]); // } //} } return resultLine; //foreach (var item in bgFeatures) //{ // ITopologicalOperator bgTopo = item.ShapeCopy as ITopologicalOperator; // IGeometry bound = bgTopo.Boundary; // IGeometry geo = eTopo.Intersect(bound, esriGeometryDimension.esriGeometry1Dimension); // if (!geo.IsEmpty && (geo as IPolyline).Length > 0.0001) // { // IPointCollection tempPs = geo as IPointCollection; // Dictionary pCount = new Dictionary(); // for (int i = 0; i < tempPs.PointCount; i++) // { // List tempFs = FeatureAPI.Identify(tempPs.Point[i], pJcTb_Layer); // if (tempFs.Count > 0) // { // if (!pCount.ContainsKey(tempPs.Point[i])) // pCount.Add(tempPs.Point[i], tempFs.Count); // else // pCount[tempPs.Point[i]] = tempFs.Count; // } // } // int num = pCount.Max(m => m.Value); // lines.Add(geo); // continue; // } // if (lines.Count == 0) // { // geo = eTopo.Intersect(bound, esriGeometryDimension.esriGeometry0Dimension); // if (!geo.IsEmpty) // { // IPointCollection tempPs = geo as IPointCollection; // for (int i = 0; i < tempPs.PointCount; i++) // { // points.Add(tempPs.Point[i]); // } // } // } //} //if (lines.Count > 0) //{ // IGeometry spGeo = FeatureAPI.MergeGeometry(lines); // //MapsManager.Instance.MapService.DrawGraph(spGeo, true); // //MapsManager.Instance.MapService.Zoom(spGeo); // result = spGeo as IPointCollection; // //foreach (var item in lines) // //{ // // result.AddPoint((item as IPolyline).FromPoint); // // result.AddPoint((item as IPolyline).ToPoint); // //} //} //else //{ // result = new PolylineClass(); // foreach (var p in points) // { // result.AddPoint(p as IPoint); // } //} } return result; } catch (Exception ex) { return null; } } private bool RepairBgtbForPoint(IFeature pF, IFeatureLayer dltbbg_Layer, IPointCollection pPs) { bool result = false;// new List(); try { { List bgFeatures = FeatureAPI.Identify(pF.ShapeCopy, dltbbg_Layer); ITopologicalOperator eTopo = pF.ShapeCopy as ITopologicalOperator; IPolyline Errline = pPs as IPolyline; if (Errline.IsEmpty) return false; foreach (var item in bgFeatures) { IPointCollection bgPs = item.ShapeCopy as IPointCollection; for (int j = 0; j < bgPs.PointCount; j++) { //IPoint temp1 = bgPs.Point[j]; IPoint temp1 = null;// GeometryAPI.GetCrossPnt(Errline, bgPs.Point[j]); if (Errline.Length == 0) { temp1 = Errline.FromPoint; } else { temp1 = GeometryAPI.GetCrossPnt(Errline, bgPs.Point[j]); } if (temp1 == null) continue; IPolyline line = new PolylineClass(); line.FromPoint = bgPs.Point[j]; line.ToPoint = temp1; line.SpatialReference = item.ShapeCopy.SpatialReference; if ((line.Length < (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).XYResolution * 1000 && line.Length > (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).XYResolution)) { bgPs.UpdatePoint(j, temp1); } } IPolygon newShp = bgPs as IPolygon; ITopologicalOperator newTopo = newShp as ITopologicalOperator; newTopo.Simplify(); item.Shape = newShp; item.Store(); } } return result; } catch (Exception ex) { return false; } } private void RepairErrorResults() { try { this.ShowLoading($"正在进行【{_CheckName}】数据修复...", 0, 0); string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; IRDBHelper rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, DatabaseType.SQLite); DataTable dicDt = rdbHelper.ExecuteDatatable("DataCheckResults", string.Format($"SELECT * from DataCheckResults"), true); if (dicDt == null) return; foreach (DataRow row in dicDt.Rows) { string errorCode = row["ErrorCode"].ToString(); string errorLayerEngish = row["ErrorLayer"].ToString(); string errorBSM = row["BSM"].ToString(); string errorDesc = row["ErrorName"].ToString(); string objectId = row["ID"].ToString(); DataTable ruleDt = rdbHelper.ExecuteDatatable("CheckingRule", string.Format($"SELECT * from CheckingRule where RuleCode = '{errorCode}' "), true); if (ruleDt == null) return; foreach (DataRow ruleRow in ruleDt.Rows) { string repairSql = ruleRow["RepairSQL"].ToString(); if (string.IsNullOrWhiteSpace(repairSql) || string.IsNullOrEmpty(repairSql)) continue; repairSql = string.Format(repairSql, errorLayerEngish, errorBSM, (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE); IFeatureLayer errorFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(errorLayerEngish); (errorFeatureLayer as FeatureClass).Workspace.ExecuteSQL(repairSql); string dbPa = System.IO.Path.Combine((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ProjDir, "DataCheckrResult.db"); string sql = string.Format("update DataCheckResults set ErrorType='已修复' where ID = '{0}'", objectId); SQLiteDBOperate.Instance.ExecuteNonQuery(dbPa, sql, null); rdbHelper.ExecuteSQL($"delete from DataCheckResults where ID = '{objectId}' "); } } // 页面刷新 InitView(out bool isFinishd); this.CloseLoading(); } catch (Exception ex) { this.CloseLoading(); LogAPI.Debug(ex.Message); MessageHelper.ShowTips($"批量修复【{_CheckName}】失败,请查看日志!"); } } #region RepairGeometry private IGeometry RepairGeometry(IFeature feature, IGeometry geometry) { IGeometry geometrys = null; try { IPolyline tempLine = geometry as IPolyline; IPoint p1 = GeometryAPI.GetExtendedLinePoint(tempLine, 50); tempLine.ToPoint = p1; IPoint p2 = GeometryAPI.GetExtendedLinePoint(tempLine, -50); tempLine.FromPoint = p2; geometry = tempLine; geometrys = feature.ShapeCopy; IPointCollection ps = geometry as IPointCollection; IPointCollection reshapePath = new PathClass(); reshapePath.AddPointCollection(ps); IGeometryCollection geometryCollection = feature.ShapeCopy as IGeometryCollection; IRing ring = null; for (int i = 0; i < geometryCollection.GeometryCount; i++) { ring = geometryCollection.get_Geometry(i) as IRing; ring.Reshape(reshapePath as IPath); } geometrys = geometryCollection as IGeometry; if (geometrys == null || geometrys.IsEmpty) { return geometrys; } } catch (Exception ex) { LogAPI.Debug($"RepairGeometry异常,异常信息如下:{ex.Message}"); LogAPI.Debug(ex); } return geometrys; } #endregion private void RepairView_Closed(object sender, EventArgs e) { repairView = null; } /// /// 变更结果导出 /// /// /// private void BtnBatchImprot_Click(object sender, RoutedEventArgs e) { try { (sender as Button).IsEnabled = false; ExtensionShowWindow.MainWinForm.Enabled = false; WorkspaceAPI wsAPI = null; IWorkspaceFactory pSaveFct = null; IWorkspaceName workspaceName = null; pSaveFct = new FileGDBWorkspaceFactory(); IFeatureLayer dltbbg_Layer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG"); ISpatialReference pSR = null; string dbPath = System.IO.Path.GetDirectoryName((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).GetProjFilePath()) + @"\BGTJ.sqlite"; //错误地类图斑ID与错误信息 //DataTable dtFJ = SQLiteDBOperate.Instance.ExceDataTable(dbPath, $"select * from DataCheckResults where ErrorLayer='{m_Check.DataCheckName}' "); DataTable dtFJ = SQLiteDBOperate.Instance.ExceDataTable(dbPath, $"select * from DataCheckResults"); if (dtFJ == null || dtFJ.Rows.Count == 0) { MessageHelper.ShowTips("当前无检查结果数据导出!"); return; } string saveFile = ""; //弹出文件选择对话框 System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog(); System.Windows.Forms.DialogResult result = dialog.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK) { this.ShowLoading("进行检查结果数据导出……", 0, 0); saveFile = dialog.SelectedPath; string gdbFileName = "检查数据导出结果" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".gdb";//创建储存的GDB文件 string path = System.IO.Path.Combine(saveFile, gdbFileName); workspaceName = pSaveFct.Create(saveFile, gdbFileName, null, 0);//创建数据库 wsAPI = new WorkspaceAPI(path, WorkspaceTypeEnum.GDBFile); pSR = (dltbbg_Layer.FeatureClass as IGeoDataset).SpatialReference; GeoDBAPI.CreateFields(dltbbg_Layer.FeatureClass.Fields, out IFields fields); //括扑/城镇村检查结果导出 IFeatureClass KPCZC_featureClass = wsAPI.CreateFeatureClass("Check_Result", pSR, null).FeatureClass;//创建数据集 IFeatureClassAPI KPCZC_FcAPI = new FeatureClassAPI(KPCZC_featureClass); IFeatureCursor KPCZC_featureCursor = KPCZC_featureClass.Insert(true); KPCZC_FcAPI.AddField("SHAPE", esriFieldType.esriFieldTypeGeometry, "SHAPE"); KPCZC_FcAPI.AddField("OBJECTID", esriFieldType.esriFieldTypeString, "OBJECTID"); KPCZC_FcAPI.AddField("ErrorType", esriFieldType.esriFieldTypeString, "错误类型"); KPCZC_FcAPI.AddField("ErrorCode", esriFieldType.esriFieldTypeString, "错误代码"); KPCZC_FcAPI.AddField("ErrorDesc", esriFieldType.esriFieldTypeString, "错误信息"); KPCZC_FcAPI.AddField("ErrorData", esriFieldType.esriFieldTypeString, "ErrorData"); IFeatureBuffer featureBuffer = KPCZC_featureClass.CreateFeatureBuffer(); int ErrorTypeIndex = featureBuffer.Fields.FindField("ErrorType"); int ErrorCodeIndex = featureBuffer.Fields.FindField("ErrorCode"); int ErrorDescIndex = featureBuffer.Fields.FindField("ErrorDesc"); int ErroDataIndex = featureBuffer.Fields.FindField("ErrorData"); IGeometry geo = null; for (int i = 0; i < dtFJ.Rows.Count; i++) { this.UpdateMsg("检查数据导出已处理【" + i + "/" + dtFJ.Rows.Count + "】"); try { geo = FeatureAPI.ConstructPolygonFromPolyline(IPolygonExtension.ToGeometry(dtFJ.Rows[i]["ErrorArea"].ToString(), true, esriGeometryType.esriGeometryPolyline) as IPolyline); } catch { geo = IPolygonExtension.ToGeometry(dtFJ.Rows[i]["ErrorArea"].ToString(), false, esriGeometryType.esriGeometryPolygon); } if (geo != null) { featureBuffer.Shape = geo; featureBuffer.set_Value(ErrorTypeIndex, dtFJ.Rows[i]["RuleType"].ToString().Trim()); featureBuffer.set_Value(ErrorCodeIndex, dtFJ.Rows[i]["ErrorCode"].ToString().Trim()); featureBuffer.set_Value(ErrorDescIndex, dtFJ.Rows[i]["ErrorName"].ToString().Trim()); featureBuffer.set_Value(ErroDataIndex, dtFJ.Rows[i]["ErrorLayer"].ToString().Trim() + ",标识码_" + dtFJ.Rows[i]["BSM"].ToString().Trim()); KPCZC_featureCursor.InsertFeature(featureBuffer); featureBuffer = KPCZC_featureClass.CreateFeatureBuffer(); KPCZC_featureCursor.Flush(); } } KPCZC_featureCursor.Flush(); this.CloseLoading(); MessageHelper.ShowTips("检查结果导出成功!"); } } catch (Exception ex) { this.CloseLoading(); LogAPI.Debug(ex); MessageHelper.ShowTips("检查结果导出异常:" + ex.Message); } finally { (sender as Button).IsEnabled = true; ExtensionShowWindow.MainWinForm.Enabled = true; } } /// /// 加载检查结果视图数据 /// private void LoadData() { try { if (m_Check != null) { m_Check.StartLoadData(null); } } catch (Exception ex) { MessageHelper.ShowError("加载检查结果视图数据失败,请查看日志!"); LogAPI.Debug(ex.Message); } } public void DataCheckByThread(CheckParametr pParm) { try { IDataCheck = IdataChecks.FirstOrDefault(x => x.IDataCheckName == pParm.IDataCheckName); if (IDataCheck != null) { if (pParm.DataSource as IFeature != null) { ThreadManager2.QueueUserWorkItem(new WaitCallback(IDataCheck.FeatureCheck), pParm, null); } else if (pParm.DataSource as IFeatureClass != null) { ThreadManager2.QueueUserWorkItem(new WaitCallback(IDataCheck.FeatureCheck), pParm, null); } } } catch (Exception ex) { throw ex; } } public void DataCheck(CheckParametr pParm) { try { IDataCheck = IdataChecks.FirstOrDefault(x => x.IDataCheckName == pParm.IDataCheckName); if (IDataCheck != null) { IDataCheck.DataCheckComplate += _CheckInterface_InspectionCompleted; if (pParm.DataSource as IFeature != null) { IDataCheck.FeatureCheck(pParm); } else if (pParm.DataSource as IFeatureClass != null) { IDataCheck.FeatureClassCheck(pParm); } IDataCheck.DataCheckComplate -= _CheckInterface_InspectionCompleted; } } catch (Exception ex) { throw ex; } } void _CheckInterface_InspectionCompleted(List Result, CheckParametr pParm) { try { string dbPath = string.Empty; IFeature feature = pParm.DataSource as IFeature; try { //更新界面逻辑 ProjectInfo projectInfo = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo); dbPath = System.IO.Path.Combine(projectInfo.ProjDir, "DataCheckrResult.db"); SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, $"CREATE TABLE IF NOT exists DataCheckResults (`ID` INTEGER, `ErrorLayer` TEXT,`OBJECTID` TEXT,`ErrorType` TEXT,`ErrorCode` TEXT,`ErrorDesc` TEXT,`ErrorData` TEXT,`ErrorArea` TEXT,`ErrorMJ` NUMERIC,`Synopsis` TEXT,`ErrorCategory` TEXT ,PRIMARY KEY(`ID`))", null); if (feature != null) SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, $"delete from DataCheckResults WHERE OBJECTID='{feature.OID}' ;", null);//删除当前数据相关的核查结果 else SQLiteDBOperate.Instance.ExecuteNonQuery(dbPath, $"delete from DataCheckResults where ErrorLayer='{pParm.IDataCheckName}' and ErrorCategory='{pParm.CheckType}' ;", null); if (pParm.CheckResults == null) return; if (pParm.CheckResults.Count == 0) return; List sqlList = new List(); foreach (var item in pParm.CheckResults) { sqlList.Add(string.Format("INSERT INTO DataCheckResults (ErrorLayer,OBJECTID,ErrorType,ErrorCode,ErrorDesc,ErrorArea,Synopsis,ErrorCategory) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')", item.ErrorLayer, item.ObjectID, item.ErrorType, item.ErrorCode, item.ErrorDesc, item.ErrorArea, item.Synopsis, item.ErrorCategory)); } InsertSQLiteData(dbPath, sqlList); } catch (Exception ex) { LogAPI.Debug("批量插入SQLite数据(地址:" + dbPath + ") 执行失败,异常原因: " + ex.Message + " ; "); throw ex; } } catch (Exception ex) { throw ex; } } #region GetUnionResult /// /// GetUnionResult /// /// 变更图斑 /// 基础地类图斑 private List GetUnionResult(IFeatureClass DLTBBGFc, IFeatureLayer JC_DLTBFc, string RuleCode, string TempfilePath) { GPParamClass paramClass = null; IFeatureLayer Temp_Union = null; //IFeatureLayer SelectFeatureLayer = null; IFeatureLayer multipartToSingleFeatureLayer = null; List sqlList = new List(); ProjectInfo ProjInfo = null; try { if (DLTBBGFc == null || DLTBBGFc.FeatureCount(null) == 0 || JC_DLTBFc == null || JC_DLTBFc.FeatureClass.FeatureCount(null) == 0) { return sqlList; } ProjInfo = MapsManager.Instance.CurrProjectInfo as ProjectInfo; //paramClass = new GPParamClass() //{ // Tolerance = "0.0001", // FirstFeatureLayer = JC_DLTBFc, // SecondFeatureClass = DLTBBGFc, // IsGetOutPutFeature = true, //}; //GeoprocessorHelper.SelectLayerByLocationAnalysis(paramClass, "INTERSECT", ref SelectFeatureLayer); paramClass = new GPParamClass() { FirstFeatureLayer = new FeatureLayerClass() { FeatureClass = DLTBBGFc }, SecondFeatureLayer = JC_DLTBFc, OutFeatureClassPath = $"{TempfilePath}\\Temp_Union", IsGetOutPutFeature = true, PreserveAttributes = "ALL" }; GeoprocessorHelper.UnionAnalysis(paramClass, ref Temp_Union, ProjInfo.XYResolution.ToString()); paramClass = new GPParamClass(); paramClass.FirstFeatureLayer = Temp_Union; paramClass.OutFeatureClassPath = $"{TempfilePath}\\Multipart"; paramClass.IsGetOutPutFeature = true; GeoprocessorHelper.MultipartToSinglePath(paramClass, ref multipartToSingleFeatureLayer); if (multipartToSingleFeatureLayer.FeatureClass != null) { IFeatureCursor pCursor = multipartToSingleFeatureLayer.FeatureClass.Search(new QueryFilterClass() { SubFields = $"OBJECTID,FID_DLTBBG,BSM,SHAPE,SHAPE_Area", WhereClause = "SHAPE_Area<0.1" }, true); IFeature feature = null; var iFID_DLTBBG = multipartToSingleFeatureLayer.FeatureClass.FindField("FID_DLTBBG"); var iBSM = multipartToSingleFeatureLayer.FeatureClass.FindField("BSM"); while ((feature = pCursor.NextFeature()) != null) { var FID_DLTBBG = feature.Value[iFID_DLTBBG].ToTrim(); var BSM = feature.Value[iBSM].ToTrim(); IGeometry geometry = feature.ShapeCopy; ITopologicalOperator topo = geometry as ITopologicalOperator; topo.Simplify(); if (geometry.IsEmpty) continue; sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea,MultipartOID,RepairfilePath) VALUES ('{FID_DLTBBG}', '{BSM}', 'DLTBBG', '{RuleCode}', '变更图斑与基础库图斑不套合,且碎图斑面积小于0.1','图形拓扑','{feature.Shape.ToJson()}',{feature.OID},'{TempfilePath}');"); if (feature != null) Marshal.ReleaseComObject(feature); } } } catch (Exception ex) { LogAPI.Debug($"GetUnionResult执行错误:{ex.Message}"); LogAPI.Debug(ex); } finally { if (Temp_Union != null) Marshal.ReleaseComObject(Temp_Union); if (multipartToSingleFeatureLayer != null) Marshal.ReleaseComObject(multipartToSingleFeatureLayer); } return sqlList; } #region DelectDirect private static 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 ex) { //MessageHelper.ShowWarning("工程目录文件有占用,请退出占用后重试!"); LogAPI.Debug("工程目录文件有占用,请退出占用后重试!" + ex); } } #endregion #region 创建临时数据 private string CreateTempfile(string gdbName) { IWorkspaceFactory pFtWsFct = null; IDataCatalogService _DataCatalog = null; try { string gdbFolder = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ProjDir + "\\DataCheck"; if (!Directory.Exists(gdbFolder)) Directory.CreateDirectory(gdbFolder); PluginServiceInterface.CommonHelper.DelectDir(gdbFolder); pFtWsFct = new FileGDBWorkspaceFactory(); string gdbFileName = Guid.NewGuid().ToString(); string path = System.IO.Path.Combine(gdbFolder, gdbFileName); string BGDatabasepath = string.Empty; string jcfcName = string.Empty; if (gdbName == "BGDB") BGDatabasepath = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).BGDatabase; else if (gdbName == "ZLDB") BGDatabasepath = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).ZLDatabase; else { if (_DataCatalog == null) _DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService(); if (_DataCatalog.CurrentLayers is LayerCfg) { LayerCfg ncsj = (_DataCatalog.CurrentLayers as LayerCfg).Layers.FirstOrDefault(f => f.LayerName == "年初数据" && f.LayerType == EnumLayerType.GroupLayer); List NcList = ncsj.GetAllItem(); LayerCfg _JcTBLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "地类图斑"); if (_JcTBLayerInfo != null) { var sp = _JcTBLayerInfo.FcPath.Split('\\'); jcfcName = sp[sp.Length - 1]; BGDatabasepath = _JcTBLayerInfo.FcPath; } } } if (Directory.Exists(BGDatabasepath)) { if (!string.IsNullOrEmpty(jcfcName)) TempfilePath = $"{path}\\{jcfcName}"; else TempfilePath = $"{path}\\{gdbName}.gdb"; CopyDirectory(BGDatabasepath, TempfilePath, true); } } catch (Exception ex) { throw ex; } (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).DataCheckPath = TempfilePath; Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProject" }); return TempfilePath; } /// /// 拷贝模板gdb文件夹 /// /// /// /// public static void CopyDirectory(string SourcePath, string DestinationPath, bool overwriteexisting) { try { SourcePath = SourcePath.EndsWith(@"\") ? SourcePath : SourcePath + @"\"; DestinationPath = DestinationPath.EndsWith(@"\") ? DestinationPath : DestinationPath + @"\"; if (Directory.Exists(SourcePath)) { if (Directory.Exists(DestinationPath) == false) Directory.CreateDirectory(DestinationPath); foreach (string fls in Directory.GetFiles(SourcePath)) { FileInfo flinfo = new FileInfo(fls); flinfo.CopyTo(DestinationPath + flinfo.Name, overwriteexisting); } foreach (string drs in Directory.GetDirectories(SourcePath)) { DirectoryInfo drinfo = new DirectoryInfo(drs); CopyDirectory(drs, DestinationPath + drinfo.Name, overwriteexisting); } } } catch (Exception ex) { throw ex; } } #endregion #endregion #region GetTopology private List GetTopology(string TempfilePath, string LayerName, string ErrorCode, string ErrorName) { IEnvelope envelope = null; string topologyName = $"TopologyCheck_{LayerName}"; try { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(TempfilePath, WorkspaceTypeEnum.GDBFile); var featureClassAPI = workspaceAPI.OpenFeatureClass(LayerName); TopologyVerification(topologyName, featureClassAPI.FeatureClass, new List { esriTopologyRuleType.esriTRTAreaNoOverlap }, ref envelope); return FindAllError(topologyName, envelope, featureClassAPI.FeatureClass, LayerName, ErrorCode, ErrorName); } catch (Exception ex) { throw ex; } } #region checkTopologyError public List FindAllErrorFeatures(string topologyName, IEnvelope searchExtent, IFeatureClass DLTBBG) { List sqlList = new List(); IFeatureDataset featureDataset = DLTBBG.FeatureDataset; ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset; ITopology topology = topologyContainer.get_TopologyByName(topologyName); //获取坐标系 IErrorFeatureContainer errorFeatureContainer = (IErrorFeatureContainer)topology; IGeoDataset geoDataset = (IGeoDataset)topology; ISpatialReference spatialReference = geoDataset.SpatialReference; ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology; //遍历拓扑规则 IEnumRule enumRule = topologyRuleContainer.Rules; enumRule.Reset(); ESRI.ArcGIS.Geodatabase.IRule rule = null; List bsmlist = new List(); while ((rule = enumRule.Next()) != null) { //获取当前拓扑规则的拓扑错误并遍历 ITopologyRule topologyRule = (ITopologyRule)rule; IEnumTopologyErrorFeature enumTopologyErrorFeature = errorFeatureContainer.get_ErrorFeatures(spatialReference, topologyRule, searchExtent, true, true); ITopologyErrorFeature topologyErrorFeature = null; while ((topologyErrorFeature = enumTopologyErrorFeature.Next()) != null) { IFeature pFeature = topologyErrorFeature as IFeature; if (pFeature != null && !pFeature.Shape.IsEmpty) { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea,RepairfilePath) VALUES ('{topologyErrorFeature.OriginOID}', '{topologyErrorFeature.OriginOID}-{topologyErrorFeature.DestinationOID}', 'DLTBBG', '32074304000007', '变更图斑要素存在重叠','图形拓扑','{pFeature.Shape.ToJson()}','{TempfilePath}');"); } } } //try //{ // IDataset pDatasetTemp = (IDataset)topology; // pDatasetTemp.Delete(); // Marshal.ReleaseComObject(pDatasetTemp); //} //catch { } return sqlList; } /// /// 检查要素层中存在的拓扑错误 /// /// 工作空间名称 /// 数据集名称 /// 要素类名称 /// 拓扑要素层名,拓扑检查结果记录在该层中 public void checkTopologyError(string topologyName, IFeatureClass DLTBBG, ref IEnvelope envelope) { //1. 打开数据集文件 IWorkspace workspace = (DLTBBG as FeatureClass).Workspace; //2. 打开数据集文件 IFeatureDataset featureDataset = DLTBBG.FeatureDataset; //3. 向拓扑集中添加要素层 IFeatureClass LRDLlayer = DLTBBG; //4. 设置拓扑处理对数据集的独占权限 ISchemaLock schemaLock = (ISchemaLock)featureDataset; IWorkspaceFactory2 ipWsFactory = new FileGDBWorkspaceFactoryClass(); ITopologyContainer2 topologyContainer = featureDataset as ITopologyContainer2; //判断拓扑是否存在 bool bTopExists = (featureDataset.Workspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTTopology, topologyName); if (bTopExists) { ITopology topologyTemp = topologyContainer.get_TopologyByName(topologyName); IDataset pDatasetTemp = (IDataset)topologyTemp; pDatasetTemp.Delete();//删除拓扑 Marshal.ReleaseComObject(pDatasetTemp); } //关闭资源锁定 IWorkspaceFactoryLockControl ipWsFactoryLock; ipWsFactoryLock = (IWorkspaceFactoryLockControl)ipWsFactory; if (ipWsFactoryLock.SchemaLockingEnabled) { ipWsFactoryLock.DisableSchemaLocking(); } try { schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock); //5. 拓扑处理 //5.1 创建拓扑容器 //5.2 向拓扑容器中添加拓扑结果层 ITopology2 topology = topologyContainer.CreateTopology(topologyName, topologyContainer.DefaultClusterTolerance, -1, "") as ITopology2; //5.3 添加参与拓扑运算的数据层 topology.AddClass(LRDLlayer, 5, 1, 1, false); //5.4 添加拓扑规则 AddRuleToTopology(topology, esriTopologyRuleType.esriTRTAreaNoOverlap, "图层内部面和面之间不允许重叠", LRDLlayer, null); //5.5 拓扑验证 IGeoDataset geoDataset = (IGeoDataset)topology; envelope = geoDataset.Extent; ValidateTopology(topology, envelope); } catch (COMException comExc) { throw new Exception(String.Format("Error creating topology: {0} Message: {1}", comExc.ErrorCode, comExc.Message), comExc); } finally { schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock); } } public void AddRuleToTopology(ITopology topology, esriTopologyRuleType ruleType, String ruleName, IFeatureClass featureClass, IFeatureClass destinationClass) { ITopologyRule topologyRule = new TopologyRuleClass(); topologyRule.TopologyRuleType = ruleType; topologyRule.Name = ruleName; topologyRule.OriginClassID = featureClass.FeatureClassID; topologyRule.AllOriginSubtypes = true; if (destinationClass != null) { topologyRule.DestinationClassID = destinationClass.FeatureClassID; topologyRule.AllDestinationSubtypes = true; } ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology; if (topologyRuleContainer.get_CanAddRule(topologyRule)) { topologyRuleContainer.AddRule(topologyRule); } else { throw new ArgumentException(string.Format("不能添加{0}规则到拓扑里面,请检查此规则是否正确。", ruleName)); } } public void ValidateTopology(ITopology topology, IEnvelope envelope) { try { IPolygon locationPolygon = new PolygonClass(); ISegmentCollection segmentCollection = (ISegmentCollection)locationPolygon; segmentCollection.SetRectangle(envelope); IPolygon polygon = topology.get_DirtyArea(locationPolygon); IEnvelope areaToValidate = polygon.Envelope; IEnvelope areaValidated = topology.ValidateTopology(areaToValidate); locationPolygon.Close(); polygon.Close(); } catch (Exception ex) { LogAPI.Debug("校验括扑异常:" + ex); } } #endregion #endregion #region GetTopology_DLTB /// /// //基础地类图斑重叠,缝隙 /// /// 规则编码 /// private List GetTopology_DLTB(string ErrorCode) { IEnvelope envelope = null; string topologyName = "TopologyCheck_DLTB"; try { IFeatureLayer JC_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTB"); TopologyVerification(topologyName, JC_featureLayer.FeatureClass, new List { esriTopologyRuleType.esriTRTAreaNoOverlap, esriTopologyRuleType.esriTRTAreaNoGaps }, ref envelope); //checkTopologyError_DLTB(topologyName, dltb.FeatureClass, ref envelope); return FindAllError(topologyName, envelope, JC_featureLayer.FeatureClass, "DLTB", ErrorCode, "基础地类图斑");//FindAllErrorFeatures_DLTB(topologyName, dltb.FeatureClass, envelope); } catch (Exception ex) { throw ex; } } /// /// //基础地类图斑重叠,缝隙 /// /// 规则编码 /// private List GetTopology_DLTBBG(string ErrorCode, string Layername) { IEnvelope envelope = null; string topologyName = $"TopologyCheck_{Layername}"; try { IFeatureLayer JC_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(Layername); TopologyVerification(topologyName, JC_featureLayer.FeatureClass, new List { esriTopologyRuleType.esriTRTAreaNoOverlap }, ref envelope); //checkTopologyError_DLTB(topologyName, dltb.FeatureClass, ref envelope); return FindAllError(topologyName, envelope, JC_featureLayer.FeatureClass, Layername, ErrorCode, Layername); } catch (Exception ex) { throw ex; } } /// /// 检查要素层中存在的拓扑错误 /// /// 工作空间名称 /// 数据集名称 /// 要素类名称 /// 拓扑要素层名,拓扑检查结果记录在该层中 public void checkTopologyError_DLTB(string topologyName, IFeatureClass JCFC, ref IEnvelope envelope) { //IFeatureLayer JCFC = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); //1. 打开数据集文件 IWorkspace workspace = (JCFC as FeatureClass).Workspace; //2. 打开数据集文件 IFeatureDataset featureDataset = JCFC.FeatureDataset; //3. 向拓扑集中添加要素层 IFeatureClass LRDLlayer = JCFC; //4. 设置拓扑处理对数据集的独占权限 ISchemaLock schemaLock = (ISchemaLock)featureDataset; IWorkspaceFactory2 ipWsFactory = new FileGDBWorkspaceFactoryClass(); ITopologyContainer2 topologyContainer = featureDataset as ITopologyContainer2; //判断拓扑是否存在 bool bTopExists = (featureDataset.Workspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTTopology, topologyName); if (bTopExists) { ITopology topologyTemp = topologyContainer.get_TopologyByName(topologyName); IDataset pDatasetTemp = (IDataset)topologyTemp; pDatasetTemp.Delete();//删除拓扑 Marshal.ReleaseComObject(pDatasetTemp); } //关闭资源锁定 IWorkspaceFactoryLockControl ipWsFactoryLock; ipWsFactoryLock = (IWorkspaceFactoryLockControl)ipWsFactory; if (ipWsFactoryLock.SchemaLockingEnabled) { ipWsFactoryLock.DisableSchemaLocking(); } try { schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock); //5. 拓扑处理 //5.1 创建拓扑容器 //5.2 向拓扑容器中添加拓扑结果层 ITopology2 topology = topologyContainer.CreateTopology(topologyName, topologyContainer.DefaultClusterTolerance, -1, "") as ITopology2; //5.3 添加参与拓扑运算的数据层 topology.AddClass(LRDLlayer, 5, 1, 1, false); //5.4 添加拓扑规则 AddRuleToTopology(topology, esriTopologyRuleType.esriTRTAreaNoOverlap, "图层内部面和面之间不允许重叠", LRDLlayer, null); AddRuleToTopology(topology, esriTopologyRuleType.esriTRTAreaNoGaps, "图层内部面和面之间不允许存在缝隙", LRDLlayer, null); //5.5 拓扑验证 IGeoDataset geoDataset = (IGeoDataset)topology; envelope = geoDataset.Extent; ValidateTopology(topology, envelope); } catch (COMException comExc) { throw new Exception(String.Format("Error creating topology: {0} Message: {1}", comExc.ErrorCode, comExc.Message), comExc); } finally { schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock); } } public List FindAllErrorFeatures_DLTB(string topologyName, IFeatureClass JCFC, IEnvelope searchExtent) { List sqlList = new List(); //IFeatureLayer JCFC = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); IFeatureDataset featureDataset = JCFC.FeatureDataset; ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset; ITopology topology = topologyContainer.get_TopologyByName(topologyName); //获取坐标系 IErrorFeatureContainer errorFeatureContainer = (IErrorFeatureContainer)topology; IGeoDataset geoDataset = (IGeoDataset)topology; ISpatialReference spatialReference = geoDataset.SpatialReference; ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology; //遍历拓扑规则 IEnumRule enumRule = topologyRuleContainer.Rules; enumRule.Reset(); ESRI.ArcGIS.Geodatabase.IRule rule = null; var count = 0; while ((rule = enumRule.Next()) != null) { //获取当前拓扑规则的拓扑错误并遍历 ITopologyRule topologyRule = (ITopologyRule)rule; IEnumTopologyErrorFeature enumTopologyErrorFeature = errorFeatureContainer.get_ErrorFeatures(spatialReference, topologyRule, searchExtent, true, true); ITopologyErrorFeature topologyErrorFeature = null; while ((topologyErrorFeature = enumTopologyErrorFeature.Next()) != null) { IFeature pFeature = topologyErrorFeature as IFeature; if (pFeature != null) { if (topologyRule.Name == "图层内部面和面之间不允许存在缝隙" && count == 0) { count++; continue; } if (pFeature != null && !pFeature.Shape.IsEmpty) { if (topologyRule.Name == "图层内部面和面之间不允许存在缝隙") sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{topologyErrorFeature.OriginOID}', '{topologyErrorFeature.OriginOID}-{topologyErrorFeature.DestinationOID}', 'DLTB', '32074304000008', '基础地类图斑图层内部面和面之间不允许存在缝隙','图形拓扑','{pFeature.Shape.ToJson()}');"); else sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea,RepairfilePath) VALUES ('{topologyErrorFeature.OriginOID}', '{topologyErrorFeature.OriginOID}-{topologyErrorFeature.DestinationOID}', 'DLTB', '32074304000007', '基础地类图斑图层内部面和面之间不允许重叠','图形拓扑','{pFeature.Shape.ToJson()}','{TempfilePath}');"); } } } } try { //IDataset pDatasetTemp = (IDataset)topology; //pDatasetTemp.Delete(); //Marshal.ReleaseComObject(pDatasetTemp); } catch { } return sqlList; } #endregion #region 自相交-多部件 private void CheckGraphic(object threadParam) { IFeature pfeature = null; IFeatureCursor pCursor = null; ThreadParam _Parm = threadParam as ThreadParam; try { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(_Parm.Temppath, WorkspaceTypeEnum.GDBFile); var featureClass = workspaceAPI.OpenFeatureClass(_Parm.Check_LayerName); pCursor = featureClass.FeatureClass.Search(null, true); int iBSM = featureClass.FeatureClass.FindField("BSM"); string strBSM = string.Empty; while ((pfeature = pCursor.NextFeature()) != null) { IPointCollection polygonVertices = new PolygonClass(); IPointCollection lineVertices = pfeature.ShapeCopy as IPointCollection; polygonVertices.AddPointCollection(lineVertices); ITopologicalOperator3 pTopology = polygonVertices as ITopologicalOperator3; esriNonSimpleReasonEnum reason = esriNonSimpleReasonEnum.esriNonSimpleOK; pTopology.IsKnownSimple_2 = false; if (!pTopology.get_IsSimpleEx(out reason)) { if (iBSM != -1) strBSM = pfeature.Value[iBSM].ToString(); if (reason == esriNonSimpleReasonEnum.esriNonSimpleSelfIntersections && _Parm.Check_RuleName.Contains("自相交"))//自相交 { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{pfeature.OID}', '{strBSM}', '{featureClass.FeatureClass.AliasName}', '{_Parm.Check_RuleCode}', '{_Parm.Check_RuleName}','图形拓扑','{pfeature.Shape.ToJson()}');"); } if (reason == esriNonSimpleReasonEnum.esriNonSimpleUnclosedRing && _Parm.Check_RuleName.Contains("组合图斑"))//组合图斑 { IPolygon4 polygon = pfeature.ShapeCopy as IPolygon4; IGeometryBag bag = polygon.ExteriorRingBag; if ((bag as IGeometryCollection).GeometryCount > 1) { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{pfeature.OID}', '{strBSM}', '{featureClass.FeatureClass.AliasName}', '{_Parm.Check_RuleCode}', '{_Parm.Check_RuleName}','图形拓扑','{pfeature.Shape.ToJson()}');"); } } } if (pTopology != null) Marshal.ReleaseComObject(pTopology); if (lineVertices != null) Marshal.ReleaseComObject(lineVertices); if (polygonVertices != null) Marshal.ReleaseComObject(polygonVertices); } } catch (Exception ex) { throw ex; } finally { if (pfeature != null) Marshal.ReleaseComObject(pfeature); if (pCursor != null) Marshal.ReleaseComObject(pCursor); GC.Collect(); } } #endregion #region 拓扑验证 /// /// 拓扑验证 /// /// 拓扑名称 /// featureClass /// 验证规则 /// private void TopologyVerification(string topologyName, IFeatureClass featureClass, List esriTopologyRuleTypes, ref IEnvelope envelope) { //1. 打开数据集文件 IWorkspace workspace = (featureClass as FeatureClass).Workspace; //2. 打开数据集文件 IFeatureDataset featureDataset = featureClass.FeatureDataset; //3. 向拓扑集中添加要素层 IFeatureClass LRDLlayer = featureClass; //4. 设置拓扑处理对数据集的独占权限 ISchemaLock schemaLock = (ISchemaLock)featureDataset; IWorkspaceFactory2 ipWsFactory = new FileGDBWorkspaceFactoryClass(); ITopologyContainer2 topologyContainer = featureDataset as ITopologyContainer2; //判断拓扑是否存在 bool bTopExists = (featureDataset.Workspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTTopology, topologyName); if (bTopExists) { ITopology topologyTemp = topologyContainer.get_TopologyByName(topologyName); IDataset pDatasetTemp = (IDataset)topologyTemp; pDatasetTemp.Delete();//删除拓扑 Marshal.ReleaseComObject(pDatasetTemp); } //关闭资源锁定 IWorkspaceFactoryLockControl ipWsFactoryLock; ipWsFactoryLock = (IWorkspaceFactoryLockControl)ipWsFactory; if (ipWsFactoryLock.SchemaLockingEnabled) { ipWsFactoryLock.DisableSchemaLocking(); } try { schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock); //5. 拓扑处理 //5.1 创建拓扑容器 //5.2 向拓扑容器中添加拓扑结果层 ITopology2 topology = topologyContainer.CreateTopology(topologyName, topologyContainer.DefaultClusterTolerance, -1, "") as ITopology2; //5.3 添加参与拓扑运算的数据层 topology.AddClass(LRDLlayer, 5, 1, 1, false); //5.4 添加拓扑规则 string ruleName = string.Empty; foreach (var item in esriTopologyRuleTypes) { switch (item) { case esriTopologyRuleType.esriTRTAreaNoGaps: ruleName = "图层内部面和面之间不允许存在缝隙"; break; case esriTopologyRuleType.esriTRTAreaNoOverlap: ruleName = "图层内部面和面之间不允许重叠"; break; case esriTopologyRuleType.esriTRTLineNoDangles: ruleName = "图层内部不允许存在悬挂线"; break; default: break; } AddRuleToTopology(topology, item, ruleName, LRDLlayer, null); } //AddRuleToTopology(topology, esriTopologyRuleType.esriTRTAreaNoOverlap, "图层内部面和面之间不允许重叠", LRDLlayer, null); //AddRuleToTopology(topology, esriTopologyRuleType.esriTRTAreaNoGaps, "图层内部面和面之间不允许存在缝隙", LRDLlayer, null); //5.5 拓扑验证 IGeoDataset geoDataset = (IGeoDataset)topology; envelope = geoDataset.Extent; ValidateTopology(topology, envelope); } catch (COMException comExc) { throw new Exception(String.Format("Error creating topology: {0} Message: {1}", comExc.ErrorCode, comExc.Message), comExc); } finally { schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock); } } /// /// 获取拓扑错误 /// /// /// /// /// public List FindAllError(string topologyName, IEnvelope searchExtent, IFeatureClass featureClass, string ErrorLayer, string ErrorCode, string ErrorName) { ITopology topology = null; List sqlList = new List(); try { IFeatureDataset featureDataset = featureClass.FeatureDataset; ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset; topology = topologyContainer.get_TopologyByName(topologyName); //获取坐标系 IErrorFeatureContainer errorFeatureContainer = (IErrorFeatureContainer)topology; IGeoDataset geoDataset = (IGeoDataset)topology; ISpatialReference spatialReference = geoDataset.SpatialReference; ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology; //遍历拓扑规则 IEnumRule enumRule = topologyRuleContainer.Rules; enumRule.Reset(); ESRI.ArcGIS.Geodatabase.IRule rule = null; List bsmlist = new List(); var count = 0; LogAPI.Debug("数据检查-获取拓扑错误"); while ((rule = enumRule.Next()) != null) { //获取当前拓扑规则的拓扑错误并遍历 ITopologyRule topologyRule = (ITopologyRule)rule; IEnumTopologyErrorFeature enumTopologyErrorFeature = errorFeatureContainer.get_ErrorFeatures(spatialReference, topologyRule, searchExtent, true, true); ITopologyErrorFeature topologyErrorFeature = null; while ((topologyErrorFeature = enumTopologyErrorFeature.Next()) != null) { if (topologyErrorFeature is IFeature pFeature) { if (topologyRule.Name == "图层内部面和面之间不允许存在缝隙" && count == 0) { count++; continue; } if (pFeature != null && !pFeature.Shape.IsEmpty) { string FeatureJSON = GeometryConvertHelper.ConvertIGeoemtryToWKT(pFeature.Shape); //string JSON_F = pFeature.Shape.ToJson(); //IGeometry geometryJSON = GeometryConvertHelper.ConvertWKTToIGeometry(FeatureJSON); if (topologyRule.Name == "图层内部面和面之间不允许存在缝隙") { //ITopologicalOperator topoOperator = pFeature.ShapeCopy as ITopologicalOperator; //double bufferDistance = 0.001; // 缓冲区距离,根据实际需求设置 //IGeometry bufferGeometry = topoOperator.Buffer(bufferDistance); //// 确保缓冲区几何体是多边形类型 //IPolygon polygon = bufferGeometry as IPolygon; //if (polygon != null) //{ // FeatureJSON = GeometryConvertHelper.ConvertIGeoemtryToWKT(polygon); // // 在这里处理多边形,比如保存到图层、进行空间分析等 //} if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline) { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{topologyErrorFeature.OriginOID}', '{SearchBSM(topologyErrorFeature.OriginOID, pFeature)}-{SearchBSM(topologyErrorFeature.DestinationOID, pFeature)}', '{ErrorLayer}', '{ErrorCode}', '{ErrorName}图层内部面和面之间不允许存在缝隙(线-批量不处理)','图形拓扑','{FeatureJSON}');"); } else { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{topologyErrorFeature.OriginOID}', '{SearchBSM(topologyErrorFeature.OriginOID, pFeature)}-{SearchBSM(topologyErrorFeature.DestinationOID, pFeature)}', '{ErrorLayer}', '{ErrorCode}', '{ErrorName}图层内部面和面之间不允许存在缝隙(面)','图形拓扑','{FeatureJSON}');"); } } else if (topologyRule.Name.Contains("图层内部面和面之间不允许重叠")) { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{topologyErrorFeature.OriginOID}', '{SearchBSM(topologyErrorFeature.OriginOID, pFeature, ErrorLayer)}-{SearchBSM(topologyErrorFeature.DestinationOID, pFeature, ErrorLayer)}', '{ErrorLayer}', '{ErrorCode}', '{ErrorName}图层内部面和面之间不允许重叠','图形拓扑','{FeatureJSON}');"); } else if (topologyRule.Name.Contains("悬挂线")) { string bsm = SearchBSM(topologyErrorFeature.OriginOID, pFeature, ErrorLayer); if (!JudgeContains(sqlList, bsm)) sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{topologyErrorFeature.OriginOID}', '{bsm}', '{ErrorLayer}', '{ErrorCode}', '{ErrorName}图层内部不允许存在悬挂线','图形拓扑','{FeatureJSON}');"); } else if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline) { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{topologyErrorFeature.OriginOID}', '{SearchBSM(topologyErrorFeature.OriginOID, pFeature)}-{SearchBSM(topologyErrorFeature.DestinationOID, pFeature)}', '{ErrorLayer}', '{ErrorCode}', '{ErrorName}图层内部面和面之间不允许重叠(线-批量不处理)','图形拓扑','{FeatureJSON}');"); } else { sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{topologyErrorFeature.OriginOID}', '{SearchBSM(topologyErrorFeature.OriginOID, pFeature)}-{SearchBSM(topologyErrorFeature.DestinationOID, pFeature)}', '{ErrorLayer}', '{ErrorCode}', '{ErrorName}图层内部面和面之间不允许重叠(面)','图形拓扑','{FeatureJSON}');"); } } } } } } catch (Exception ex) { LogAPI.Debug("获取拓扑错误异常:" + ex.Message + ex.StackTrace); } finally { try { if (topology != null) { IDataset pDatasetTemp = (IDataset)topology; pDatasetTemp.Delete(); Marshal.ReleaseComObject(pDatasetTemp); } } catch { } } return sqlList; } #endregion private bool JudgeContains(List list, string containsStr) { foreach (string item in list) { if (item.Contains(containsStr)) return true; } return false; } private string SearchBSM(int objectID, IFeature pFeature, string layerName = "DLTB") { string BSM = ""; IFeature pfeature = null; IFeatureCursor pCursor = null; IFeatureLayer JC_featureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName(layerName); IQueryFilter queryfilter = new QueryFilterClass(); queryfilter.WhereClause = $" OBJECTID = {objectID}"; try { pCursor = JC_featureLayer.FeatureClass.Search(queryfilter, true); int iBSM = JC_featureLayer.FeatureClass.FindField("BSM"); if (iBSM == -1) return ""; while ((pfeature = pCursor.NextFeature()) != null) { BSM = pfeature.Value[iBSM].ToString(); return BSM; } if (!string.IsNullOrEmpty(BSM)) return BSM; IGeometry geometry = null; try { geometry = IPolygonExtension.ToGeometry(pFeature.Shape.ToJson(), true, esriGeometryType.esriGeometryPolygon); } catch { try { geometry = IPolygonExtension.ToGeometry(pFeature.Shape.ToJson(), false, esriGeometryType.esriGeometryPolyline); } catch { } } if (geometry != null && !geometry.IsEmpty) BSM = GetIdentifyBSM(geometry, JC_featureLayer); return BSM; } catch (Exception ex) { return BSM; } } public string GetIdentifyBSM(IGeometry pGeo, IFeatureLayer pLayer) { string tempBsm = ""; try { if (pGeo != null && !pGeo.IsEmpty && pLayer != null) { IIdentify identify = pLayer as IIdentify; if (identify == null) return tempBsm; ESRI.ArcGIS.esriSystem.IArray array = identify.Identify(pGeo); if (array == null || array.Count == 0) return tempBsm; for (int i = 0; i < array.Count; i++) { IRowIdentifyObject row = (IRowIdentifyObject)array.get_Element(i); if (row == null) continue; IFeature pFeature = row.Row as IFeature; int bsmFieldIndex = pFeature.Fields.FindField("BSM"); if (bsmFieldIndex != -1) tempBsm = pFeature.Value[bsmFieldIndex].ToString(); return tempBsm; } } } catch (Exception ex) { LogAPI.Debug(ex); return tempBsm; } return tempBsm; } #region 地类图斑更新层平均节点密度大于1米小于70米 private void NodeDensity(object threadParam) { IFeature pfeature = null; List sqlList = new List(); IFeatureCursor pCursor = null; ThreadParam _Parm = threadParam as ThreadParam; try { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(_Parm.Temppath, WorkspaceTypeEnum.GDBFile); var featureClass = workspaceAPI.OpenFeatureClass(_Parm.Check_LayerName); pCursor = featureClass.FeatureClass.Search(null, true); int iBSM = featureClass.FeatureClass.FindField("BSM"); string strBSM = string.Empty; while ((pfeature = pCursor.NextFeature()) != null) { List Segmentslength = new List(); IGeometryCollection _GeoColl = pfeature.ShapeCopy as IGeometryCollection; for (int i = 0; i < _GeoColl.GeometryCount; i++) { ISegmentCollection _segmColl = _GeoColl.Geometry[i] as ISegmentCollection; for (int j = 0; j < _segmColl.SegmentCount; j++) { Segmentslength.Add(_segmColl.Segment[j].Length); } } if (Segmentslength.Average() > 70 || Segmentslength.Average() < 1) { if (iBSM != -1) strBSM = pfeature.Value[iBSM].ToString(); sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{pfeature.OID}', '{strBSM}', '{featureClass.FeatureClass.AliasName}', '{_Parm.Check_RuleCode}', '{_Parm.Check_RuleName}','图形拓扑','{pfeature.Shape.ToJson()}');"); } } } catch (Exception ex) { throw ex; } finally { if (pfeature != null) Marshal.ReleaseComObject(pfeature); if (pCursor != null) Marshal.ReleaseComObject(pCursor); GC.Collect(); } } #endregion #region 要素不存在尖锐角和局部狭长图形(即不允许存在一个角度小于10度,或局部图形狭长的情况) private void Localslenderness(object threadParam) { IFeature pfeature = null; List sqlList = new List(); IFeatureCursor pCursor = null; ThreadParam _Parm = threadParam as ThreadParam; IGeometry geo = null; ITopologicalOperator topo2 = null; IPolyline line2 = null; try { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(_Parm.Temppath, WorkspaceTypeEnum.GDBFile); var featureClass = workspaceAPI.OpenFeatureClass(_Parm.Check_LayerName); pCursor = featureClass.FeatureClass.Search(null, true); int iBSM = featureClass.FeatureClass.FindField("BSM"); string strBSM = string.Empty; while ((pfeature = pCursor.NextFeature()) != null) { double angle = GetMinAngle(pfeature.ShapeCopy);//获取图形的最小角度 ITopologicalOperator topo = pfeature.ShapeCopy as ITopologicalOperator; IPolyline line1 = topo.Boundary as IPolyline; double length1 = line1.Length; int pointCount1 = (pfeature.ShapeCopy as IPointCollection).PointCount; geo = topo.Buffer(-0.05); topo2 = geo as ITopologicalOperator; line2 = topo2.Boundary as IPolyline; double length2 = line2.Length; int pointCount2 = (geo as IPointCollection).PointCount - 1; double delta_length = length1 - length2; double avg_halfangle = 180 * (pointCount1 - 1 - 2) / (pointCount1 - 1) / 2; double conner_normal_length = 2 * 0.05 / Math.Tan(avg_halfangle * (Math.PI / 180)); if ((delta_length > 8 * conner_normal_length * (pointCount1 - 1)) || angle < 10) { if (iBSM != -1) strBSM = pfeature.Value[iBSM].ToString(); sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{pfeature.OID}', '{strBSM}', '{featureClass.FeatureClass.AliasName}', '{_Parm.Check_RuleCode}', '{_Parm.Check_RuleName}','图形拓扑','{pfeature.Shape.ToJson()}');"); } if (topo != null) Marshal.ReleaseComObject(topo); if (line1 != null) Marshal.ReleaseComObject(line1); if (topo2 != null) Marshal.ReleaseComObject(topo2); if (line2 != null) Marshal.ReleaseComObject(line2); if (geo != null) Marshal.ReleaseComObject(geo); } } catch (Exception ex) { throw ex; } finally { if (pfeature != null) Marshal.ReleaseComObject(pfeature); if (pCursor != null) Marshal.ReleaseComObject(pCursor); GC.Collect(); } } /// /// 获取最小角度 /// /// /// private static double GetMinAngle(IGeometry pGeo) { double result = -1; IPolygon4 poly4 = null; ITopologicalOperator topo = null; GeometryBag geoBag = null; IGeometryCollection geoCollection = null; try { if (pGeo == null || pGeo.IsEmpty) return result; poly4 = pGeo as IPolygon4; topo = poly4 as ITopologicalOperator; if (topo != null) topo.Simplify(); geoBag = poly4.ExteriorRingBag as GeometryBag; if (geoBag == null) return result; geoCollection = geoBag as IGeometryCollection; List rings = new List(); for (int j = 0; j < geoCollection.GeometryCount; j++) { IGeometry geo = geoCollection.get_Geometry(j); rings.Add(geo); //内环图形 IGeometryBag InteriorBag = (pGeo as IPolygon4).get_InteriorRingBag(geo as IRing); if (InteriorBag != null) { IGeometryCollection InteriorRingGeometryCollection = InteriorBag as IGeometryCollection; for (int IR = 0; IR < InteriorRingGeometryCollection.GeometryCount; IR++) { rings.Add(InteriorRingGeometryCollection.get_Geometry(IR)); } } } foreach (IGeometry ring in rings) { if (ring.IsEmpty) continue; IPointCollection points = ring as IPointCollection; int num = points.PointCount - 1; for (int i = 0; i < num; i++) { IPoint p1 = null; IPoint p2 = points.get_Point(i); IPoint p3 = null; if (i == 0) { p1 = points.get_Point(num - 1); p3 = points.get_Point(i + 1); } else if (i == num - 1) { p1 = points.get_Point(i - 1); p3 = points.get_Point(0); } else { p1 = points.get_Point(i - 1); p3 = points.get_Point(i + 1); } double angle = GetAngle(p2, p1, p3); if (result == -1) { result = angle; } else { if (result > angle) result = angle; } Marshal.ReleaseComObject(p1); Marshal.ReleaseComObject(p2); Marshal.ReleaseComObject(p3); } Marshal.ReleaseComObject(ring); } } catch (Exception ex) { throw ex; } finally { if (poly4 != null) Marshal.ReleaseComObject(poly4); if (topo != null) Marshal.ReleaseComObject(topo); if (geoBag != null) Marshal.ReleaseComObject(geoBag); if (geoCollection != null) Marshal.ReleaseComObject(geoCollection); } return result; } /// /// 计算角度 /// /// /// /// /// private static double GetAngle(IPoint cenPoint, IPoint firstPoint, IPoint secondPoint) { double ma_x = firstPoint.X - cenPoint.X; double ma_y = firstPoint.Y - cenPoint.Y; double mb_x = secondPoint.X - cenPoint.X; double mb_y = secondPoint.Y - cenPoint.Y; double v1 = (ma_x * mb_x) + (ma_y * mb_y); double ma_val = Math.Sqrt(ma_x * ma_x + ma_y * ma_y); double mb_val = Math.Sqrt(mb_x * mb_x + mb_y * mb_y); if (ma_val * mb_val == 0) { return -1; } double cosM = v1 / (ma_val * mb_val); double angleAMB = Math.Acos(cosM) * 180 / Math.PI; return angleAMB; } /// /// 尖锐角/局部狭长图形错误 /// /// /// private bool LongAndNarrow(IGeometry geometry1) { List sqlList = new List(); IGeometry geo = null; ITopologicalOperator topo = null; ITopologicalOperator topo2 = null; IPolyline line2 = null; IPolyline line1 = null; bool isLongAndNarrow = false; IGeometry geometry = null; try { if (geometry1 == null || geometry1.IsEmpty) return isLongAndNarrow; geometry = geometry1; double angle = GetMinAngle(geometry);//获取图形的最小角度 topo = geometry as ITopologicalOperator; line1 = topo.Boundary as IPolyline; double length1 = line1.Length; int pointCount1 = (geometry as IPointCollection).PointCount; geo = topo.Buffer(-0.05); topo2 = geo as ITopologicalOperator; line2 = topo2.Boundary as IPolyline; double length2 = line2.Length; int pointCount2 = (geo as IPointCollection).PointCount - 1; double delta_length = length1 - length2; double avg_halfangle = 180 * (pointCount1 - 1 - 2) / (pointCount1 - 1) / 2; double conner_normal_length = 2 * 0.05 / Math.Tan(avg_halfangle * (Math.PI / 180)); if ((delta_length > 8 * conner_normal_length * (pointCount1 - 1)) || angle < 10) { isLongAndNarrow = true; } } catch (Exception ex) { LogAPI.Debug("LongAndNarrow异常:" + ex.Message + ex.StackTrace); } finally { if (topo != null) Marshal.ReleaseComObject(topo); if (line1 != null) Marshal.ReleaseComObject(line1); if (topo2 != null) Marshal.ReleaseComObject(topo2); if (line2 != null) Marshal.ReleaseComObject(line2); if (geo != null) Marshal.ReleaseComObject(geo); } return isLongAndNarrow; } #endregion #region 地类图斑更新层内不存在不规则图斑(除地类1001、1002、1006、1009、1107、1109外,其余地类满足面积/周长<0.2,并且有一个角度小于20) private void Irregular(object threadParam) { IFeature pfeature = null; IFeatureCursor pCursor = null; ThreadParam _Parm = threadParam as ThreadParam; try { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(_Parm.Temppath, WorkspaceTypeEnum.GDBFile); var featureClass = workspaceAPI.OpenFeatureClass(_Parm.Check_LayerName); pCursor = featureClass.FeatureClass.Search(null, true); int iBSM = featureClass.FeatureClass.FindField("BSM"); int iDLBM = featureClass.FeatureClass.FindField("DLBM"); int iSHAPE_Area = featureClass.FeatureClass.FindField("SHAPE_Area"); int iSHAPE_Length = featureClass.FeatureClass.FindField("SHAPE_Length"); string strBSM = string.Empty; while ((pfeature = pCursor.NextFeature()) != null) { if ("1001,1002,1006,1009,1107,1109".Contains(pfeature.Value[iDLBM].ToString())) continue; double angle = GetMinAngle(pfeature.ShapeCopy);//获取图形的最小角度 var SHAPE_Area = pfeature.Value[iSHAPE_Area].ToDouble(); var SHAPE_Length = pfeature.Value[iSHAPE_Length].ToDouble(); if (SHAPE_Area / SHAPE_Length < 0.2 && angle < 20) { if (iBSM != -1) strBSM = pfeature.Value[iBSM].ToString(); sqlList.Add($"INSERT INTO DataCheckResults(OBJECTID, BSM, ErrorLayer, ErrorCode, ErrorName,RuleType,ErrorArea) VALUES ('{pfeature.OID}', '{strBSM}', '{featureClass.FeatureClass.AliasName}', '{_Parm.Check_RuleCode}', '{_Parm.Check_RuleName}','图形拓扑','{pfeature.Shape.ToJson()}');"); } } } catch (Exception ex) { throw ex; } finally { if (pfeature != null) Marshal.ReleaseComObject(pfeature); if (pCursor != null) Marshal.ReleaseComObject(pCursor); GC.Collect(); } } #endregion #region CreateTempGDBForGP private List CreateTempGDBForGP(IFeatureLayer featureLayer, bool isDLTBBG = false) { List _threadList = new List(); List XzqList = new List(); IFeatureCursor pCursor = null; IFeature f = null; try { if (featureLayer.FeatureClass.FeatureCount(null) == 0) return _threadList; int idxZLDW = featureLayer.FeatureClass.FindField("ZLDWDM"); if (idxZLDW == -1) return _threadList; IQueryFilter filter = new QueryFilterClass(); filter.SubFields = "ZLDWDM"; pCursor = featureLayer.FeatureClass.Search(filter, true); while ((f = pCursor.NextFeature()) != null) { string zl = f.Value[idxZLDW].ToTrim(); if (zl.Length != 19) continue; string xzqdm = zl.Substring(0, 9); if (!XzqList.Contains(xzqdm)) { XzqList.Add(xzqdm); } } ProjectInfo prjInfo = MapsManager.Instance.CurrProjectInfo as ProjectInfo; ThreadParam para = new ThreadParam(); para.StrBgTbLayer = GeoDBAPI.SerialzedPersist(featureLayer); int ProNum = Environment.ProcessorCount - 2; //ProNum = XzqList.Count; //ProNum = 1; int ThreadNum = XzqList.Count / ProNum; for (int i = 0; i < ProNum; i++) { List tempBsmList = new List(); if (i < ProNum - 1) tempBsmList = XzqList.GetRange(i * ThreadNum, ThreadNum); else tempBsmList = XzqList.GetRange(i * ThreadNum, XzqList.Count - i * ThreadNum); string _ThreadName = string.Empty; List _Codes = new List(); foreach (var xzq in tempBsmList) { _ThreadName += xzq.Replace(prjInfo.CODE, ""); _Codes.Add(xzq); } _threadList.Add(new ThreadParam() { ThreadName = _ThreadName, Codes = _Codes, ProjInfo = MapsManager.Instance.CurrProjectInfo as ProjectInfo, StrJcTbLayer = para.StrJcTbLayer, StrBgTbLayer = para.StrBgTbLayer, Layers = para.Layers, IsDLTBBG = isDLTBBG }); } foreach (var itemThread in _threadList) { ThreadManager.Instance.QueueUserWorkItem(new System.Threading.WaitCallback(Execute), itemThread); } while (ThreadManager.Instance.ActiveCount > 0) { } } catch (Exception ex) { throw ex; } return _threadList; } public void Execute(object pThreadParm) { try { ThreadParam _Parm = pThreadParm as ThreadParam; IFeatureLayer BgTbLayer = GeoDBAPI.DeSerialzedPersist(_Parm.StrBgTbLayer) as IFeatureLayer; string TempPath = CreateTempFile(_Parm.ThreadName, (BgTbLayer.FeatureClass as FeatureClass).Name); FileInfo fInfo = new FileInfo(_Parm.IsDLTBBG == true ? _Parm.ProjInfo.BGDatabase : _Parm.ProjInfo.ZLDatabase); //_Parm.ProjInfo.ZLDatabase = System.IO.Path.Combine(TempPath, fInfo.Name); string TempGDbPath = System.IO.Path.Combine(TempPath, _Parm.ThreadName + ".gdb"); _Parm.Temppath = TempGDbPath; GPParamClass paramClass = new GPParamClass(); string strFilter = string.Empty; foreach (var xzq in _Parm.Codes) { strFilter += string.Format(" ZLDWDM like '{0}%' or", xzq); } strFilter = strFilter.TrimEnd('r').TrimEnd('o'); paramClass.FirstFeatureLayer = BgTbLayer; paramClass.Where_clause = strFilter; paramClass.TempGDBPath = TempPath; paramClass.IsGetOutPutFeature = true; paramClass.GPType = EnumGPType.BGTBYCL; IFeatureLayer Temp_DLTBGXGC = null; GPHelper helper = new GPHelper(); helper.ExeGPForProces(paramClass, ref Temp_DLTBGXGC); } catch { } } public virtual string CreateTempFile(string pType, string LayerName) { string result = string.Empty; try { string dbPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Temp" + ".db"); string TempFolder = Directory.GetCurrentDirectory() + "\\Temp\\DLTB\\" + LayerName + "\\" + pType; if (!Directory.Exists(TempFolder)) Directory.CreateDirectory(TempFolder); PluginServiceInterface.CommonHelper.DelectDir(TempFolder); if (!Directory.Exists(TempFolder)) { Directory.CreateDirectory(TempFolder); } result = TempFolder; } catch (Exception ex) { Console.WriteLine("创建临时数据库失败!" + ex.Message); LogAPI.Debug("创建临时数据库异常:" + ex); throw ex; } return result; } 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; } } #endregion private void Dg_PreviewMouseDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e) { try { object obj = this.treeList.SelectedItem; if (obj != null) { if (!(obj is DataCheckResult result)) return; if (!string.IsNullOrEmpty(result.PrimaryKeyValue2)) { IWorkspaceAPI workspaceAPI = new WorkspaceAPI(result.RepairfilePath, WorkspaceTypeEnum.GDBFile); IFeatureClassAPI featureClassAPI = workspaceAPI.OpenFeatureClass("DLTBBG_Err"); IGeometry geometry = featureClassAPI.GetFeature(result.PrimaryKeyValue2.ToInt()).ShapeCopy; if (geometry != null && !geometry.IsEmpty) { MapsManager.Instance.MapService.DrawGraph(geometry, true); MapsManager.Instance.MapService.Zoom(geometry); return; } } else if (!string.IsNullOrWhiteSpace(result.ErrorArea)) { IGeometry geometry = null; try { //geometry = IPolygonExtension.ToGeometry(result.ErrorArea, true, esriGeometryType.esriGeometryPolygon); //图形转化模式 默认大地坐标系4900 geometry = GeometryConvertHelper.ConvertWKTToIGeometry(result.ErrorArea); } catch { try { geometry = IPolygonExtension.ToGeometry(result.ErrorArea, false, esriGeometryType.esriGeometryPolyline); } catch { SelectFeature(result); } } if (geometry != null && !geometry.IsEmpty) { MapsManager.Instance.MapService.DrawGraph(geometry, true); MapsManager.Instance.MapService.Zoom(geometry); return; } else SelectFeature(result); } else if (string.IsNullOrWhiteSpace(result.ErrorArea) || result.ErrorArea == "0" || Convert.ToDouble(result.ErrorArea) < 0.02) { SelectFeature(result); } else if (!string.IsNullOrWhiteSpace(result.PrimaryKeyValue)) { IGeometry geometry = null; if (_CheckName == "变更图斑") { if (!string.IsNullOrWhiteSpace(result.BSM)) { IFeatureClass featureClass = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG"); geometry = featureClass.GetFeature(result.BSM.ToInt()).Shape; if (geometry != null && !geometry.IsEmpty) { MapsManager.Instance.MapService.DrawGraph(geometry, true); MapsManager.Instance.MapService.Zoom(geometry); return; } } } } MapRefreshView.OnCreate(m_hookHelper.Hook); MapRefreshView.OnClick(); } } catch (Exception ex) { LogAPI.Debug("Dg_PreviewMouseDoubleClick错误:" + ex.Message); } } private void SelectFeature(DataCheckResult result) { try { if (!string.IsNullOrWhiteSpace(result.BSM) && !string.IsNullOrWhiteSpace(result.ErrorLayer)) { var layer = MapsManager.Instance.MapService.GetFeatureClassByName(result.ErrorLayer); if (layer != null && layer.FeatureCount(null) > 0) { IFeatureCursor pCursor = null; if (result.BSM.Contains("-")) { string[] bsms = result.BSM.Split('-'); for (int i = 0; i < bsms.Length; i++) { pCursor = layer.Search(new QueryFilterClass() { WhereClause = $"BSM='{bsms[i]}' " }, true); IFeature feature = pCursor.NextFeature(); if (feature != null) { MapsManager.Instance.MapService.DrawGraph(feature.ShapeCopy, true); MapsManager.Instance.MapService.Zoom(feature.ShapeCopy); //MapsManager.Instance.MapService.SelectFeature(result.ErrorLayer, feature.OID.ToString()); } } } else { pCursor = layer.Search(new QueryFilterClass() { WhereClause = $"BSM='{result.BSM}' " }, true); IFeature feature = pCursor.NextFeature(); if (feature != null) { MapsManager.Instance.MapService.DrawGraph(feature.ShapeCopy, true); MapsManager.Instance.MapService.Zoom(feature.ShapeCopy); //MapsManager.Instance.MapService.SelectFeature(result.ErrorLayer, feature.OID.ToString()); } } } } else if (string.IsNullOrWhiteSpace(result.ErrorLayer) || string.IsNullOrWhiteSpace(result.PrimaryKey) || string.IsNullOrWhiteSpace(result.PrimaryKeyValue)) return; else if (result.PrimaryKey.ToUpper() == "OBJECTID") { MapsManager.Instance.MapService.SelectFeature(result.ErrorLayer, result.PrimaryKeyValue); } } catch (Exception) { return; } } } #region RepairEntity public class RepairEntity { public string RepairSQL { get; set; } public string LayerName { get; set; } public List BSMList { get; set; } public List IDList { get; set; } } #endregion public class ThreadParam { public string ThreadName { get; set; } public List Codes { get; set; } public ProjectInfo ProjInfo { get; set; } public string StrBgTbLayer { get; set; } public string StrJcTbLayer { get; set; } public List Layers { get; set; } public string Check_LayerName { get; set; } public string Check_RuleCode { get; set; } public string Check_RuleName { get; set; } public string Temppath { get; set; } public bool IsDLTBBG { get; set; } } public class GPHelper { public static GPHelper Instance { get; } = new GPHelper(); public GPHelper() { } public string ExeGPForProces(string arg) { string result = string.Empty; Byte[] toEncryptArray = Encoding.UTF8.GetBytes(arg); string strParm = Convert.ToBase64String(toEncryptArray); var psi = new ProcessStartInfo("GPHelper.exe", strParm); psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.RedirectStandardError = true; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; var pes = Process.Start(psi); var sbuffer = new StringBuilder(); var sout = pes.StandardOutput; while (!sout.EndOfStream) { result = sout.ReadLine(); if (String.IsNullOrEmpty(result)) continue; sbuffer.AppendLine(result); } pes.WaitForExit(); pes.Close(); String res = sbuffer.ToString(); sbuffer.Clear(); return result; } public void ExeGPForProces(GPParamClass gPParam, ref IFeatureLayer result) { string outPath = string.Empty; try { string strParm = SerializeAPI.SerializeToXML(gPParam); outPath = ExeGPForProces(strParm); lock (this) { if (outPath.ToLower() == "error") { } else { if (string.IsNullOrWhiteSpace(outPath)) outPath = gPParam.OutFeatureClassPath; result = new FeatureLayer(); FileInfo file = new FileInfo(outPath.Replace("\r\n", "")); string dbPath = file.DirectoryName; string fcName = file.Name; if (file.Name.ToLower().EndsWith(".gdb") && gPParam.FcName != null) { dbPath = file.FullName; fcName = gPParam.FcName; } else if (fcName.ToLower().EndsWith(".shp")) { KGIS.Framework.AE.IWorkspaceAPI wsAPI = new KGIS.Framework.AE.WorkspaceAPI(dbPath, KGIS.Framework.AE.Enum.WorkspaceTypeEnum.ShapeFile); KGIS.Framework.AE.IFeatureClassAPI fcAPI = wsAPI.OpenFeatureClass(fcName.Replace(".shp", "")); result.FeatureClass = fcAPI.FeatureClass; } { KGIS.Framework.AE.IWorkspaceAPI wsAPI = new KGIS.Framework.AE.WorkspaceAPI(dbPath, KGIS.Framework.AE.Enum.WorkspaceTypeEnum.GDBFile); KGIS.Framework.AE.IFeatureClassAPI fcAPI = wsAPI.OpenFeatureClass(fcName); result.FeatureClass = fcAPI.FeatureClass; } } } } catch (Exception ex) { Console.WriteLine(outPath); Console.WriteLine(ex.Message); } } } public class ProcesHelper { public static ProcesHelper Instance { get; } = new ProcesHelper(); private ProcesHelper() { } public Action ProgressHandle { get; set; } public string ExeGPForProces(string arg) { Byte[] toEncryptArray = Encoding.UTF8.GetBytes(arg); string strParm = Convert.ToBase64String(toEncryptArray); var psi = new ProcessStartInfo("KDataCheck.exe", strParm); psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.RedirectStandardError = true; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; var pes = Process.Start(psi); var sbuffer = new StringBuilder(); var sout = pes.StandardOutput; while (!sout.EndOfStream) { var line = sout.ReadLine(); if (String.IsNullOrEmpty(line)) continue; sbuffer.AppendLine(line); if (line.StartsWith("Msg:")) ProgressHandle?.Invoke(line.Replace("Msg:", "")); else { LogAPI.Debug(line); } } pes.WaitForExit(); pes.Close(); String res = sbuffer.ToString(); sbuffer.Clear(); return res; } string outPath = string.Empty; public string ExeGPForProces(IDGParameter gPParam) { string result = string.Empty; try { string strParm = SerializeAPI.SerializeToXML(gPParam); result = ExeGPForProces(strParm); } catch (Exception ex) { result = ex.Message; Console.WriteLine(result); Console.WriteLine(ex.Message); } return result; } } public class GDPDJBInfo { public string BSM { get; set; } public string PDJB { get; set; } public double Area { get; set; } } }