using DevExpress.XtraBars; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.SystemUI; using KGIS.Framework.AE; using KGIS.Framework.AE.Enum; using KGIS.Framework.Maps; using KGIS.Framework.OpenData.Control; using KGIS.Framework.OpenData.Filter; using KGIS.Framework.OpenData.InterFace; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using Kingo.Plugin.BHTB_Extract.Model; using Kingo.PluginServiceInterface; using KUI.Windows; using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Rectangle = Kingo.Plugin.BHTB_Extract.Model.Rectangle; using ESRI.ArcGIS.ADF; using UIShell.OSGi; namespace Kingo.Plugin.BHTB_Extract.View { /// /// 分幅 的交互逻辑 /// public partial class ExtractDataView : BaseWindow { public double FramingSize { get; set; } //public IFeatureClass featureClass { get; set; } //public IFeatureClass featureClassDLTB { get; set; } private IEnvelope CurrentEnvelope { get; set; } ILayer m_featureLayer = null; IFeatureClass m_featureClass = null; public ExtractDataView() { InitializeComponent(); Init(); } private void Init() { List MapLayerList = MapsManager.Instance.MapService.GetAllLayerInMap(); List SelectLayerList = new List(); List geometries = new List(); try { if (CurrentEnvelope != null) CurrentEnvelope.SetEmpty(); foreach (ILayer item in MapLayerList) { if ((item as RasterLayer) != null) { txtFcPath.Text = (item as IRasterLayer).FilePath; SelectLayerList.Add(item); //确保最大范围 if (CurrentEnvelope == null) CurrentEnvelope = item.AreaOfInterest; else CurrentEnvelope.Union(item.AreaOfInterest); m_featureLayer = item as RasterLayer; } else if ((item as KOTilesLayer) != null) { txtFcPath.Text = (item as KOTilesLayer).DBPath; SelectLayerList.Add(item); //确保最大范围 if (CurrentEnvelope == null) CurrentEnvelope = item.AreaOfInterest; else CurrentEnvelope.Union(item.AreaOfInterest); m_featureLayer = item as KOTilesLayer; } } if (SelectLayerList.Count == 0) { foreach (ILayer item in MapLayerList) { if ((item as IFeatureLayer) != null) { txtFcPath.Text = ((item as IFeatureLayer).FeatureClass as FeatureClass).Workspace.PathName; if ((item as IFeatureLayer).FeatureClass.FeatureCount(null) == 0) continue; SelectLayerList.Add(item); //确保最大范围 if (CurrentEnvelope == null) CurrentEnvelope = item.AreaOfInterest; else { IEnvelope env = item.AreaOfInterest; //if (env != null) // CurrentEnvelope.Union(env); if (env.XMin < 0 || env.YMin < 0) continue; if (env.XMax > CurrentEnvelope.XMax) { CurrentEnvelope.XMax = env.XMax; } if (env.YMax > CurrentEnvelope.YMax) { CurrentEnvelope.YMax = env.YMax; } if (env.XMin < CurrentEnvelope.XMin) { CurrentEnvelope.XMin = env.XMin; } if (env.YMin < CurrentEnvelope.YMin) { CurrentEnvelope.YMin = env.YMin; } } m_featureLayer = item; } } } IEnvelope envelope = CurrentEnvelope; if (envelope == null) { tbXmin.Text = "0"; tbXmax.Text = "0"; tbYmin.Text = "0"; tbYmax.Text = "0"; return; } tbXmin.Text = (envelope.XMin < 0 ? 0 : envelope.XMin).ToString(); tbXmax.Text = envelope.XMax.ToString(); tbYmin.Text = (envelope.YMin < 0 ? 0 : envelope.YMin).ToString(); tbYmax.Text = envelope.YMax.ToString(); } catch (Exception ex) { LogAPI.Debug("初始化作业区生成页面值失败:" + ex); return; } } //固定分幅大小 private void BtnOK_Click(object sender, RoutedEventArgs e) { if (radioBtDistance.IsChecked == true) { if (!string.IsNullOrEmpty(tbFramingSize.Text)) { bool CanGetFramingSizeValue = double.TryParse(tbFramingSize.Text, out double size); if (!CanGetFramingSizeValue) { MessageHelper.ShowTips("请输入合理的固定距离值!"); return; } if (size <= 0) { MessageHelper.ShowTips("输入值请大于0!"); return; } } else { MessageHelper.ShowTips("请输入合理的固定距离值!"); return; } } if (string.IsNullOrEmpty(txtFcPath.Text)) { MessageHelper.ShowTips("请选择作业区范围!"); return; } (sender as Button).IsEnabled = false; ExtensionShowWindow.MainWinForm.Enabled = false; try { this.ShowLoading("正在进行图斑分幅...", 0, 0); bool isSucceed = false; if (radioBtDistance.IsChecked == true) { FramingSize = double.Parse(tbFramingSize.Text); isSucceed = GetEnvelopeBorder(); } else { isSucceed = GrtGraphBorder(); } this.CloseLoading(); if (isSucceed) { this.UpdateMsg("正在添加作业区图斑标注..."); MarkLayer(); //刷新作业区管理列表 if (UcZYQMagr.Instance.IsLoaded) { this.UpdateMsg("正在刷新作业区管理列表..."); UcZYQMagr.Instance.InitTreeView(); } IUcMulitMapControlHelper ucMulitMapControlHelper = BundleRuntime.Instance.GetFirstOrDefaultService(); if (ucMulitMapControlHelper != null) { ucMulitMapControlHelper.ClearData(); ucMulitMapControlHelper.SetLayer(); ucMulitMapControlHelper.MarkLabelLayer(); } MessageHelper.ShowTips("作业区生成完成。"); } this.Close(); } catch (Exception ex) { LogAPI.Debug(ex); return; } finally { this.CloseLoading(); (sender as Button).IsEnabled = true; GC.Collect(); ExtensionShowWindow.MainWinForm.Enabled = true; this.Close(); } } private bool GrtGraphBorder() { IFeatureCursor pCursor = null; IFeature feature = null; IFeatureCursor insertCur = null; IFeatureBuffer newFeature = null; try { if (m_featureClass == null) return false; IFeatureClass featureClass = MapsManager.Instance.MapService.GetFeatureClassByName("ZYQ"); if (featureClass == null) { MessageHelper.ShowError("创建分幅GDB文件失败!"); return false; } (featureClass as ITable).DeleteSearchedRows(null); ISpatialReference spr = (featureClass as IGeoDataset).SpatialReference; insertCur = featureClass.Insert(true); int k = 0; int num = 0; pCursor = m_featureClass.Search(null, true); while ((feature = pCursor.NextFeature()) != null) { k++; num++; newFeature = featureClass.CreateFeatureBuffer(); newFeature.Shape = feature.Shape;//同时转换坐标系统 newFeature.set_Value(newFeature.Fields.FindField("ZYQBH"), "ZYQ" + num.ToString("000000")); newFeature.set_Value(newFeature.Fields.FindField("ZYQMC"), "作业区_" + num.ToString("000000")); newFeature.set_Value(newFeature.Fields.FindField("ZYQZT"), 0); newFeature.set_Value(newFeature.Fields.FindField("HH"), null); newFeature.set_Value(newFeature.Fields.FindField("LH"), null); insertCur.InsertFeature(newFeature); if (k % 500 == 0) { k = 0; insertCur.Flush(); } } if (k > 0) { insertCur.Flush(); } return true; } catch (Exception ex) { MessageHelper.ShowError("图斑分幅发生异常,详情请查看系统日志!"); LogAPI.Debug("图斑分幅时发生异常,异常信息如下:"); LogAPI.Debug(ex); return false; } finally { if (pCursor != null) Marshal.ReleaseComObject(pCursor); if (feature != null) Marshal.ReleaseComObject(feature); if (insertCur != null) Marshal.ReleaseComObject(insertCur); if (newFeature != null) Marshal.ReleaseComObject(newFeature); GC.Collect(); } } private bool GetEnvelopeBorder() { IEnvelope envelope = CurrentEnvelope; if (envelope == null) { MessageHelper.Show("未获取到作业区范围数据,请重新选择作业区范围!"); return false; } IFeatureCursor insertCur = null; IFeatureBuffer newFeature = null; try { Rectangle wjfw = new Rectangle(); wjfw.MinX = envelope.XMin; wjfw.MaxX = envelope.XMax; wjfw.MaxY = envelope.YMax; wjfw.MinY = envelope.YMin; List bwtfList = GetBWTFH(wjfw); if (bwtfList.Count == 0) return false; IFeatureClass featureClass = MapsManager.Instance.MapService.GetFeatureClassByName("ZYQ"); if (featureClass == null) { MessageHelper.ShowError("创建分幅GDB文件失败!"); return false; } (featureClass as ITable).DeleteSearchedRows(null); ISpatialReference spr = (featureClass as IGeoDataset).SpatialReference; insertCur = featureClass.Insert(true); int k = 0; foreach (var item in bwtfList) { k++; newFeature = featureClass.CreateFeatureBuffer(); newFeature.Shape = GetGeoByWJFW(item.WJFW, spr);//同时转换坐标系统 newFeature.set_Value(newFeature.Fields.FindField("ZYQBH"), item.TFH); newFeature.set_Value(newFeature.Fields.FindField("ZYQMC"), item.TBName); newFeature.set_Value(newFeature.Fields.FindField("ZYQZT"), 0); newFeature.set_Value(newFeature.Fields.FindField("HH"), item.HH); newFeature.set_Value(newFeature.Fields.FindField("LH"), item.LH); insertCur.InsertFeature(newFeature); if (k % 500 == 0) { k = 0; insertCur.Flush(); } } if (k > 0) { insertCur.Flush(); } return true; } catch (Exception ex) { MessageHelper.ShowError("图斑分幅发生异常,详情请查看系统日志!"); LogAPI.Debug("图斑分幅时发生异常,异常信息如下:"); LogAPI.Debug(ex); return false; } finally { if (insertCur != null) Marshal.ReleaseComObject(insertCur); if (newFeature != null) Marshal.ReleaseComObject(newFeature); GC.Collect(); } } /// /// 添加作业区图斑标注 /// private void MarkLayer() { try { IFeatureLayer pFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("ZYQ"); if (pFeatureLayer == null) return; IGeoFeatureLayer pGeoLayer = pFeatureLayer as IGeoFeatureLayer; IRgbColor pColor = new RgbColorClass() { Red = 85, Blue = 105, Green = 255 }; stdole.IFontDisp pFont = new stdole.StdFont() { Name = "宋体", //Bold = true } as stdole.IFontDisp; ITextSymbol pTextSymbol = new TextSymbolClass() { Color = pColor, Font = pFont, Size = 8 }; IBasicOverposterLayerProperties pBasicOverLayerPro = new BasicOverposterLayerPropertiesClass(); pBasicOverLayerPro.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon; pBasicOverLayerPro.GenerateUnplacedLabels = true; pBasicOverLayerPro.NumLabelsOption = esriBasicNumLabelsOption.esriOneLabelPerShape; ILabelEngineLayerProperties pLableEngine = new LabelEngineLayerPropertiesClass() { Symbol = pTextSymbol, IsExpressionSimple = true }; IOverposterLayerProperties2 pOverLayerProper = pBasicOverLayerPro as IOverposterLayerProperties2; pOverLayerProper.TagUnplaced = true;//设置该属性,目的是不被其他element遮挡 pLableEngine.BasicOverposterLayerProperties = pBasicOverLayerPro; IAnnotateLayerProperties pAnnoPros = pLableEngine as IAnnotateLayerProperties; pGeoLayer.AnnotationProperties.Add(pAnnoPros); pGeoLayer.DisplayAnnotation = true; AxMapControl axMapControl1 = MapsManager.Instance.MapService.getAxMapControl(); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, axMapControl1.Extent); } catch (Exception ex) { LogAPI.Debug("设置标注时发生异常,异常信息如下:" + ex); return; } } private List GetBWTFH(Rectangle wjfw) { if (wjfw == null) return null; List bwtfList = new List(); IIdentify indentify = null; IGeometry pGeometry = null; try { if (m_featureLayer != null) indentify = m_featureLayer as IIdentify; double xlength = wjfw.MaxX - wjfw.MinX; double ylength = wjfw.MaxY - wjfw.MinY; int xCount = (int)Math.Ceiling(xlength / FramingSize); int yCount = (int)Math.Ceiling(ylength / FramingSize); int num = 0; for (int y = 0; y < yCount; y++) { for (int x = 0; x < xCount; x++) { Rectangle rectangle = new Rectangle() { MinX = wjfw.MinX + x * FramingSize, MinY = wjfw.MinY + y * FramingSize, MaxX = wjfw.MinX + (x + 1) * FramingSize, MaxY = wjfw.MinY + (y + 1) * FramingSize }; if (rectangle.MaxX > wjfw.MaxX) { rectangle.MaxX = wjfw.MaxX; } if (rectangle.MaxY > wjfw.MaxY) { rectangle.MaxY = wjfw.MaxY; } if (indentify != null) { IEnvelope envelope = new EnvelopeClass(); envelope.XMax = rectangle.MaxX; envelope.XMin = rectangle.MinX; envelope.YMax = rectangle.MaxY; envelope.YMin = rectangle.MinY; pGeometry = envelope as IGeometry; if(pGeometry != null) { IArray pIDs = indentify.Identify(pGeometry); if (pIDs == null || pIDs.Count == 0) continue; } } num++; BHTBFramingDatas bwtf = new BHTBFramingDatas(); bwtf.TFH = "ZYQ" + num.ToString("000000"); bwtf.TBName = "作业区_" + num.ToString("000000"); bwtf.IsModify = "否"; bwtf.HH = x; bwtf.LH = y; bwtf.WJFW = rectangle; bwtfList.Add(bwtf); } } return bwtfList; } catch (Exception ex) { LogAPI.Debug("图斑分幅错误:" + ex); return bwtfList; } } public void SetField(ref IFields fields, List lstEntity) { try { if (lstEntity == null) { return; } IField pField = new FieldClass(); IFieldEdit pFieldEdit = (IFieldEdit)pField; IFieldsEdit pFieldsEdit = (IFieldsEdit)fields; foreach (var item in lstEntity) { pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField; if (!string.IsNullOrWhiteSpace(item.FieldAliasName)) { pFieldEdit.AliasName_2 = item.FieldAliasName; } pFieldEdit.Name_2 = item.DataName; pFieldEdit.Type_2 = item.DataType; if (!string.IsNullOrEmpty(item.DefaultValue)) { pFieldEdit.DefaultValue_2 = item.DefaultValue; } else { pFieldEdit.DefaultValue_2 = DBNull.Value; } pFieldEdit.IsNullable_2 = item.AllowNull; pFieldEdit.Length_2 = item.Length; pFieldEdit.Precision_2 = item.Precision; pFieldsEdit.AddField(pField); } } catch (Exception ex) { LogAPI.Debug("创建图层字段异常:" + ex); throw ex; } } private IGeometry GetGeoByWJFW(Rectangle reg, ISpatialReference spr) { ArrayList result = new ArrayList(); try { result.Add((byte)1);//顺序 result.AddRange(BitConverter.GetBytes(3));//类型 面 result.AddRange(BitConverter.GetBytes(1));//环数 ArrayList jmdArray = new ArrayList(); jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX)); jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY)); //上边 jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX)); jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxY)); //右边 jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxX)); jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxY)); //下边 jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxX)); jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY)); //首尾相连 jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX)); jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY)); result.AddRange(BitConverter.GetBytes(jmdArray.Count / 16)); result.AddRange(jmdArray); byte[] wkb = (byte[])result.ToArray(typeof(byte)); IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3; IGeometry geom; int countin = wkb.GetLength(0); factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin); if ((geom as IArea).Area < 0) { IPolygon pPolygon = geom as IPolygon; pPolygon.ReverseOrientation(); } if (geom == null) return null; //ISpatialReference spatialReference = (featureClassDLTB as IGeoDataset).SpatialReference; //if (spatialReference is IProjectedCoordinateSystem) //{ // IProjectedCoordinateSystem pcsSys = spatialReference as IProjectedCoordinateSystem; // geom.SpatialReference = pcsSys; //} //geom.Project(spr);//投影到对应的坐标系上 return geom; } catch (Exception ex) { LogAPI.Debug("获取分幅后的图斑形状异常:" + ex); return null; } } 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 + " ; "); return false; throw; } } private void btnCancel_Click(object sender, RoutedEventArgs e) { this.Close(); } private void btnSelectLayer_Click(object sender, RoutedEventArgs e) { try { 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) { txtFcPath.Text = pDialog.FinalLocation; IFeatureClass SourceFeatureClass = (distObj.DatasetName as IName).Open() as IFeatureClass; m_featureClass = SourceFeatureClass; if ((SourceFeatureClass as FeatureClass).Workspace.Type != esriWorkspaceType.esriRemoteDatabaseWorkspace) { IFeatureClassManage fcManage = SourceFeatureClass as IFeatureClassManage; fcManage.UpdateExtent(); } CurrentEnvelope = (SourceFeatureClass as IGeoDataset).Extent; if (CurrentEnvelope != null) { tbXmin.Text = CurrentEnvelope.XMin.ToString(); tbXmax.Text = CurrentEnvelope.XMax.ToString(); tbYmin.Text = CurrentEnvelope.YMin.ToString(); tbYmax.Text = CurrentEnvelope.YMax.ToString(); } m_featureLayer = new FeatureLayer() { Name = SourceFeatureClass.AliasName, FeatureClass = SourceFeatureClass }; } else if (distObj.DatasetType == esriDatasetType.esriDTRasterDataset) //影像数据 { txtFcPath.Text = pDialog.FinalLocation; IRasterLayer templayer = new RasterLayerClass(); templayer.CreateFromFilePath(pDialog.FinalLocation); templayer.Name = pDialog.Selection[0].Name; m_featureClass = null; CurrentEnvelope = templayer.AreaOfInterest; if (CurrentEnvelope != null) { tbXmin.Text = CurrentEnvelope.XMin.ToString(); tbXmax.Text = CurrentEnvelope.XMax.ToString(); tbYmin.Text = CurrentEnvelope.YMin.ToString(); tbYmax.Text = CurrentEnvelope.YMax.ToString(); } m_featureLayer = templayer; } } } } catch (Exception ex) { txtFcPath.Text = ""; MessageHelper.Show("获取作业区范围失败!"); LogAPI.Debug("获取作业区范围时发生异常,异常信息如下:"); LogAPI.Debug(ex); } } private void radioBtGraph_Checked(object sender, RoutedEventArgs e) { if (radioBtGraph.IsChecked == true) { txtFcPath.Text = null; } } } }