using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.AE.ExtensionMethod; using KGIS.Framework.AE.GPHelper; using KGIS.Framework.Maps; using KGIS.Framework.Platform; using KGIS.Framework.Utils; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.Utils.Helper; using Kingo.PluginServiceInterface; using Kingo.PluginServiceInterface.Model; using KUI.Windows; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Windows; namespace Kingo.Plugin.BuildZLDatabase.View { /// /// FrmCZCBG.xaml 的交互逻辑 /// public partial class FrmCZCBG : BaseWindow { private IFeatureClass _CZCFc = null; private IFeatureLayer _DLTBFc = null; private List _ComList { get; set; } public FrmCZCBG() { InitializeComponent(); ProjectInfo prj = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo; ckbXDM.IsChecked = prj.XZQDMChange; _ComList = new List(); } private void BtnSelectCZCLayer_Click(object sender, RoutedEventArgs e) { //OpenDataDialog pDialog = new OpenDataDialog(); //ISpatialDataObjectFilter pOFilter; //pOFilter = new FilterDatasetsAndLayers(); //pDialog.AddFilter(pOFilter, true); //pDialog.Title = "选择导入的数据"; //pDialog.AllowMultiSelect = false; //pDialog.RestoreLocation = true; //pDialog.StartLocation = pDialog.FinalLocation; //System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog(); //if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0) //{ // foreach (ISpatialDataObject distObj in pDialog.Selection) // { // if (distObj.DatasetType == esriDatasetType.esriDTFeatureClass) // { // if (_ComList == null) // _ComList = new List(); // if (!_ComList.Contains(pDialog.FinalLocation)) // _ComList.Add(pDialog.FinalLocation); // combCZCFW.ItemsSource = _ComList; // combCZCFW.SelectedItem = pDialog.FinalLocation; // //combCZCFW.Text = pDialog.FinalLocation; // _CZCFc = (distObj.DatasetName as IName).Open() as IFeatureClass; // } // } //} } IFeatureLayer _DLTBGXLayer_Mem = null; IFeatureLayer _DLTBGX201Layer_Mem = null; IFeatureLayer _DLTBGX202Layer_Mem = null; IFeatureLayer _DLTBGX203Layer_Mem = null; IFeatureLayer _DLTBGX204Layer_Mem = null; IFeatureLayer _DLTBGX205Layer_Mem = null; IFeatureLayer _CZC20XLayer_Mem = null; IFeatureLayer _CZC201Layer_Mem = null; IFeatureLayer _CZC202Layer_Mem = null; IFeatureLayer _CZC203Layer_Mem = null; IFeatureLayer _CZC204Layer_Mem = null; IFeatureLayer _CZC205Layer_Mem = null; string MaxBSM = string.Empty; private EngineEditorClass m_EngineEditor; private void BtnOK_Click(object sender, RoutedEventArgs e) { try { ProjectInfo projectInfo = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo); IFeatureClass GXGCFC = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGXGC"); //地类图斑更新过程 IFeatureClass GXFC = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBGX"); //地类图斑更新层 if (GXGCFC == null || GXFC == null || GXGCFC.FeatureCount(null) == 0 || GXFC.FeatureCount(null) == 0) { MessageHelper.Show("暂无地类图斑增量数据,请先进行地类图斑数据提取!"); return; } IFeatureLayer featureLayer_CZC = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("城镇村等用地"); if (featureLayer_CZC == null) { MessageHelper.Show("未获取到工程下的基础城镇村等用地图层"); return; } _CZCFc = featureLayer_CZC.FeatureClass; #region 单纯划入的 城镇村数据为空 不添加城镇村个数判断 //if (_CZCFc == null || _CZCFc.FeatureCount(null) == 0) //{ // MessageHelper.Show("未获取到工程下的基础城镇村等用地数据"); // return; //} #endregion if (_CZCFc != null && _CZCFc.FindField("XZQTZLX") == -1) { //添加字段 IFieldEdit _field = new FieldClass(); _field.Name_2 = "XZQTZLX"; _field.AliasName_2 = "行政区调整类型"; _field.Type_2 = esriFieldType.esriFieldTypeString; _field.Length_2 = 50; _CZCFc.AddField(_field as IField); } if (m_EngineEditor == null) { m_EngineEditor = new EngineEditorClass(); } if (m_EngineEditor.EditState != esriEngineEditState.esriEngineStateNotEditing) { MessageHelper.Show("请先关闭编辑。"); return; } if (string.IsNullOrWhiteSpace((MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE)) { MessageHelper.Show("县行政区划代码不能为空,请在工程属性界面中填写6位县区划代码!"); return; } this.ShowLoading("正在进行城镇村范围变更...", 0, 0); //CZCDYDHelper helper = new CZCDYDHelper(); //helper.Implement(_CZCFc, ckbDelMinMJ.IsChecked == true, ckbXDM.IsChecked == true); //this.CloseLoading(); IDGParameter Parm = new IDGParameter(); //Parm.PrjInfo = MapsManager.Instance.CurrProjectInfo as ProjectInfo; ProjectInfo prjInfo = MapsManager.Instance.CurrProjectInfo as ProjectInfo; prjInfo.XZQDMChange = this.ckbXDM.IsChecked == true; prjInfo.LessThan30Missing = this.LessThan30Missing.IsChecked == true; prjInfo.Save(); Parm.StrProjInfo = System.IO.Path.Combine(prjInfo.ProjDir, prjInfo.ProjName + prjInfo.ProjSuffix); Parm.ExeCZC = true; ProcesHelper.Instance.ProgressHandle = (o) => { this.UpdateMsg(o.ToString()); }; string result = ProcesHelper.Instance.ExeGPForProces(Parm); this.CloseLoading(); if (result.Contains("Err")) { MessageHelper.ShowTips("城镇村范围变更失败,失败信息请查看系统日志!"); } else { MessageHelper.ShowTips("城镇村范围变更完成!"); } } catch (Exception ex) { throw ex; } finally { this.CloseLoading(); } } public static void DelectDir(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 e) { throw; } } private void InsertData(List pData) { IFeatureClass _CZCGX_Fc = null; IFeatureClass _CZCGXGC_Fc = null; try { if (pData == null || pData.Count == 0) return; _CZCGX_Fc = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGX"); _CZCGXGC_Fc = MapsManager.Instance.MapService.GetFeatureClassByName("CZCDYDGXGC"); if (_CZCGX_Fc == null) { MessageHelper.Show("未找到城镇村更新层"); return; } if (_CZCGXGC_Fc == null) { MessageHelper.Show("未找到城镇村更新过程层"); return; } (_CZCGX_Fc as ITable).DeleteSearchedRows(null); (_CZCGXGC_Fc as ITable).DeleteSearchedRows(null); IFeatureCursor _GXInsertCursor = _CZCGX_Fc.Insert(true); IFeatureCursor _GCInsertCursor = _CZCGXGC_Fc.Insert(true); IFeatureBuffer _GxBuffer = _CZCGX_Fc.CreateFeatureBuffer(); IFeatureBuffer _GcBuffer = _CZCGXGC_Fc.CreateFeatureBuffer(); int idxBSM = _CZCGX_Fc.FindField("BSM"); int idxCZCLX = _CZCGX_Fc.FindField("CZCLX"); int idxCZCDM = _CZCGX_Fc.FindField("CZCDM"); int idxCZCMC = _CZCGX_Fc.FindField("CZCMC"); int idxGXSJ = _CZCGX_Fc.FindField("GXSJ"); int idxBGQBSM = _CZCGXGC_Fc.FindField("BGQBSM"); int idxBGHBSM = _CZCGXGC_Fc.FindField("BGHBSM"); int idxBGQCZCLX = _CZCGXGC_Fc.FindField("BGQCZCLX"); int idxBGHCZCLX = _CZCGXGC_Fc.FindField("BGHCZCLX"); int idxBGQCZCDM = _CZCGXGC_Fc.FindField("BGQCZCDM"); int idxBGHCZCDM = _CZCGXGC_Fc.FindField("BGHCZCDM"); int idxBGQCZCMC = _CZCGXGC_Fc.FindField("BGQCZCMC"); int idxBGHCZCMC = _CZCGXGC_Fc.FindField("BGHCZCMC"); int idxBGXW = _CZCGXGC_Fc.FindField("BGXW"); int idxBGMJ = _CZCGXGC_Fc.FindField("BGMJ"); int idxGCGXSJ = _CZCGXGC_Fc.FindField("GXSJ"); int i = 0; Dictionary> gcMJs = new Dictionary>(); Dictionary bghOIDs = new Dictionary(); Dictionary bghMJs = new Dictionary(); List ListBGXWModel = new List(); foreach (var gx in pData) { if (gx.GCList.Count == 0) { } i++; if (!string.IsNullOrWhiteSpace(gx.CZCLX)) { if (gx.Shape.IsEmpty) { continue; } IArea area = gx.Shape as IArea; if (area.Area < 0.01) { continue; } _GxBuffer.Shape = gx.Shape; if (idxBSM != -1) { if (gx.BSM == "AddNew") { string bsmPrefix = MaxBSM.Substring(0, 10); int MaxNum = Convert.ToInt32(MaxBSM.Substring(10)); if (MaxNum == 1171) { } MaxBSM = bsmPrefix + (MaxNum + 1).ToString().PadLeft(8, '0'); gx.BSM = MaxBSM; } _GxBuffer.Value[idxBSM] = gx.BSM; } if (idxCZCLX != -1) _GxBuffer.Value[idxCZCLX] = gx.CZCLX; if (idxCZCDM != -1) _GxBuffer.Value[idxCZCDM] = gx.CZCDM; if (idxCZCMC != -1) _GxBuffer.Value[idxCZCMC] = gx.CZCMC; if (idxGXSJ != -1) _GxBuffer.Value[idxGXSJ] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); object oid = _GXInsertCursor.InsertFeature(_GxBuffer); if (!bghOIDs.ContainsKey(gx.BSM)) { bghOIDs.Add(gx.BSM, Convert.ToInt32(oid)); } } foreach (var gc in gx.GCList) { gc.BGMJ = gc.Shape.GetEllipseArea().ToDouble(2); if (gc.Shape == null || gc.Shape.IsEmpty || gc.BGMJ == 0) { continue; } List gcList = FeatureAPI.DissolveGeometryByRing(gc.Shape); if (gcList == null) continue; foreach (var shp in gcList) { double bgmj = shp.GetEllipseArea(); if (bgmj == 0) { continue; } _GcBuffer.Shape = shp; if (idxBGXW != -1) _GcBuffer.Value[idxBGXW] = gc.BGXW; if (idxBGMJ != -1) _GcBuffer.Value[idxBGMJ] = bgmj.ToDouble(2); if (idxBGQBSM != -1) _GcBuffer.Value[idxBGQBSM] = gc.BGQBSM; if (idxBGHBSM != -1) _GcBuffer.Value[idxBGHBSM] = gx.BSM; if (idxBGQCZCLX != -1) _GcBuffer.Value[idxBGQCZCLX] = gc.BGQCZCLX; if (idxBGHCZCLX != -1) _GcBuffer.Value[idxBGHCZCLX] = gc.BGHCZCLX; if (idxBGQCZCDM != -1) _GcBuffer.Value[idxBGQCZCDM] = gc.BGQCZCDM; if (idxBGHCZCDM != -1) _GcBuffer.Value[idxBGHCZCDM] = gc.BGHCZCDM; if (idxBGQCZCMC != -1) _GcBuffer.Value[idxBGQCZCMC] = gc.BGQCZCMC; if (idxBGHCZCMC != -1) _GcBuffer.Value[idxBGHCZCMC] = gc.BGHCZCMC; if (idxGCGXSJ != -1) _GcBuffer.Value[idxGCGXSJ] = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31); object oid = _GCInsertCursor.InsertFeature(_GcBuffer); if (!string.IsNullOrWhiteSpace(gc.BGQBSM)) { if (gcMJs.ContainsKey(gc.BGQBSM)) { gcMJs[gc.BGQBSM].Add(new PCModel() { OID = Convert.ToInt32(oid), MJ = gc.BGMJ }); } else { gcMJs.Add(gc.BGQBSM, new List()); gcMJs[gc.BGQBSM].Add(new PCModel() { OID = Convert.ToInt32(oid), MJ = gc.BGMJ }); } } ListBGXWModel.Add(new SetBGXWModel { OID = Convert.ToInt32(oid), BGQBSM = gc.BGQBSM, BGHBSM = gc.BGHBSM }); } } } _GXInsertCursor.Flush(); _GCInsertCursor.Flush(); ICursor curor = (_CZCFc as ITable).Search(null, true); IRow row = null; Dictionary jcMJs = new Dictionary(); int idxJCBSM = -1, idxJCMJ = -1; while ((row = curor.NextRow()) != null) { if (idxJCBSM == -1) idxJCBSM = row.Fields.FindField("BSM"); if (idxJCMJ == -1) idxJCMJ = row.Fields.FindField("CZCMJ"); jcMJs.Add(row.Value[idxJCBSM].ToTrim(), row.Value[idxJCMJ].ToDouble()); } foreach (var key in jcMJs.Keys) { if (!gcMJs.ContainsKey(key)) { continue; } List shpList = gcMJs[key]; double pKZMJ = jcMJs[key]; shpList = shpList.OrderByDescending(o => o.MJ).ToList(); double mjc = Math.Round(shpList.Sum(s => s.MJ) - pKZMJ, 2); if (Math.Round(mjc, 2) == 0) { continue; } int num = 0; //平差 while (Math.Round(mjc, 2) != 0 && num < 10) { num++; int tpsm = (int)(Math.Abs(Math.Round(mjc, 2)) / 0.01); int e = tpsm / shpList.Count; int f = tpsm % shpList.Count; if (f != 0) { double tpmj = (e + 1) * 0.01; for (int j = 0; j < f; j++) { if (mjc < 0) shpList[j].MJ = shpList[j].MJ + tpmj; else shpList[j].MJ = shpList[j].MJ - tpmj; } } if (e != 0) { double tpmj = e * 0.01; for (int j = f; j < shpList.Count; j++) { if (mjc < 0) shpList[j].MJ = shpList[j].MJ + tpmj; else shpList[j].MJ = shpList[j].MJ - tpmj; } } mjc = Math.Round(shpList.Sum(s => s.MJ), 2) - pKZMJ; } foreach (var item in shpList) { IFeature fet = _CZCGXGC_Fc.GetFeature(item.OID); fet.Value[idxBGMJ] = item.MJ; fet.Store(); Marshal.ReleaseComObject(fet); } } curor = (_CZCGXGC_Fc as ITable).Search(null, true); row = null; bghMJs.Clear(); List ListSXBG = new List(); while ((row = curor.NextRow()) != null) { string bgqBSM = row.Value[idxBGQBSM].ToTrim(); string bghBSM = row.Value[idxBGHBSM].ToTrim(); double bgmj = row.Value[idxBGMJ].ToDouble(); if (!string.IsNullOrWhiteSpace(bghBSM)) { if (!bghMJs.ContainsKey(bghBSM)) { bghMJs.Add(bghBSM, bgmj); } else { bghMJs[bghBSM] += bgmj; } } int bgqNum = ListBGXWModel.Count(c => c.BGQBSM == bgqBSM); int bghnum = ListBGXWModel.Count(c => c.BGHBSM == bghBSM); if (bgqNum == 1 && bghnum == 1) { ListSXBG.Add(row.OID); } } int idxCZCMJ = _CZCGX_Fc.FindField("CZCMJ"); foreach (var item in bghMJs.Keys) { if (bghOIDs.ContainsKey(item)) { if (bghOIDs[item] != -1) { IFeature fet = _CZCGX_Fc.GetFeature(bghOIDs[item]); fet.Value[idxCZCMJ] = bghMJs[item].ToDouble(2); fet.Store(); Marshal.ReleaseComObject(fet); } } } foreach (var gcoid in ListSXBG) { IFeature GCfeature = _CZCGXGC_Fc.GetFeature(gcoid); GCfeature.Value[idxBGXW] = "1"; string BGHBSM = GCfeature.Value[idxBGHBSM].ToTrim(); GCfeature.Value[idxBGHBSM] = GCfeature.Value[idxBGQBSM]; GCfeature.Store(); (_CZCGX_Fc as FeatureClass).Workspace.ExecuteSQL(string.Format("Update CZCDYDGX set BSM='{0}' where BSM='{1}'", GCfeature.Value[idxBGQBSM], BGHBSM)); } } catch (Exception ex) { MessageHelper.Show("写入数据失败!错误原因请查看系统日志"); LogAPI.Debug("城镇村范围变更失败:"); LogAPI.Debug(ex); } } private string GetMaxBSM(List fcList) { //System.Windows.Forms.Application.DoEvents(); 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; } private void InsertDataToMemeoryLayer(IFeatureClass pSource, IFeatureClass pTarget, IQueryFilter pFilter = null) { try { if (pSource == null || pTarget == null) return; IFeatureClassAPI fcAPI = new FeatureClassAPI(pSource); if (pTarget != null) fcAPI.FcToFc(pTarget, pFilter, false); } catch (Exception ex) { LogAPI.Debug("获取城镇村范围数据失败:"); LogAPI.Debug(ex); } } private void BtnCancel_Click(object sender, RoutedEventArgs e) { this.Close(); } } public class PCModel { public int OID { get; set; } public double MJ { get; set; } } public class SetBGXWModel { public int OID { get; set; } public string BGQBSM { get; set; } public int BGQBSMNum { get; set; } public string BGHBSM { get; set; } public int BGHBSMNum { get; set; } } public class CZCGXGC { public string BGXW { get; set; } public double BGMJ { get; set; } public string BGQBSM { get; set; } public string BGHBSM { get; set; } public string BGQCZCDM { get; set; } public string BGHCZCDM { get; set; } public string BGQCZCMC { get; set; } public string BGHCZCMC { get; set; } public string BGQBZ { get; set; } public string BGHBZ { get; set; } public string BGQCZCLX { get; set; } public string BGHCZCLX { get; set; } public IGeometry Shape { get; set; } } public class CZCGX { public bool IsNewAdd203 { get; set; } public List UpdateOID { get; set; } public int OID { get; set; } public string CZCLX { get; set; } public string BSM { get; set; } public string CZCDM { get; set; } public string CZCMC { get; set; } public double CZCMJ { get; set; } public List GCList { get; set; } = new List(); public IGeometry Shape { get; set; } public string BGXW { get; set; } public CZCGX() { UpdateOID = new List(); } } }