using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Threading; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Display; using System.IO; using System.Data.SQLite; using ESRI.ArcGIS.Carto; using System.Xml.Serialization; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using KGIS.Framework.OpenData.Control; using KGIS.Framework.OpenData.Filter; using KGIS.Framework.OpenData.InterFace; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using Kingo.Plugin.MakeTaskPackage.Entity; namespace Kingo.Plugin.MakeTaskPackage.View { public delegate void GetMapPoints(); public delegate void CutProgressReport(int sum, int current, int cutIndex); public delegate void CutCreatDown(int cutIndex); public partial class UCMxdMultCut : UserControl { public event CutCreatDown CreatDown; public event CutProgressReport Report; public event GetMapPoints GetMapPointsEvent = null; private double maxDis = 0; private MxdParameters mxdParams = null; public bool UseOutMapControl { get; set; } public ESRI.ArcGIS.Controls.AxMapControl OutMapControl { get; set; } public ESRI.ArcGIS.Geometry.IGeometry GeometryNow { get; set; } public int CutIndex { get; set; } public bool IsEncrypt { get; set; } public UCMxdMultCut() { InitializeComponent(); UseOutMapControl = false; this.btnBrowseMxd.Click += new EventHandler(btnBrowseMxd_Click); this.btnBrowser.Click += new EventHandler(btnBrowser_Click); this.btnOk.Click += new EventHandler(btnOk_Click); this.btnMapPoints.Click += new EventHandler(btnMapPoints_Click); this.cboxTileFormat.SelectedIndex = 0; this.rbAll.CheckedChanged += new EventHandler(rbAll_CheckedChanged); this.rbAuto.CheckedChanged += new EventHandler(rbAll_CheckedChanged); this.rbCustom.CheckedChanged += new EventHandler(rbAll_CheckedChanged); this.cmbBlockCount.SelectedIndexChanged += new EventHandler(cmbBlockCount_SelectedIndexChanged); this.cmbBlockCount.SelectedIndex = 0; this.axMapControl1.OnMouseDown += new ESRI.ArcGIS.Controls.IMapControlEvents2_Ax_OnMouseDownEventHandler(axMapControl1_OnMouseDown); this.txtMaxScale.TextChanged += new EventHandler(txtMaxScale_TextChanged); this.btnExport.Click += new EventHandler(btnExport_Click); this.btnImport.Click += new EventHandler(btnImport_Click); this.btnExportPoint.Click += new EventHandler(btnExportPoint_Click); } void btnImport_Click(object sender, EventArgs e) { if (this.openFileDialog1.ShowDialog() == DialogResult.OK) { System.IO.FileStream stream = null; try { stream = File.OpenRead(this.openFileDialog1.FileName); object obj = Deserialize(typeof(MxdParameters), stream); BindParmas(obj as MxdParameters); } catch (Exception) { MessageHelper.Show("导入失败,请检查文件是否为指定格式"); } finally { if (stream != null) stream.Close(); } } } void btnExport_Click(object sender, EventArgs e) { if (this.saveFileDialog1.ShowDialog() == DialogResult.OK) { if (SetParmas()) { try { if (this.rbAuto.Checked) { string fileName = System.IO.Path.GetDirectoryName(this.saveFileDialog1.FileName) + "\\" + System.IO.Path.GetFileNameWithoutExtension(this.saveFileDialog1.FileName); for (int i = 0; i < mxdParams.BlockHorizontalCount; i++) { mxdParams.BlockIndex = i + 1; byte[] xmlByte = Serializer(typeof(MxdParameters), mxdParams); File.WriteAllBytes(fileName + "_" + (i + 1) + ".xml", xmlByte); } } else { byte[] xmlByte = Serializer(typeof(MxdParameters), mxdParams); File.WriteAllBytes(this.saveFileDialog1.FileName, xmlByte); } MessageHelper.Show("导出成功"); } catch (Exception ex) { LogAPI.Debug("Mxd切片配置导出失败:" + ex); MessageHelper.Show("导出失败"); } } else { MessageHelper.Show("参数设置异常,导出失败"); } } } bool SetParmas() { if (mxdParams == null) { mxdParams = new MxdParameters(); } try { //this.txtMaxScale.Text = mxdParams.MaxScale.ToString(); //this.txtMinScale.SelectedItem = mxdParams.MinScale.ToString(); if (!string.IsNullOrWhiteSpace(mxdParams.MinScale.ToString())) { this.txtMinScale.SelectedItem = mxdParams.MinScale.ToString(); } mxdParams.MinScale = Convert.ToInt32(this.txtMinScale.SelectedItem.ToString()); mxdParams.MaxScale = Convert.ToInt32(this.txtMaxScale.Text); mxdParams.ThreadNum = Convert.ToInt32(this.txtThreadNo.Text); mxdParams.TileSize = Convert.ToInt32(this.txtPicSize.Text); if (cboxTileFormat.SelectedIndex == 0) mxdParams.ImgFormat = "png"; else mxdParams.ImgFormat = "jpg"; if (this.rbAll.Checked) { mxdParams.CutType = CUTAreaType.全部; } else if (this.rbCustom.Checked) { mxdParams.CutType = CUTAreaType.自定义; } else if (this.rbAuto.Checked) { mxdParams.CutType = CUTAreaType.自动分块; } mxdParams.BlockHorizontalCount = Convert.ToInt32(this.cmbBlockCount.SelectedItem); mxdParams.BlockIndex = Convert.ToInt32(this.cmbBlockIndex.SelectedItem); } catch { return false; } return true; } public void BindParmas(MxdParameters mxdParams) { if (mxdParams == null) return; try { //this.txtMaxScale.Text = mxdParams.MaxScale.ToString(); //this.txtMinScale.SelectedItem = mxdParams.MinScale.ToString(); this.txtMaxScale.Text = mxdParams.MaxScale.ToString(); this.txtMinScale.Items.Clear(); GetAllScale(mxdParams.MaxScale, maxDis); if (!string.IsNullOrWhiteSpace(mxdParams.MinScale.ToString())) { this.txtMinScale.SelectedItem =mxdParams.MinScale; } //this.txtMinScale.SelectedItem = mxdParams.MinScale.ToString(); this.txtThreadNo.Text = mxdParams.ThreadNum.ToString(); this.txtPicSize.Text = mxdParams.TileSize.ToString(); cboxTileFormat.SelectedIndex = mxdParams.ImgFormat == "png" ? 0 : 1; if (mxdParams.CutType == CUTAreaType.全部) { this.rbAll.Checked = true; } else if (mxdParams.CutType ==CUTAreaType.自定义) { this.rbCustom.Checked = true; } else if (mxdParams.CutType == CUTAreaType.自动分块) { this.rbAuto.Checked = true; } this.cmbBlockCount.SelectedItem = mxdParams.BlockHorizontalCount; this.cmbBlockIndex.SelectedItem = mxdParams.BlockIndex; } catch { } } void txtMaxScale_TextChanged(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(txtMaxScale.Text)) return; int MaxScale = 0; int.TryParse(txtMaxScale.Text, out MaxScale); this.txtMinScale.Items.Clear(); GetAllScale(MaxScale, maxDis); } catch { } } /// /// 生成比例尺 /// /// 最大比例尺 /// 最大距离 /// private List GetAllScale(int maxScale, double maxDistance) { List lstScale = new List(); double distance = 0; int scaleNow = maxScale; int minScale = (int)(maxDistance * 96 / (256 * 0.0254)); distance = scaleNow * 256 * 0.0254 / 96; if (minScale <= scaleNow) { lstScale.Add(scaleNow); this.txtMinScale.Items.Add(scaleNow); return lstScale; } lstScale.Add(maxScale); while (minScale > scaleNow) { scaleNow = scaleNow * 2; //distance = scaleNow * 256 * 0.0254 / 96;//计算实际距离 lstScale.Add(scaleNow); this.txtMinScale.Items.Add(scaleNow); } this.txtMinScale.SelectedIndex = this.txtMinScale.Items.Count - 1; //lstScale.Add(minScale); return lstScale; } IEnvelope trackE = null; IGeometry trackPolygon = null; bool isDraw = false; void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) { if (isDraw) { trackPolygon = axMapControl1.TrackPolygon(); trackE = trackPolygon.Envelope;//.TrackRectangle(); DrawPoylon(trackPolygon); this.txtCustomPoints.Text = trackE.XMin + "," + trackE.YMax + ";" + trackE.XMax + "," + trackE.YMax + ";" + trackE.XMax + "," + trackE.YMin + ";" + trackE.XMin + "," + trackE.YMin; } } RectangleElementClass polygonElement = null; public void DrawPoylon(IGeometry geo) { if (polygonElement == null) { polygonElement = new RectangleElementClass(); polygonElement.Symbol = SelectFillSymbol(); polygonElement.Geometry = geo; polygonElement.Name = "CF" + DateTime.Now.ToLongDateString(); (axMapControl1.ActiveView.GraphicsContainer as IGraphicsContainer).AddElement((IElement)polygonElement, 0); } else { polygonElement.Geometry = geo; } axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); } IRgbColor SelectColor = null; ISimpleLineSymbol selectOutline = null; ISimpleFillSymbol selectsimpleFillSymbol = null; private ISimpleFillSymbol SelectFillSymbol() { if (SelectColor == null) { SelectColor = new RgbColor(); // 设置颜色属性 SelectColor.Red = 255; SelectColor.Green = 0; SelectColor.Blue = 0; } // 获取ILine符号接口 if (selectOutline == null) { selectOutline = new SimpleLineSymbol(); // 设置线符号属 selectOutline.Width = 3; selectOutline.Color = SelectColor; } if (selectsimpleFillSymbol == null) { selectsimpleFillSymbol = new SimpleFillSymbolClass(); // 设置填充符号属性 selectsimpleFillSymbol.Outline = selectOutline; selectsimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSHollow; } return selectsimpleFillSymbol; } /// /// 地图取点 /// /// /// void btnMapPoints_Click(object sender, EventArgs e) { //FrmMergeKotiles frmm = new FrmMergeKotiles(); //frmm.ShowDialog(); if (GetMapPointsEvent != null) GetMapPointsEvent(); isDraw = true; } public void SetCutMapIEnvelope(IEnvelope envelope) { trackE = envelope; this.txtCustomPoints.Text = trackE.XMin + "," + trackE.YMax + ";" + trackE.XMax + "," + trackE.YMax + ";" + trackE.XMax + "," + trackE.YMin + ";" + trackE.XMin + "," + trackE.YMin; } public List selectedXzq = new List(); private int currentIndex = 0; private string keyField = ""; private string WhereStr = ""; public IFeatureClass pFC = null; void btnExportPoint_Click(object sender, EventArgs e) { try { OpenDataDialog pDialog = new OpenDataDialog(); ISpatialDataObjectFilter pOFilter; pOFilter = new FilterDatasetsAndLayers(); //pOFilter.DistObjectCollection.Add( pDialog.AddFilter(pOFilter, true); pDialog.Title = "选择矢量图层数据"; pDialog.AllowMultiSelect = false; pDialog.RestoreLocation = true; pDialog.StartLocation = pDialog.FinalLocation; if (pDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0) { foreach (ISpatialDataObject distObj in pDialog.Selection) { object obj = (distObj.DatasetName as IName).Open(); pFC = obj as IFeatureClass; if (pFC != null) { trackE = (pFC as IGeoDataset).Extent; FrmXZQSelected frm = new FrmXZQSelected(); frm.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; frm.Width = 800; frm.Height = 450; frm.ImportFeatureClass = pFC; selectedXzq = frm.KeyFieldsList; keyField = frm.KeyField; WhereStr = frm.WhereStr; currentIndex = 0; frm.ShowInMainForm(true); this.txtCustomPoints.Text = trackE.XMin + "," + trackE.YMax + ";" + trackE.XMax + "," + trackE.YMax + ";" + trackE.XMax + "," + trackE.YMin + ";" + trackE.XMin + "," + trackE.YMin; } else { MessageBox.Show("请选择矢量图层"); } } } } catch (Exception ex) { LogAPI.Debug(ex); } } private ESRI.ArcGIS.Geometry.IGeometry XzqGeometry(string keyValue, string keyName) { if (pFC == null) return null; IFeatureCursor featureCursor = pFC.Search(new QueryFilterClass() { WhereClause = string.Format(WhereStr, keyValue) }, false); if (featureCursor == null) return null; IFeature feature = featureCursor.NextFeature(); if (feature == null) return null; return feature.ShapeCopy; } #region 切片区域配置 void rbAll_CheckedChanged(object sender, EventArgs e) { this.panelAuto.Enabled = this.rbAuto.Checked; this.panelCustom.Enabled = this.rbCustom.Checked; } void cmbBlockCount_SelectedIndexChanged(object sender, EventArgs e) { int count = 0; string selectText = cmbBlockCount.SelectedItem.ToString(); if (selectText == "2") { count = 2; } else if (selectText == "4") { count = 4; } else if (selectText == "8") { count = 8; } AddItems(count); } void AddItems(int indexCount) { this.cmbBlockIndex.Items.Clear(); for (int i = 1; i <= indexCount; i++) { this.cmbBlockIndex.Items.Add(i); } this.cmbBlockIndex.SelectedIndex = 0; } #endregion private CutTiles cutTiles = null; public void btnOk_Click(object sender, EventArgs e) { cutTiles = new CutTiles(); System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Png; if (string.IsNullOrEmpty(this.txtMxdPath.Text)) { MessageHelper.Show("请选择MXD文件"); return; } if (this.cboxTileFormat.Text.ToLower() == "png") { imgFormat = System.Drawing.Imaging.ImageFormat.Png; } try { cutTiles.TilesDBPath = this.txtSaveFilePath.Text; if (rbAuto.Checked) { cutTiles.BlockHorizontalCount = Convert.ToInt32(this.cmbBlockCount.SelectedItem); cutTiles.BlockIndex = Convert.ToInt32(this.cmbBlockIndex.SelectedItem); cutTiles.IsBlock = rbAuto.Checked; cutTiles.CutType = CUTAreaType.自动分块; } else if (rbCustom.Checked) { cutTiles.CustomArea = trackE; cutTiles.CutType = CUTAreaType.自定义; if (selectedXzq != null && selectedXzq.Count > 0) { ESRI.ArcGIS.Geometry.IGeometry geometry = XzqGeometry(selectedXzq[currentIndex], keyField); if (geometry != null) { cutTiles.CustomArea = geometry.Envelope; cutTiles.TilesDBPath = System.IO.Path.GetDirectoryName(this.txtSaveFilePath.Text) + "\\" + selectedXzq[currentIndex] + ".kotiles"; cutTiles.CustomGeometry = geometry; // FrmMapVis frm = new FrmMapVis(); //frm.Show(); //frm.LoadMxd(this.txtMxdPath.Text, (geometry as ESRI.ArcGIS.esriSystem.IClone).Clone() as IGeometry); //var pMapClip = this.axMapControl1.Map as ESRI.ArcGIS.Carto.;// IMapClipOptions; //pMapClip.ClipGeometry = this.axMapControl1.ActiveView.Extent as IGeometry; //pMapClip.ClipType = esriMapClipType.esriMapClipShape; //this.axMapControl1.ActiveView.FocusMap.ClipGeometry = geometry; //this.axMapControl1.ActiveView.Refresh(); //this.axMapControl1.Map.ClipGeometry = geometry; //this.axMapControl1.FullExtent = geometry.Envelope; //this.axMapControl1.Refresh(); } } else { cutTiles.CustomArea = trackPolygon.Envelope; cutTiles.CustomGeometry = trackPolygon; //var pMapClip = this.axMapControl1.Map as IMapClipOptions; //pMapClip.ClipGeometry = this.axMapControl1.ActiveView.Extent as IGeometry; //pMapClip.ClipType = esriMapClipType.esriMapClipShape; //this.axMapControl1.Map.ClipGeometry = trackPolygon; //this.axMapControl1.FullExtent = trackPolygon.Envelope; //this.axMapControl1.Refresh(); //this.axMapControl1.ActiveView.FocusMap.ClipGeometry = trackPolygon; //this.axMapControl1.ActiveView.Refresh(); } } else { cutTiles.CutType = CUTAreaType.全部; } var mapcontrol = this.axMapControl1; //if (UseOutMapControl) //{ // mapcontrol = OutMapControl; //} List spList = Kingo.Mobile.Shape2KOTool.SpatialRefrenceStruct.GetAllData(); Kingo.Mobile.Shape2KOTool.SpatialRefrenceStruct sp = spList.Find(p => p.WKID == mapcontrol.SpatialReference.FactoryCode); if (sp == null) { var spname = mapcontrol.SpatialReference.Name.Replace("_"," ").Replace("Gauss Kruger","GK"); sp = spList.Find(p => p.Description.ToUpper() == spname.ToUpper()); } cutTiles.Projection = sp==null?"":sp.WKT; cutTiles.TileSize = Convert.ToInt32(this.txtPicSize.Text); cutTiles.axMap = mapcontrol; cutTiles.LayerName = this.LayerName; cutTiles.ImgFormat = imgFormat; cutTiles.MaxLevel = 0;//Convert.ToInt32(this.txtMaxLevel.Text); cutTiles.MinLevel = Convert.ToInt32(this.txtMinLevel.Text); cutTiles.MxdPath = this.txtMxdPath.Text; cutTiles.groupBox = this.groupBox3; cutTiles.MaxScale = Convert.ToInt32(this.txtMaxScale.Text); cutTiles.MinScale = Convert.ToInt32(this.txtMinScale.SelectedItem); cutTiles.IsEncrypt = this.IsEncrypt; } catch (Exception) { MessageHelper.Show("参数设置异常"); return; } if (string.IsNullOrEmpty(this.txtSaveFilePath.Text)) { MessageHelper.Show("请设置保存位置"); return; } DateTime dt1 = DateTime.Now; cutTiles.CreatDown += (s, e1) => { if (this.CreatDown != null) CreatDown(CutIndex); DateTime dt3 = DateTime.Now; if (!this.IsDisposed && !this.Disposing) { this.Invoke(new MethodInvoker(() => { SetState(false, dt3.Subtract(dt1).TotalSeconds.ToString("0.0")); GC.Collect(); if (rbCustom.Checked && selectedXzq != null) { currentIndex++; if (currentIndex >= selectedXzq.Count) return; btnOk_Click(null, null); } })); } }; cutTiles.Report += (s, c) => { if (this.Report != null) Report(s, c, CutIndex); if (!this.IsDisposed && !this.Disposing) { this.Invoke(new MethodInvoker(() => { this.lbTips.Text = string.Format("{0}/{1}", c, s); })); } }; try { cutTiles.CreateMxdFileKOTilesThread(Convert.ToInt32(this.txtThreadNo.Text)); SetState(true); } catch (Exception ex) { LogAPI.Debug("mxd切片失败:" + ex); MessageHelper.Show( "mxd切片失败:"+ ex); } } public void Stop() { if (cutTiles != null) { cutTiles.Stop(); cutTiles = null; } } public void CreateTiles() { cutTiles = new CutTiles(); System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Png; if (string.IsNullOrEmpty(this.txtMxdPath.Text)) { MessageHelper.Show("请选择MXD文件"); return; } if (this.cboxTileFormat.Text.ToLower() == "png") { imgFormat = System.Drawing.Imaging.ImageFormat.Png; } try { cutTiles.TilesDBPath = this.txtSaveFilePath.Text; if (rbAuto.Checked) { cutTiles.BlockHorizontalCount = Convert.ToInt32(this.cmbBlockCount.SelectedItem); cutTiles.BlockIndex = Convert.ToInt32(this.cmbBlockIndex.SelectedItem); cutTiles.IsBlock = rbAuto.Checked; cutTiles.CutType =CUTAreaType.自动分块; } else if (rbCustom.Checked) { cutTiles.CustomArea = trackE; cutTiles.CutType = CUTAreaType.自定义; if (selectedXzq != null && selectedXzq.Count > 0) { ESRI.ArcGIS.Geometry.IGeometry geometry = XzqGeometry(selectedXzq[currentIndex], keyField); if (geometry != null) { cutTiles.CustomArea = geometry.Envelope; cutTiles.TilesDBPath = System.IO.Path.GetDirectoryName(this.txtSaveFilePath.Text) + "\\" + selectedXzq[currentIndex] + ".kotiles"; cutTiles.CustomGeometry = geometry; this.axMapControl1.Map.ClipGeometry = geometry; this.axMapControl1.FullExtent = geometry.Envelope; this.axMapControl1.Refresh(); } } //else //{ // cutTiles.CustomArea = trackPolygon.Envelope; // cutTiles.CustomGeometry = trackPolygon; // this.axMapControl1.Map.ClipGeometry = trackPolygon; // this.axMapControl1.FullExtent = trackPolygon.Envelope; // this.axMapControl1.Refresh(); //} } else { cutTiles.CutType = CUTAreaType.全部; } List spList = Kingo.Mobile.Shape2KOTool.SpatialRefrenceStruct.GetAllData(); Kingo.Mobile.Shape2KOTool.SpatialRefrenceStruct sp = spList.Find(p => p.WKID == this.axMapControl1.SpatialReference.FactoryCode); cutTiles.Projection = sp.WKT; cutTiles.TileSize = Convert.ToInt32(this.txtPicSize.Text); cutTiles.axMap = this.axMapControl1; cutTiles.ImgFormat = imgFormat; cutTiles.MaxLevel = 0;//Convert.ToInt32(this.txtMaxLevel.Text); cutTiles.MinLevel = Convert.ToInt32(this.txtMinLevel.Text); cutTiles.MxdPath = this.txtMxdPath.Text; cutTiles.groupBox = this.groupBox3; cutTiles.MaxScale = Convert.ToInt32(this.txtMaxScale.Text); cutTiles.MinScale = Convert.ToInt32(this.txtMinScale.SelectedItem); cutTiles.IsEncrypt = this.IsEncrypt; } catch (Exception) { MessageHelper.Show("参数设置异常"); return; } if (string.IsNullOrEmpty(this.txtSaveFilePath.Text)) { MessageHelper.Show("请设置保存位置"); return; } DateTime dt1 = DateTime.Now; cutTiles.CreatDown += (s, e1) => { if (this.CreatDown != null) CreatDown(CutIndex); //DateTime dt3 = DateTime.Now; //if (!this.IsDisposed && !this.Disposing) //{ // this.Invoke(new MethodInvoker(() => // { // SetState(false, dt3.Subtract(dt1).TotalSeconds.ToString("0.0")); // GC.Collect(); // if (rbCustom.Checked && selectedXzq != null) // { // currentIndex++; // if (currentIndex >= selectedXzq.Count) // return; // //btnOk_Click(null, null); // } // })); //} }; cutTiles.Report += (s, c) => { if (this.Report != null) Report(s, c, CutIndex); //if (!this.IsDisposed && !this.Disposing) //{ // this.Invoke(new MethodInvoker(() => // { // this.lbTips.Text = string.Format("{0}/{1}", c, s); // })); //} }; try { cutTiles.CreateMxdFileKotiles(1); SetState(true); } catch (Exception ex) { LogAPI.Debug("mxd切片失败:" + ex); MessageHelper.Show( "mxd切片失败:"+ ex); } } void btnBrowser_Click(object sender, EventArgs e) { SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.FileName = "MXD切片"; saveDialog.Filter = "kotiles文件|*.kotiles"; if (saveDialog.ShowDialog() == DialogResult.OK) { this.txtSaveFilePath.Text = saveDialog.FileName; } } void btnBrowseMxd_Click(object sender, EventArgs e) { OpenFileDialog openDialog = new OpenFileDialog(); openDialog.Filter = "mxd文件|*.mxd"; if (openDialog.ShowDialog() == DialogResult.OK) { this.txtMxdPath.Text = openDialog.FileName; if (this.axMapControl1.CheckMxFile(openDialog.FileName)) { this.axMapControl1.LoadMxFile(openDialog.FileName); } this.maxDis = GetMaxDistance(openDialog.FileName); } } private double GetMaxDistance(string filePath) { ProcessMXDClass pr = new ProcessMXDClass(); IEnvelope en = pr.GetMapEnvelope(filePath); IEnvelope extentMax = GetExtentSquare(en); return extentMax.XMax - extentMax.XMin; } /// /// 获取指定范围外正方形 /// /// /// private IEnvelope GetExtentSquare(IEnvelope e) { IEnvelope extent = new EnvelopeClass() { XMax = e.XMax, XMin = e.XMin, YMax = e.YMax, YMin = e.YMin }; double del = (extent.Width - extent.Height) / 2; if (del > 0) { extent.YMax += del; extent.YMin -= del; } else { extent.XMax -= del; extent.XMin += del; } extent.XMax += extent.Width / 8; extent.XMin -= extent.Width / 8; extent.YMax += extent.Width / 8; extent.YMin -= extent.Width / 8; return extent; } private void SetState(bool isRunning, string msg = null) { this.groupBox1.Enabled = !isRunning; this.groupBox2.Enabled = !isRunning; this.btnOk.Enabled = !isRunning; this.progressBar1.Visible = isRunning; //this.lbTips.Visible = isRunning; //this.toolStripStatusLabel3.Visible = isRunning; //this.toolStripStatusLabel2.Visible = isRunning; if (isRunning) { this.lbTips.Text = "处理中……"; } else { if (msg == null) { this.lbTips.Text = ""; } else { this.lbTips.Text = "耗时" + msg + "秒"; } } } public void LoadMxd(string mxdPath) { this.Invoke(new MethodInvoker(() => { if (this.axMapControl1.CheckMxFile(mxdPath)) { this.axMapControl1.LoadMxFile(mxdPath); } })); } public void SetMxdPath(string mxdPath) { this.txtMxdPath.Text = mxdPath; if (this.axMapControl1.CheckMxFile(mxdPath)) { this.axMapControl1.LoadMxFile(mxdPath); this.maxDis = GetMaxDistance(mxdPath); } } public string LayerName { get; set; } public void SetLayerVisble(string layerDescriptionName) { //Kingo.Mobile.Common.DataProcess.ProcessMXDClass mxdProcess = new Common.DataProcess.ProcessMXDClass(); //mxdProcess.SetMapLayerVisble(this.axMapControl1.Map, layerDescriptionName); } public void SetSavePath(string savePath) { this.txtSaveFilePath.Text = savePath; } public CutTiles CreateCutTiles(ESRI.ArcGIS.Geometry.IGeometry geometry) { cutTiles = new CutTiles(); System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Png; if (this.cboxTileFormat.Text.ToLower() == "png") { imgFormat = System.Drawing.Imaging.ImageFormat.Png; } else { imgFormat = System.Drawing.Imaging.ImageFormat.Jpeg; } try { if (geometry != null) { cutTiles.CustomArea = geometry.Envelope; cutTiles.CutType = CUTAreaType.自定义; cutTiles.CustomGeometry = geometry; this.axMapControl1.Map.ClipGeometry = geometry; this.axMapControl1.FullExtent = geometry.Envelope; this.axMapControl1.Refresh(); } else { cutTiles.CutType = CUTAreaType.全部; } List spList = Kingo.Mobile.Shape2KOTool.SpatialRefrenceStruct.GetAllData(); Kingo.Mobile.Shape2KOTool.SpatialRefrenceStruct sp = spList.Find(p => p.WKID == this.axMapControl1.SpatialReference.FactoryCode); cutTiles.Projection = sp.WKT; cutTiles.TileSize = Convert.ToInt32(this.txtPicSize.Text); cutTiles.axMap = this.axMapControl1; cutTiles.TilesDBPath = this.txtSaveFilePath.Text; cutTiles.ImgFormat = imgFormat; cutTiles.MaxLevel = 0;//Convert.ToInt32(this.txtMaxLevel.Text); cutTiles.MinLevel = Convert.ToInt32(this.txtMinLevel.Text); cutTiles.MxdPath = this.txtMxdPath.Text; cutTiles.groupBox = this.groupBox3; cutTiles.MaxScale = Convert.ToInt32(this.txtMaxScale.Text); cutTiles.MinScale = Convert.ToInt32(this.txtMinScale.SelectedItem); cutTiles.IsEncrypt = this.IsEncrypt; } catch (Exception ex) { LogAPI.Debug(ex); return null; } try { cutTiles.CreateMxdFileKOTilesThread(Convert.ToInt32(this.txtThreadNo.Text)); SetState(true); } catch (Exception ex) { LogAPI.Debug("mxd切片失败:" + ex); MessageBox.Show( "mxd切片失败:" + ex); } return cutTiles; } #region 序列化 /// 序列化 /// /// 类型 /// 对象 /// byte[] Serializer(Type type, object obj) { MemoryStream stream = new MemoryStream(); XmlSerializer xml = new XmlSerializer(type); try { //序列化对象 xml.Serialize(stream, obj); } catch (InvalidOperationException) { throw; } return stream.GetBuffer(); } object Deserialize(Type type, Stream stream) { XmlSerializer xmldes = new XmlSerializer(type); return xmldes.Deserialize(stream); } #endregion } }