using DevExpress.Xpf.Editors.Settings; using DevExpress.Xpf.Grid; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.Maps; using KGIS.Framework.Platform; using KGIS.Framework.ThreadManager; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils.Helper; using KGIS.Framework.Views; using KUI.Windows; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Windows; using System.Windows.Controls; namespace Kingo.Plugin.AttributeMaintain.View { public partial class FrmCZCPatchwork : UserControl, IDockPanel2 { private static int SHAPE_Area = 30; private IFeatureClass czcdydgx = null; private IFeatureClass czcdydgxgc = null; private IFeatureClass dltbgx = null; private IFeatureClass dltbgxgc = null; private string WhereClause = string.Empty; private DataTable IntoData { get; set; } public FrmCZCPatchwork() { InitializeComponent(); DevExpress.Xpf.Core.ThemeManager.SetTheme(this, DevExpress.Xpf.Core.Theme.Office2013LightGray); _MapService = MapsManager.Instance.MapService; //this.Loaded += ViewXZQInto_Loaded; IsShowInMap = true; DockAreas = DockStyle.DockBottom; DockHeight = 380; DefaultArea = DockStyle.DockBottom; ShowCloseButton = true; ShowAutoHideButton = false; Title = "城镇村更新层图斑"; LoadData(); } private void ViewXZQInto_Loaded(object sender, RoutedEventArgs e) { ThreadManager.Instance.QueueUserWorkItem(new System.Threading.WaitCallback(Init), null); } private void Init(object parm) { try { this.Dispatcher.Invoke(() => { loading.Visibility = Visibility.Visible; }); } catch (Exception ex) { LogAPI.Debug(ex); } finally { this.Dispatcher.Invoke(() => { loading.Visibility = Visibility.Collapsed; }); } } #region IDockPanel2接口 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 event EventHandler CloseViewHandler; public void ClosePanel() { Platform.Instance.CloseView(this); } public void ClosePanelInvoke() { CloseViewHandler?.Invoke(null, null); } public void ShowPanel() { Platform.Instance.OpenView(this, false); MapsManager.Instance.MapService.ProjectClosed += (s, e) => { this.ClosePanel(); }; } #endregion private void CheckBox_Click_1(object sender, RoutedEventArgs e) { try { if (dgInto.SelectedItem != null) { DataRowView dr = (dgInto.SelectedItem as DataRowView); if ((sender as CheckBox).IsChecked == true) { dr["IsValid"] = true; } else { dr["IsValid"] = false; } } int length = 0; foreach (DataRow item in (dgInto.ItemsSource as DataTable).Rows) { if (item[0].ToString() == "True") { length++; } } } catch (Exception ex) { LogAPI.Debug(ex); } } private void DgInto_CustomColumnGroup(object sender, DevExpress.Xpf.Grid.CustomColumnSortEventArgs e) { } private void LoadData() { czcdydgx = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX"); if (czcdydgx == null) return; IntoData = new DataTable(); if (!string.IsNullOrEmpty(SArea.Text)) { if (SArea.Text.ToTrim().ToInt() > 0) SHAPE_Area = SArea.Text.ToTrim().ToInt(); } else { SHAPE_Area = 30; } WhereClause = $" SHAPE_Area<{SHAPE_Area} "; IFeatureCursor cursor = czcdydgx.Search(new QueryFilter() { WhereClause = WhereClause }, true); try { ConstructColumn(czcdydgx.Fields); IFeature f = null; while ((f = cursor.NextFeature()) != null) { DataRow dr = IntoData.NewRow(); bool IsInto = true; for (int i = 0; i < IntoData.Columns.Count; i++) { //if (i == 0) //{ // dr[i] = false; // continue; //} object obj = f.get_Value((int)IntoData.Columns[i].ExtendedProperties["index"]); if (obj == null) { continue; } else { if ((obj.ToString()).Contains("1899/12/30 0:00:00")) { obj = System.DBNull.Value; } } if (obj is string) { obj = obj.ToString().Trim();//字符串时,去空格 } dr[i] = obj; } if (IsInto) IntoData.Rows.Add(dr); } this.Dispatcher.Invoke(() => { dgInto.ItemsSource = null; dgInto.ItemsSource = IntoData; dgInto.Columns[0].AllowEditing = DevExpress.Utils.DefaultBoolean.True; }); } catch (Exception ex) { throw ex; } } /// /// 构造列获取记录条数 /// /// private void ConstructColumn(IFields fields) { if (fields != null) { IntoData = new DataTable(); //DataColumn col1 = new DataColumn(); //col1.ColumnName = "IsValid"; //col1.Caption = "选中"; //col1.DataType = typeof(bool); //IntoData.Columns.Add(col1); for (int i = 0; i < fields.FieldCount; i++) { IField field = fields.get_Field(i); if (field.Name.ToUpper().EndsWith("SHAPE")) continue; DataColumn col = new DataColumn(); col.ExtendedProperties.Add("index", i); col.ColumnName = field.Name; col.Caption = field.AliasName; switch (field.Type) { case esriFieldType.esriFieldTypeSmallInteger: col.DataType = typeof(short); break; case esriFieldType.esriFieldTypeInteger: col.DataType = typeof(int); break; case esriFieldType.esriFieldTypeSingle: break; case esriFieldType.esriFieldTypeDouble: col.DataType = typeof(double); break; case esriFieldType.esriFieldTypeString: col.DataType = typeof(string); break; case esriFieldType.esriFieldTypeDate: col.DataType = typeof(DateTime); break; case esriFieldType.esriFieldTypeOID: col.DataType = typeof(Int32); break; case esriFieldType.esriFieldTypeGeometry: break; case esriFieldType.esriFieldTypeBlob: break; case esriFieldType.esriFieldTypeRaster: break; case esriFieldType.esriFieldTypeGUID: break; case esriFieldType.esriFieldTypeGlobalID: break; case esriFieldType.esriFieldTypeXML: break; default: break; } col.ReadOnly = true; //!field.Editable;//编辑状态启用默认是否可以编辑 IntoData.Columns.Add(col); System.Runtime.InteropServices.Marshal.ReleaseComObject(field); } } } private void DgInto_AutoGeneratedColumns(object sender, RoutedEventArgs e) { GridControl grid = sender as GridControl; foreach (GridColumn column in grid.Columns) { if (IntoData.Columns.Contains(column.FieldName)) { string caption = IntoData.Columns[column.FieldName].Caption; if (caption != null) { column.EditSettings = new TextEditSettings() { HorizontalContentAlignment = EditSettingsHorizontalAlignment.Left }; column.Header = caption; } } } } #region 定位选中图斑 private IMapService _MapService { get; set; } private void TvAttr2_RowDoubleClick(object sender, RowDoubleClickEventArgs e) { try { DataRowView obj = e.Source.FocusedRowData.Row as DataRowView; if (obj != null) { _MapService.SelectFeature("CZCDYDGX", obj["OBJECTID"].ToTrim(), true); } } catch (Exception ex) { MessageHelper.Show("定位失败!" + ex.Message); } } #endregion #region 刷新数据 private void BtnRefreshData_Click(object sender, RoutedEventArgs e) { LoadData(); } #endregion #region 修复 //1.由于补充城镇村等用地空洞或与地类图斑之间的缝隙,造成的城镇村等用地更新层存在碎面(上图面积不足30平方米),建议合并至周边城镇村等用地(周边城镇村等用地未变更的,应将其提出至更新成果进行图形变更); //2.由于城镇村等用地灭失后剩余部分面积不足30平方米(周边没有城镇村等用地,同时对应图斑为非建设用地),建议进行灭失处理。 private void btnMergeData_Click(object sender, RoutedEventArgs e) { IFeatureLayer JC_CZCDYDLayer = null; IFeatureLayer JC_DLTB = null; IFeatureLayer GXGC_DLTBLayer = null; IFeature f = null; IFeature feature = null; try { if (IntoData.Rows.Count == 0) { MessageHelper.ShowTips("未检测要修复的数据"); return; } czcdydgx = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX"); czcdydgxgc = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGXGC"); dltbgx = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGX"); dltbgxgc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGXGC"); GXGC_DLTBLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBGXGC"); JC_CZCDYDLayer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地"); JC_DLTB = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); JC_CZCDYDLayer.SpatialReference = (czcdydgx as IGeoDataset).SpatialReference; if (czcdydgx == null || czcdydgxgc == null) return; var gxgc_bgxw = czcdydgxgc.FindField("BGXW"); var gx_CZCMJ = czcdydgx.FindField("CZCMJ"); var gx_CZCLX = czcdydgx.FindField("CZCLX"); var jc_CZCMJ = JC_CZCDYDLayer.FeatureClass.FindField("CZCMJ"); var jc_CZCLX = JC_CZCDYDLayer.FeatureClass.FindField("CZCLX"); var jc_CZCDM = JC_CZCDYDLayer.FeatureClass.FindField("CZCDM"); var jc_CZCMC = JC_CZCDYDLayer.FeatureClass.FindField("CZCMC"); var gx_BSM = czcdydgx.FindField("BSM"); var gxgc_BSM = czcdydgxgc.FindField("BSM"); var gxgc_BGHBSM = czcdydgxgc.FindField("BGHBSM"); var gxgc_BGHCZCDM = czcdydgxgc.FindField("BGHCZCDM"); var gxgc_BGHCZCMC = czcdydgxgc.FindField("BGHCZCMC"); var gxgc_BGHCZCLX = czcdydgxgc.FindField("BGHCZCLX"); var gxgc_BGMJ = czcdydgxgc.FindField("BGMJ"); var gx_CZCDM = czcdydgx.FindField("CZCDM"); var gx_CZCMC = czcdydgx.FindField("CZCMC"); WhereClause = $" SHAPE_Area<{SHAPE_Area} and BGXW='3' and BGHCZCLX='203' "; IFeatureCursor cursor = czcdydgxgc.Search(new QueryFilter() { WhereClause = WhereClause }, true); List delid = new List(); this.ShowLoading("正在进行城镇村等用地更新层数据维护...", 0, 0); while ((f = cursor.NextFeature()) != null) { if (f.OID == 33050) { //continue; } //与相邻更新层合并,继承最大图形的属性 List listFc = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgx }); if (listFc.Count > 0) { feature = listFc[0]; if (delid.Contains(feature.OID)) continue; listFc = FeatureAPI.Identify(feature.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgx }); if (listFc.Count > 0) { //存在相邻图斑 取共边长的同属性合并 IFeature gxfeature = null; var Unionlength = 0.00; foreach (IFeature feature1 in listFc.OrderByDescending(x => x.Value[gx_CZCMJ])) { if (feature1.OID == feature.OID) continue; var thisczcdm = feature.Value[gx_CZCDM].ToString(); var thisczcmc = feature.Value[gx_CZCMC].ToString(); var gxczcdm = feature1.Value[gx_CZCDM].ToString(); var gxczcmc = feature1.Value[gx_CZCMC].ToString(); if (feature1.Value[gx_CZCLX].ToString() == "203" && thisczcdm == gxczcdm && thisczcmc == gxczcmc) { var length = FeatureAPI.LengthOfSide(feature.ShapeCopy, feature1.ShapeCopy); if (length > Unionlength) { Unionlength = length; gxfeature = feature1; } } } if (gxfeature != null && !FeatureAPI.GetEqual(feature.ShapeCopy, gxfeature.ShapeCopy)) { var jcmj = gxfeature.Value[gx_CZCMJ].ToDouble(); var gxmj = feature.Value[gx_CZCMJ].ToDouble(); var strBSM = GetMaxBSM(new List() { czcdydgx }); var strbsm = strBSM.Substring(0, 10); var Maxbsm = strBSM.Substring(10).ToInt() + 1; strBSM = strbsm + Maxbsm.ToString().PadLeft(8, '0');//最新标识码 gxfeature.Shape = FeatureAPI.Union(gxfeature.ShapeCopy, feature.ShapeCopy); gxfeature.Value[gx_CZCMJ] = jcmj + gxmj; gxfeature.Value[gx_BSM] = strBSM; gxfeature.Store(); if (!delid.Contains(feature.OID)) delid.Add(feature.OID); var gxgc = FeatureAPI.Identify2(gxfeature.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); foreach (var item in gxgc) { item.Value[gxgc_BGHBSM] = gxfeature.Value[gx_BSM]; item.Store(); } } else { listFc = FeatureAPI.Identify(feature.ShapeCopy, JC_CZCDYDLayer); //foreach (IFeature feature1 in listFc.OrderByDescending(x => x.Value[jc_CZCMJ])) //{ // if (feature1.Value[jc_CZCLX].ToString() == "203") // { // gxfeature = feature1; // break; // } //} foreach (IFeature feature1 in listFc.OrderByDescending(x => x.Value[jc_CZCMJ])) { var thisczcdm = feature.Value[gx_CZCDM].ToString(); var thisczcmc = feature.Value[gx_CZCMC].ToString(); var jcczcdm = feature1.Value[jc_CZCDM].ToString(); var jcczcmc = feature1.Value[jc_CZCMC].ToString(); if (feature1.Value[jc_CZCLX].ToString() == "203" && thisczcdm == jcczcdm && thisczcmc == jcczcmc) { var length = FeatureAPI.LengthOfSide(feature.ShapeCopy, feature1.ShapeCopy); if (length > Unionlength) { Unionlength = length; gxfeature = feature1; } } } if (feature != null && gxfeature != null) { var jcmj = gxfeature.Value[jc_CZCMJ].ToDouble(); var gxmj = feature.Value[gx_CZCMJ].ToDouble(); feature.Shape = FeatureAPI.Union(gxfeature.ShapeCopy, feature.ShapeCopy); feature.Value[gx_CZCMJ] = jcmj + gxmj; feature.Store(); var gxgc = FeatureAPI.Identify2(feature.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); if (gxgc.Count > 0) { gxgc[0].Value[gxgc_bgxw] = "3"; gxgc[0].Store(); InsertCZCGXGC(gxgc[0], gxfeature, czcdydgxgc); } } } } } } if (cbIsMs.IsChecked == true) { WhereClause = $" SHAPE_Area<{SHAPE_Area} and BGXW='2' and BGQCZCLX='203' and BGHCZCLX='203' "; cursor = czcdydgxgc.Search(new QueryFilter() { WhereClause = WhereClause }, true); int idxCZCBGMJ = czcdydgxgc.FindField("BGMJ"); while ((f = cursor.NextFeature()) != null) { if (f.OID == 3676) { } double bgmj = f.Value[idxCZCBGMJ].ToDouble(2); //与相邻更新层合并,继承最大图形的属性 List listFc = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgx }); if (listFc.Count > 0) { for (int i = 0; i < listFc.Count; i++) { feature = listFc[i]; if (feature.Value[gx_CZCMJ].ToDouble(2) > SHAPE_Area) continue; feature.Delete(); } f.Value[gxgc_BGHBSM] = ""; f.Value[gxgc_BGHCZCDM] = ""; f.Value[gxgc_BGHCZCMC] = ""; f.Value[gxgc_BGHCZCLX] = ""; f.Value[gxgc_bgxw] = "0"; f.Store(); if (bgmj < 0.1) continue; //提取地类图斑数据,作为无变化数据 listFc = FeatureAPI.Identify2(f.ShapeCopy, GXGC_DLTBLayer); if (listFc.Count == 0) { listFc = FeatureAPI.Identify2(f.ShapeCopy, JC_DLTB); if (listFc.Count == 0) continue; IFeature jctb_F = listFc[0]; int idxTBMJ = jctb_F.Fields.FindField("TBMJ"); #region 地类图斑更新过程层 IFeatureCursor insertCur = dltbgxgc.Insert(true); IFeatureBuffer gcBuf = dltbgxgc.CreateFeatureBuffer(); gcBuf.Shape = jctb_F.ShapeCopy; for (int i = 0; i < dltbgxgc.Fields.FieldCount; i++) { IField field = dltbgxgc.Fields.Field[i]; if (!field.Editable || field.Name.Contains("SHAPE")) continue; string sFieldName = field.Name.Replace("BGQ", "").Replace("BGH", ""); int idx = jctb_F.Fields.FindField(sFieldName); if (idx == -1) { sFieldName = field.Name.Replace("BGQTB", "").Replace("BGHTB", ""); idx = jctb_F.Fields.FindField(sFieldName); } if (idx != -1) gcBuf.Value[i] = jctb_F.Value[idx]; } int idxBGXW = dltbgxgc.FindField("BGXW"); int idxBGMJ = dltbgxgc.FindField("TBBGMJ"); int idxXZQTZLX = dltbgxgc.FindField("XZQTZLX"); int idxGXSJ = dltbgxgc.FindField("GXSJ"); gcBuf.Value[idxBGMJ] = jctb_F.Value[idxTBMJ]; gcBuf.Value[idxBGXW] = "4"; gcBuf.Value[idxXZQTZLX] = "0"; gcBuf.Value[idxGXSJ] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); insertCur.InsertFeature(gcBuf); insertCur.Flush(); #endregion #region 地类图斑更新层 insertCur = dltbgx.Insert(true); gcBuf = dltbgx.CreateFeatureBuffer(); gcBuf.Shape = jctb_F.ShapeCopy; for (int i = 0; i < dltbgx.Fields.FieldCount; i++) { IField field = dltbgx.Fields.Field[i]; if (!field.Editable || field.Name.Contains("SHAPE")) continue; string sFieldName = field.Name.Replace("BGQ", "").Replace("BGH", ""); int idx = jctb_F.Fields.FindField(sFieldName); if (idx == -1) { sFieldName = field.Name.Replace("BGQTB", "").Replace("BGHTB", ""); idx = jctb_F.Fields.FindField(sFieldName); } if (idx != -1) gcBuf.Value[i] = jctb_F.Value[idx]; } //int idxBGXW = dltbgxgc.FindField("BGXW"); //int idxXZQTZLX = dltbgxgc.FindField("XZQTZLX"); idxGXSJ = dltbgx.FindField("GXSJ"); //gcBuf.Value[idxBGXW] = "4"; gcBuf.Value[idxGXSJ] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); insertCur.InsertFeature(gcBuf); insertCur.Flush(); #endregion //listFc = FeatureAPI.Identify2(jctb_F.ShapeCopy, JC_CZCDYDLayer); //int idxCZCMJ = JC_CZCDYDLayer.FeatureClass.FindField("CZCMJ"); //int idxBSM = JC_CZCDYDLayer.FeatureClass.FindField("BSM"); //int idxCZCDM = JC_CZCDYDLayer.FeatureClass.FindField("CZCDM"); //int idxCZCMC = JC_CZCDYDLayer.FeatureClass.FindField("CZCMC"); //int idxCZCLX = JC_CZCDYDLayer.FeatureClass.FindField("CZCLX"); //int gxgc_BGQBSM = czcdydgxgc.FindField("BGQBSM"); //int gxgc_BGQCZCDM = czcdydgxgc.FindField("BGQCZCDM"); //int gxgc_BGQCZCMC = czcdydgxgc.FindField("BGQCZCMC"); //int gxgc_BGQCZCLX = czcdydgxgc.FindField("BGQCZCLX"); //IFeatureCursor czcInsCur = null; //IFeatureCursor gxCzcInsCur = null; //var strBSM = string.Empty; //if (listFc.Count > 0) //{ // czcInsCur = czcdydgxgc.Insert(true); // gxCzcInsCur = czcdydgx.Insert(true); // strBSM = GetMaxBSM(new List() { czcdydgx }); //} //foreach (var item in listFc) //{ // decimal czcMJ = item.Value[idxCZCMJ].ToDecimal(); // IGeometry MsGeo = FeatureAPI.InterSect(item.ShapeCopy, jctb_F.ShapeCopy); // if (MsGeo.IsEmpty) // continue; // IGeometry OtrGeo = FeatureAPI.Difference(item.ShapeCopy, jctb_F.ShapeCopy); // var strbsm = strBSM.Substring(0, 10); // var Maxbsm = strBSM.Substring(10).ToInt() + 1; // strBSM = strbsm + Maxbsm.ToString().PadLeft(8, '0');//最新标识码 // if (OtrGeo.IsEmpty) // { // IFeatureBuffer gxgcBuff = czcdydgxgc.CreateFeatureBuffer(); // gxgcBuff.Value[gxgc_BGQBSM] = item.Value[idxBSM].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCDM] = item.Value[idxCZCDM].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCMC] = item.Value[idxCZCMC].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCLX] = item.Value[idxCZCLX].ToTrim(); // gxgcBuff.Value[gxgc_BGHBSM] = ""; // gxgcBuff.Value[gxgc_BGHCZCDM] = ""; // gxgcBuff.Value[gxgc_BGHCZCMC] = ""; // gxgcBuff.Value[gxgc_BGHCZCLX] = ""; // gxgcBuff.Value[gxgc_bgxw] = "0"; // gxgcBuff.Value[gxgc_BGMJ] = czcMJ; // czcInsCur.InsertFeature(gxgcBuff); // } // else // { // IFeatureBuffer gxgcBuff = czcdydgxgc.CreateFeatureBuffer(); // gxgcBuff.Value[gxgc_BGQBSM] = item.Value[idxBSM].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCDM] = item.Value[idxCZCDM].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCMC] = item.Value[idxCZCMC].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCLX] = item.Value[idxCZCLX].ToTrim(); // gxgcBuff.Value[gxgc_BGHBSM] = ""; // gxgcBuff.Value[gxgc_BGHCZCDM] = ""; // gxgcBuff.Value[gxgc_BGHCZCMC] = ""; // gxgcBuff.Value[gxgc_BGHCZCLX] = ""; // gxgcBuff.Value[gxgc_bgxw] = "0"; // gxgcBuff.Value[gxgc_BGMJ] = MsGeo.GetEllipseArea().ToDecimal(2); // czcInsCur.InsertFeature(gxgcBuff); // gxgcBuff = czcdydgxgc.CreateFeatureBuffer(); // gxgcBuff.Value[gxgc_BGQBSM] = item.Value[idxBSM].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCDM] = item.Value[idxCZCDM].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCMC] = item.Value[idxCZCMC].ToTrim(); // gxgcBuff.Value[gxgc_BGQCZCLX] = item.Value[idxCZCLX].ToTrim(); // gxgcBuff.Value[gxgc_BGHBSM] = strBSM; // gxgcBuff.Value[gxgc_BGHCZCDM] = item.Value[idxCZCDM].ToTrim(); ; // gxgcBuff.Value[gxgc_BGHCZCMC] = item.Value[idxCZCMC].ToTrim(); // gxgcBuff.Value[gxgc_BGHCZCLX] = item.Value[idxCZCLX].ToTrim(); // gxgcBuff.Value[gxgc_bgxw] = "2"; // gxgcBuff.Value[gxgc_BGMJ] = Math.Round(czcMJ - MsGeo.GetEllipseArea().ToDecimal(2), 2); // czcInsCur.InsertFeature(gxgcBuff); // IFeatureBuffer gxBuff = czcdydgx.CreateFeatureBuffer(); // gxBuff.Value[gx_BSM] = strBSM; // gxBuff.Value[gx_CZCDM] = item.Value[idxCZCDM].ToTrim(); // gxBuff.Value[gx_CZCMC] = item.Value[idxCZCMC].ToTrim(); // gxBuff.Value[gx_CZCLX] = item.Value[idxCZCLX].ToTrim(); // gxBuff.Value[gx_CZCMJ]= Math.Round(czcMJ - MsGeo.GetEllipseArea().ToDecimal(2), 2); // gxCzcInsCur.InsertFeature(gxBuff); // } //} //if (czcInsCur != null) // czcInsCur.Flush(); //if (gxCzcInsCur != null) // gxCzcInsCur.Flush(); } } } } if (delid.Count > 0) (czcdydgx as ITable).DeleteSearchedRows(new QueryFilter() { WhereClause = $"OBJECTID in ({string.Join(",", delid)})" }); SetBGMJ(); LoadData(); this.CloseLoading(); MessageHelper.Show("城镇村碎图斑修复完成!"); } catch (Exception ex) { this.CloseLoading(); LogAPI.Debug(ex.Message); MessageHelper.Show("城镇村碎图斑修复失败" + ex.Message); } finally { } } private void SetBGMJ() { try { IFeatureCursor cursor = czcdydgxgc.Search(new QueryFilter() { WhereClause = "BGXW='0' and BGMJ=0" }, true); IFeature feature = null; var gxgc_CZCMJ = czcdydgxgc.FindField("BGMJ"); var gx_CZCMJ = czcdydgx.FindField("CZCMJ"); var idxBGQBSM = czcdydgxgc.FindField("BGQBSM"); while ((feature = cursor.NextFeature()) != null) { string bgqBSM = feature.Value[idxBGQBSM].ToTrim(); IFeatureClassAPI fcAPI = new FeatureClassAPI(czcdydgxgc); List listFc = fcAPI.QueryFeatures(new QueryFilter() { WhereClause = $"BGQBSM='{bgqBSM}'" }); if (listFc.Count == 1) continue; //List listFc = FeatureAPI.Identify(feature.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); IFeature gxgcfeature = listFc.OrderByDescending(x => x.Value[gxgc_CZCMJ]).FirstOrDefault(); if (gxgcfeature != null) { if (gxgcfeature.Value[gxgc_CZCMJ].ToDouble(2) <= 0.01) continue; var mj = gxgcfeature.Value[gxgc_CZCMJ].ToDouble() - 0.01; gxgcfeature.Value[gxgc_CZCMJ] = mj; gxgcfeature.Store(); feature.Value[gxgc_CZCMJ] = 0.01; feature.Store(); listFc = FeatureAPI.Identify2(gxgcfeature.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgx }); if (listFc.Count > 0) { listFc[0].Value[gx_CZCMJ] = (listFc[0].Value[gx_CZCMJ].ToDouble() - 0.01).ToDouble(2); listFc[0].Store(); } } } } catch (Exception ex) { LogAPI.Debug("变更面积为零的图斑赋值错误:" + ex.Message); } } private void old() { IFeatureLayer JC_CZCDYDLayer = null; IFeatureLayer JC_DLTB = null; IFeature f = null; IFeature feature = null; try { if (IntoData.Rows.Count == 0) { MessageHelper.ShowTips("未检测要修复的数据"); return; } czcdydgx = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX"); dltbgx = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGX"); dltbgxgc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGXGC"); czcdydgxgc = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGXGC"); JC_CZCDYDLayer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地"); JC_DLTB = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑"); JC_CZCDYDLayer.SpatialReference = (czcdydgx as IGeoDataset).SpatialReference; if (czcdydgx == null || czcdydgxgc == null) return; var gxgc_bgxw = czcdydgxgc.FindField("BGXW"); var gx_CZCMJ = czcdydgx.FindField("CZCMJ"); var jc_CZCMJ = JC_CZCDYDLayer.FeatureClass.FindField("CZCMJ"); var gx_BSM = czcdydgx.FindField("BSM"); var gxgc_BSM = czcdydgxgc.FindField("BSM"); var gxgc_BGHBSM = czcdydgxgc.FindField("BGHBSM"); var gxgc_BGMJ = czcdydgxgc.FindField("BGMJ"); IFeatureCursor cursor = czcdydgx.Search(new QueryFilter() { WhereClause = WhereClause }, true); List delid = new List(); this.ShowLoading("正在进行城镇村等用地更新层数据维护...", 0, 0); while ((f = cursor.NextFeature()) != null) { //与相邻更新层合并,继承最大图形的属性 List listFc = FeatureAPI.Identify(f.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgx }); if (listFc.Count > 0) { //存在相邻图斑 取面积最大的进行合并 feature = listFc.OrderByDescending(x => x.Value[gx_CZCMJ]).FirstOrDefault(); if (feature != null && !FeatureAPI.GetEqual(feature.ShapeCopy, f.ShapeCopy) && !delid.Contains(f.OID)) { feature.Shape = FeatureAPI.Union(f.ShapeCopy, feature.ShapeCopy); feature.Value[gx_CZCMJ] = feature.Shape.GetEllipseArea(); feature.Store(); if (!delid.Contains(f.OID)) delid.Add(f.OID); var gxgc = FeatureAPI.Identify2(feature.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); foreach (var item in gxgc) { item.Value[gxgc_BGHBSM] = feature.Value[gx_BSM]; item.Store(); } } else { //无相邻更新层数据 判断更新过程层是否为灭失 if (FeatureAPI.GetEqual(feature.ShapeCopy, f.ShapeCopy)) { var gxgc = FeatureAPI.Identify(f.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); var ms = gxgc.FirstOrDefault(x => x.Value[gxgc_bgxw].ToString() == "0"); if (ms != null) { foreach (var item in gxgc) { if (item.Value[gxgc_bgxw].ToString() == "0") continue; item.Value[gxgc_bgxw] = "0"; item.Value[czcdydgxgc.FindField("BGHBSM")] = ""; item.Value[czcdydgxgc.FindField("BGHCZCLX")] = ""; item.Value[czcdydgxgc.FindField("BGHCZCDM")] = ""; item.Value[czcdydgxgc.FindField("BGHCZCMC")] = ""; item.Store(); } if (!delid.Contains(f.OID)) { delid.Add(f.OID); } var iddltbgx = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = dltbgx }); if (iddltbgx.Count == 0) { var dltb = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = JC_DLTB.FeatureClass }); if (dltb.Count > 0) { InsertDLTBGX(dltb[0], dltbgx); InsertDLTBGXGC(dltb[0], dltbgxgc); } } } else { listFc = FeatureAPI.Identify(f.ShapeCopy, JC_CZCDYDLayer); feature = listFc.OrderByDescending(x => x.Value[jc_CZCMJ]).FirstOrDefault(); if (feature != null) { f.Shape = FeatureAPI.Union(f.ShapeCopy, feature.ShapeCopy); f.Value[gx_CZCMJ] = f.Shape.GetEllipseArea(); f.Store(); gxgc = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); if (gxgc.Count > 0) { gxgc[0].Value[gxgc_bgxw] = "3"; gxgc[0].Store(); //InsertCZCGXGC(gxgc[0], f, feature, czcdydgxgc); } } } } else { listFc = FeatureAPI.Identify(f.ShapeCopy, JC_CZCDYDLayer); feature = listFc.OrderByDescending(x => x.Value[jc_CZCMJ]).FirstOrDefault(); if (feature != null) { f.Shape = FeatureAPI.Union(f.ShapeCopy, feature.ShapeCopy); f.Value[gx_CZCMJ] = f.Shape.GetEllipseArea(); f.Store(); var gxgc = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); if (gxgc.Count > 0) { gxgc[0].Value[gxgc_bgxw] = "3"; gxgc[0].Store(); //InsertCZCGXGC(gxgc[0], f, feature, czcdydgxgc); } } } } } else { //listFc = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = dltbgx }); //int iDLBM = dltbgx.FindField("DLBM"); //List JSYD = new List() { "05H1", "0508", "0601", "0602", "0603", "0701", "0702", "08H1", "08H2", "0809", "0810", "09", "1001", "1002", "1003", "1004", "1005", "1007", "1008", "1009", "1109", "1201" }; //if (listFc.Count > 0) //{ // string dlbm = listFc[0].Value[iDLBM].ToString(); // if (!JSYD.Contains(dlbm)) // { // listFc = FeatureAPI.Identify2(f.ShapeCopy, new FeatureLayerClass { FeatureClass = czcdydgxgc }); // if (listFc.Count > 0) // { // listFc[0].Value[czcdydgxgc.FindField("BGXW")] = "0"; // listFc[0].Value[czcdydgxgc.FindField("BGHBSM")] = ""; // listFc[0].Value[czcdydgxgc.FindField("BGHCZCLX")] = ""; // listFc[0].Value[czcdydgxgc.FindField("BGHCZCDM")] = ""; // listFc[0].Value[czcdydgxgc.FindField("BGHCZCMC")] = ""; // listFc[0].Store(); // } // if (!delid.Contains(f.OID)) // { // delid.Add(f.OID); // } // } //} } } (czcdydgx as ITable).DeleteSearchedRows(new QueryFilter() { WhereClause = $"OBJECTID in ({string.Join(",", delid)})" }); LoadData(); this.CloseLoading(); } catch (Exception ex) { this.CloseLoading(); LogAPI.Debug(ex.Message); MessageHelper.Show("城镇村碎图斑修复失败" + ex.Message); } finally { } } public bool InsertCZCGXGC(IFeature gxgcfeature, IFeature jcfeature, IFeatureClass featureClass) { IFeatureCursor T_Cursor = null; try { int index = -1; IFeatureBuffer buffer = featureClass.CreateFeatureBuffer(); buffer.Shape = jcfeature.ShapeCopy; var strBSM = GetMaxBSM(new List() { featureClass }); var strbsm = strBSM.Substring(0, 10); var Maxbsm = strBSM.Substring(10).ToInt() + 1; strBSM = strbsm + Maxbsm.ToString().PadLeft(8, '0');//最新标识码 for (int i = 0; i < gxgcfeature.Fields.FieldCount; i++) { IField field = gxgcfeature.Fields.Field[i]; if (field.Name == featureClass.ShapeFieldName || field.Name.Contains(featureClass.ShapeFieldName) || field.Name == featureClass.OIDFieldName || !field.Editable) continue; index = gxgcfeature.Fields.FindField(field.Name); if (index == -1) continue; if (field.Name == "BGXW") { buffer.Value[index] = "2"; continue; } if (field.Name == "BSM") { buffer.Value[index] = strBSM; continue; } if (field.Name == "BGQBSM") { buffer.Value[index] = jcfeature.Value[jcfeature.Fields.FindField("BSM")]; continue; } if (field.Name == "BGQCZCLX") { buffer.Value[index] = jcfeature.Value[jcfeature.Fields.FindField("CZCLX")]; continue; } if (field.Name == "BGQCZCDM") { buffer.Value[index] = jcfeature.Value[jcfeature.Fields.FindField("CZCDM")]; continue; } if (field.Name == "BGQCZCMC") { buffer.Value[index] = jcfeature.Value[jcfeature.Fields.FindField("CZCMC")]; continue; } if (field.Name == "BGMJ") { buffer.Value[index] = jcfeature.Value[jcfeature.Fields.FindField("CZCMJ")];//jcfeature.ShapeCopy.GetEllipseArea(); continue; } buffer.Value[index] = gxgcfeature.Value[index]; } T_Cursor = featureClass.Insert(true); T_Cursor.InsertFeature(buffer); T_Cursor.Flush(); return true; } catch (Exception ex) { throw ex; } } public bool InsertDLTBGX(IFeature jcfeature, IFeatureClass dltbgxfc) { IFeatureCursor T_Cursor = null; try { if (dltbgxfc == null || jcfeature == null) return false; Dictionary dicField = new Dictionary(); int index = -1; for (int i = 0; i < dltbgxfc.Fields.FieldCount; i++) { IField field = dltbgxfc.Fields.Field[i]; if (field.Name == dltbgxfc.ShapeFieldName || field.Name.Contains(dltbgxfc.ShapeFieldName) || field.Name == dltbgxfc.OIDFieldName || !field.Editable || field.Name == "ONLYZLBG" || field.Name == "XZQTZLX") continue; index = jcfeature.Fields.FindField(field.Name); if (index == -1) continue; dicField.Add(i, index); } IFeatureClassLoad pFclsLoad = dltbgxfc as IFeatureClassLoad; if (pFclsLoad != null) pFclsLoad.LoadOnlyMode = true; T_Cursor = dltbgxfc.Insert(true); IFeatureBuffer buffer = dltbgxfc.CreateFeatureBuffer(); buffer.Shape = jcfeature.ShapeCopy; var gxsj = dltbgxfc.FindField("GXSJ"); buffer.Value[gxsj] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); var xzqtzlx = dltbgxfc.FindField("XZQTZLX"); buffer.Value[xzqtzlx] = "0"; foreach (int item in dicField.Keys) { buffer.Value[item] = jcfeature.Value[dicField[item]]; } T_Cursor.InsertFeature(buffer); T_Cursor.Flush(); if (pFclsLoad != null) pFclsLoad.LoadOnlyMode = false; return true; } catch (Exception ex) { throw ex; } } public bool InsertDLTBGXGC(IFeature jcfeature, IFeatureClass dltbgxgcfc) { IFeatureCursor T_Cursor = null; try { if (dltbgxgcfc == null || jcfeature == null) return false; Dictionary dicField = new Dictionary(); int index = -1; for (int i = 0; i < dltbgxgcfc.Fields.FieldCount; i++) { IField field = dltbgxgcfc.Fields.Field[i]; if (field.Name == dltbgxgcfc.ShapeFieldName || field.Name.Contains(dltbgxgcfc.ShapeFieldName) || field.Name == dltbgxgcfc.OIDFieldName || !field.Editable || field.Name == "ONLYZLBG" || field.Name == "XZQTZLX") continue; index = jcfeature.Fields.FindField(field.Name); if (field.Name.Contains("BGQTB") || field.Name.Contains("BGHTB") || field.Name.Contains("BGQ") || field.Name.Contains("BGH")) index = jcfeature.Fields.FindField(field.Name.Replace("BGQTB", "").Replace("BGHTB", "").Replace("BGQ", "").Replace("BGH", "")); if (field.Name == "TBBGMJ") index = jcfeature.Fields.FindField("TBMJ"); if (index == -1) continue; dicField.Add(i, index); } IFeatureClassLoad pFclsLoad = dltbgxgcfc as IFeatureClassLoad; if (pFclsLoad != null) pFclsLoad.LoadOnlyMode = true; T_Cursor = dltbgxgcfc.Insert(true); IFeatureBuffer buffer = dltbgxgcfc.CreateFeatureBuffer(); buffer.Shape = jcfeature.ShapeCopy; var bgxw = dltbgxgcfc.FindField("BGXW"); buffer.Value[bgxw] = "4"; var gxsj = dltbgxgcfc.FindField("GXSJ"); buffer.Value[gxsj] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); var xzqtzlx = dltbgxgcfc.FindField("XZQTZLX"); buffer.Value[xzqtzlx] = "0"; foreach (int item in dicField.Keys) { buffer.Value[item] = jcfeature.Value[dicField[item]]; } T_Cursor.InsertFeature(buffer); T_Cursor.Flush(); if (pFclsLoad != null) pFclsLoad.LoadOnlyMode = false; return true; } catch (Exception ex) { throw ex; } } private string GetMaxBSM(List fcList) { int xh = 0; string MaxBSM = ""; string leftStr = string.Empty; foreach (var fc in fcList) { string BSM = string.Empty; int BSMIndex = fc.FindField("BSM"); if (BSMIndex == -1) return BSM; ITable table = (ITable)fc; // 创建一个ITableSort接口对象 ITableSort tableSort = new TableSortClass(); tableSort.Table = table; tableSort.Fields = "BSM"; tableSort.set_Ascending("BSM", false); tableSort.Sort(null); ICursor cursor = tableSort.Rows; IRow row = cursor.NextRow(); if (row != null) { int maxBSM = 0; int currBSM = 0; string BSMStr = row.Value[BSMIndex].ToString(); if (BSMStr.Length != 18) return BSM; string subBSMStr = BSMStr.Substring(9); try { currBSM = Convert.ToInt32(subBSMStr); } catch (Exception) { return BSM; } if (currBSM > maxBSM) maxBSM = currBSM; if (BSMStr.Length != 18) return BSM; string maxStr = maxBSM.ToString(); int zeroNum = 9 - maxStr.Length; for (int i = 0; i < zeroNum; i++) { maxStr = 0 + maxStr; } BSM = BSMStr.Substring(0, 9) + maxStr; } if (BSM.Length != 18) continue; int xh2 = Convert.ToInt32(BSM.Substring(10)); leftStr = BSM.Substring(0, 10); if (xh < xh2) { xh = xh2; MaxBSM = BSM; } } return MaxBSM; } #endregion } }