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; using Raster2KOTiles; using OSGeo.OGR; using OSGeo.GDAL; namespace Kingo.Plugin.MakeTaskPackage.View { public delegate void CutReport(int cutCount, int allCount); public delegate void CutDown(DateTime dt, double cutTime); public delegate void SetCutFileName(string fileName); public partial class UCRasterMultCut : UserControl { public UCRasterMultCut() { InitializeComponent(); this.compressListBox.SelectedIndex = 0; } private MultRaster2MBTiles pMergeRaster = null; private double distance = 100; private EnumSaveType saveType = EnumSaveType.Level; public event CutReport ReportMess = null; public event CutDown DownTime = null; public event SetCutFileName SetFileName = null; private void btnOk_Click(object sender, EventArgs e) { } private void UnionCallBack() { this.Invoke(new MethodInvoker(() => { pMergeRaster = new MultRaster2MBTiles(); List files = new List(); int nThread = 1; try { foreach (var item in this.listBoxFileList.Items) { files.Add(item.ToString()); } if (files.Count == 0) throw new Exception("请选择文件"); System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Jpeg; if (this.cboxTileFormat.Text.ToLower() == "png") { imgFormat = System.Drawing.Imaging.ImageFormat.Png; } pMergeRaster.ImgFormat = imgFormat; pMergeRaster.Level = Convert.ToInt32(this.txtLevel.Text); pMergeRaster.TiledSize = Convert.ToInt32(this.txtPicSize.Text); ; pMergeRaster.MBTilesPath = this.txtSaveFilePath.Text; pMergeRaster.TopLayer = toplayer; pMergeRaster.SaveType = saveType; switch (this.compressListBox.Text) { case "高": pMergeRaster.CompressRate = 25; break; case "中": pMergeRaster.CompressRate = 40; break; case "低": pMergeRaster.CompressRate = 60; break; default: pMergeRaster.CompressRate = 25; break; } if (string.IsNullOrEmpty(this.txtSaveFilePath.Text)) throw new Exception("请设置保存位置"); nThread = Convert.ToInt32(this.txtThreadNo.Text); nThread = nThread <= 0 ? 1 : nThread; } catch (Exception ex) { MessageHelper.Show( "参数设置异常"+ ex); return; } DateTime dt1 = DateTime.Now; pMergeRaster.CreatDown += (s, e1) => { DateTime dt3 = DateTime.Now; if (!this.IsDisposed && !this.Disposing) { this.Invoke(new MethodInvoker(() => { if (DownTime != null) DownTime(dt3, dt3.Subtract(dt1).TotalSeconds); SetState(false, dt3.Subtract(dt1).TotalSeconds.ToString("0.0")); GC.Collect(); })); } }; pMergeRaster.Report += (s, c) => { if (!this.IsDisposed && !this.Disposing) { this.Invoke(new MethodInvoker(() => { this.lbTips.Text = string.Format("{0}/{1}", c, s); if (ReportMess != null) { //进度条控制 ReportMess(c, s); } })); } }; try { pMergeRaster.CreateMulFilesKOTiles(files, nThread); SetState(true); } catch (Exception ex) { if (DownTime != null) DownTime(DateTime.Now, 0); MessageBox.Show(ex.Message, "提示"); } })); } private void Test() { } 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.groupBox3.Enabled = !isRunning; if (isRunning) { this.lbTips.Text = "处理中……"; } else { if (msg == null) { this.lbTips.Text = ""; } else { this.lbTips.Text = "耗时" + msg + "秒"; } } } private void txtSaveFilePath_Click(object sender, EventArgs e) { } private void btnAdd_Click(object sender, EventArgs e) { try { if (this.openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { this.listBoxFileList.Items.AddRange(this.openFileDialog1.FileNames); if (SetFileName != null) { string fileName = System.IO.Path.GetFileNameWithoutExtension(this.openFileDialog1.FileNames[0]); if (fileName.Length > 6) SetFileName(fileName.Substring(0, 6)); } GetBestLevelSize(); } } catch (Exception ex) { MessageHelper.Show("增加影像文件报错:" + ex); } } private void btnDelete_Click(object sender, EventArgs e) { try { if (this.listBoxFileList.SelectedItem != null) { int index = this.listBoxFileList.SelectedIndex; this.listBoxFileList.Items.Remove(this.listBoxFileList.SelectedItem); if (this.listBoxFileList.Items.Count > index) { this.listBoxFileList.SelectedIndex = index; } else if (index != 0) { this.listBoxFileList.SelectedIndex = index - 1; } GetBestLevelSize(); } } catch (Exception ex) { MessageHelper.Show("删除影像文件报错:" + ex); } } public void SetParams(int level, int threadNum, int tileSize, string tileType) { this.txtLevel.Text = level.ToString(); this.txtPicSize.Text = tileSize.ToString(); this.txtThreadNo.Text = threadNum.ToString(); this.cboxTileFormat.SelectedIndex = tileType == "png" ? 0 : 1; } private void GetBestLevelSize() { List files = new List(); foreach (var item in this.listBoxFileList.Items) { if (System.IO.Path.GetExtension(item.ToString()) != ".kotiles") { files.Add(item.ToString()); } } if (files.Count == 0) return; //// 注册所有的驱动 //Ogr.RegisterAll(); //Gdal.AllRegister(); int level, tileSize; double resolution = MultRaster2MBTiles.GetBestLevelAndSize(files, out level, out tileSize); if (level != 0 && tileSize != 0) { this.txtLevel.Text = level.ToString(); this.txtPicSize.Text = tileSize.ToString(); this.txtResolution.Text = resolution.ToString("0.00"); } } private void UCRasterMultCut_Load(object sender, EventArgs e) { this.cboxTileFormat.SelectedIndex = 0; } private void btnBrowser_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(this.txtSaveFilePath.Text)) { string filename =System.IO.Path.GetFileName(this.txtSaveFilePath.Text); if (!string.IsNullOrEmpty(filename)) this.saveFileDialog1.FileName = filename; } if (this.saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { this.txtSaveFilePath.Text = this.saveFileDialog1.FileName; } } private void btnUp_Click(object sender, EventArgs e) { if (this.listBoxFileList.SelectedItem != null && this.listBoxFileList.SelectedIndex != 0) { object obj = this.listBoxFileList.SelectedItem; int index = this.listBoxFileList.SelectedIndex; this.listBoxFileList.Items.Remove(obj); this.listBoxFileList.Items.Insert(index - 1, obj); this.listBoxFileList.SelectedItem = obj; } } private void btnDown_Click(object sender, EventArgs e) { if (this.listBoxFileList.SelectedItem != null && this.listBoxFileList.SelectedIndex != this.listBoxFileList.Items.Count - 1) { object obj = this.listBoxFileList.SelectedItem; int index = this.listBoxFileList.SelectedIndex; this.listBoxFileList.Items.Remove(obj); this.listBoxFileList.Items.Insert(index + 1, obj); this.listBoxFileList.SelectedItem = obj; } } private void btnGetResolution_Click(object sender, EventArgs e) { List files = new List(); foreach (var item in this.listBoxFileList.Items) { files.Add(item.ToString()); } if (files.Count == 0) return; try { double resolution = MultRaster2MBTiles.GetResolution(files, Convert.ToInt32(this.txtLevel.Text), Convert.ToInt32(this.txtPicSize.Text)); this.txtResolution.Text = resolution.ToString("0.00"); } catch (Exception ex) { throw ex; //MessageBox.Show(ex.Message); } } public void SetRasterFiles(List files) { this.listBoxFileList.Items.Clear(); this.listBoxFileList.Items.AddRange(files.ToArray()); GetBestLevelSize(); } public void SetSaveFilePath(string filepath) { if (!string.IsNullOrEmpty(filepath) && filepath.EndsWith(".kotiles")) { this.txtSaveFilePath.Text = filepath; } } public void SetLayerInfos(List layerInfos) { this.listBoxVector.Items.Clear(); this.listBoxFileList.Items.AddRange(layerInfos.ToArray()); this.selectMdbLayer.Clear(); this.selectMdbLayer.AddRange(layerInfos); } public void OnFormClosing(object sender, FormClosingEventArgs e) { if (this.progressBar1.Visible) { if (MessageBox.Show("正在切片中,确定退出?", "提示", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No) { e.Cancel = true; } else { if (pMergeRaster != null) { pMergeRaster.StopCreateMulFilesKOTiles(); pMergeRaster = null; } } } } public bool IsProcessing { get { return this.progressBar1.Visible; } } private List selectMdbLayer = null; private void btnAddVector_Click(object sender, EventArgs e) { if (this.openFileDialog2.ShowDialog() == DialogResult.OK) { string[] files = this.openFileDialog2.FileNames; List mdbPaths = new List(); for (int i = 0; i < files.Length; i++) { if (System.IO.Path.GetExtension(files[i]).ToLower() == ".mdb") { mdbPaths.Add(files[i]); } else { this.listBoxVector.Items.Add(files[i]); } } if (mdbPaths.Count > 0) { //FrmSelectLayer frmSelectLayer = new FrmSelectLayer(); //frmSelectLayer.VectorPaths = mdbPaths; //frmSelectLayer.Owner = this.Parent as Form; //selectMdbLayer = new List(); //if (frmSelectLayer.ShowDialog() == DialogResult.OK) //{ // selectMdbLayer = frmSelectLayer.SelectVectorNames; // foreach (LayerInfo item in frmSelectLayer.SelectVectorNames) // { // this.listBoxVector.Items.Add(item.LayerSourcePath + "/" + item.LayerName); // } //} } } } private void btnDelVector_Click(object sender, EventArgs e) { if (this.listBoxVector.SelectedItem != null) { int index = this.listBoxVector.SelectedIndex; this.listBoxVector.Items.Remove(this.listBoxVector.SelectedItem); if (this.listBoxVector.Items.Count > index) { this.listBoxVector.SelectedIndex = index; } else if (index != 0) { this.listBoxVector.SelectedIndex = index - 1; } } } private OSGeo.OGR.Layer toplayer = null; private void UnionLayers(object obj) { toplayer = UnionVector.UnionVectorLayers(obj as List, distance); UnionCallBack(); } private TaskDescribeEntity taskParamsEntity = null; private void CreateLayer(object obj) { List geo= obj as List; toplayer = UnionVector.CreateLayer(geo, distance); OSGeo.OGR.Geometry rstGeometry = null; foreach (OSGeo.OGR.Geometry item in geo) { rstGeometry = UnionVector.UnionGeometry(rstGeometry, item); } OSGeo.OGR.Envelope envelope=new OSGeo.OGR.Envelope(); rstGeometry.GetEnvelope(envelope); CreateKotiles(taskParamsEntity, new Raster2KOTiles.Envelope() { XMax = envelope.MaxX, XMin = envelope.MinX, YMax = envelope.MaxY, YMin = envelope.MinY }); } private void CreateKotiles(TaskDescribeEntity paramsEntity, Raster2KOTiles.Envelope envelopeCut =null) { pMergeRaster = new MultRaster2MBTiles(); List files = new List(); int nThread = 1; try { foreach (var item in paramsEntity.RasterPaths) { files.Add(item); } if (files.Count == 0) throw new Exception("请选择文件"); int level, tileSize; double resolution = MultRaster2MBTiles.GetBestLevelAndSize(files, out level, out tileSize); System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Jpeg; if (paramsEntity.TileType== "png") { imgFormat = System.Drawing.Imaging.ImageFormat.Png; } pMergeRaster.ImgFormat = imgFormat; pMergeRaster.Level = paramsEntity.Level > level ? level : paramsEntity.Level; pMergeRaster.TiledSize = paramsEntity.TileSize; pMergeRaster.MBTilesPath = paramsEntity.TaskPath; pMergeRaster.TopLayer = toplayer; pMergeRaster.SaveType = EnumSaveType.Level; if (string.IsNullOrEmpty(paramsEntity.TaskPath)) throw new Exception("请设置保存位置"); nThread = paramsEntity.ThreadNum; nThread = nThread <= 0 ? 1 : nThread; } catch (Exception ex) { throw ex; } DateTime dt1 = DateTime.Now; pMergeRaster.CreatDown += (s, e1) => { DateTime dt3 = DateTime.Now; if (DownTime != null) DownTime(dt3, dt3.Subtract(dt1).TotalSeconds); GC.Collect(); }; pMergeRaster.Report += (s, c) => { if (ReportMess != null) { ReportMess(c, s); } }; try { pMergeRaster.CreateMulFilesKOTiles(files, nThread, envelopeCut); } catch (Exception ex) { if (DownTime != null) DownTime(DateTime.Now, 0); throw ex; } } #region 裁取图斑最高分辨率 public void btnCutOk_Click(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(txtSaveFilePath.Text)) { MessageHelper.Show("请选择输出路径!"); return; } saveType = EnumSaveType.Level; SetState(true); List lstVectorPaths = new List(); foreach (var item in this.listBoxVector.Items) { if (item.ToString().Contains("/")) { LayerInfo layerInfoMdb = selectMdbLayer.Find(p => p.LayerSourcePath + "/" + p.LayerName == item.ToString()); if (layerInfoMdb != null) lstVectorPaths.Add(new LayerInfo() { LayerSourcePath = layerInfoMdb.LayerSourcePath, LayerIndex = 0, LayerName = layerInfoMdb.LayerName }); } else { lstVectorPaths.Add(new LayerInfo() { LayerSourcePath = item.ToString(), LayerIndex = 0, LayerName = null }); } } if (lstVectorPaths == null || lstVectorPaths.Count <= 0) { UnionCallBack(); } else { double.TryParse(this.txtBuffer.Text, out distance); distance = distance == 0 ? 100 : distance; Thread threadUnion = new Thread(new ParameterizedThreadStart(UnionLayers)); threadUnion.Start(lstVectorPaths); } } public void CutRasterToKotiles(List geometrys,TaskDescribeEntity paramsEntity) { try { this.taskParamsEntity = paramsEntity; saveType = EnumSaveType.Level; if (geometrys == null || geometrys.Count <= 0) { CreateKotiles(taskParamsEntity); } else { distance = paramsEntity.Distance == 0 ? 100 : distance; Thread threadUnion = new Thread(new ParameterizedThreadStart(CreateLayer)); threadUnion.Start(geometrys); } } catch (Exception ex) { throw ex; } } private void UnionLayersMul(object obj) { TaskDescribeEntity taskEntity = obj as TaskDescribeEntity; toplayer = UnionVector.UnionVectorLayers(taskEntity.LayerInfos, distance); UnionCallBackMul(taskEntity); } public void CutRasterMul(TaskDescribeEntity taskEnity) { saveType = EnumSaveType.Level; if (taskEnity.LayerInfos == null || taskEnity.LayerInfos.Count <= 0) { UnionCallBackMul(taskEnity); } else { distance = taskEnity.Distance; Thread threadUnion = new Thread(new ParameterizedThreadStart(UnionLayersMul)); threadUnion.Start(taskEnity); } } private void UnionCallBackMul(TaskDescribeEntity taskEnity) { pMergeRaster = new MultRaster2MBTiles(); int nThread = 1; try { if (taskEnity.RasterPaths.Count == 0) throw new Exception("请选择文件"); System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Jpeg; if (taskEnity.TileType == "0") { imgFormat = System.Drawing.Imaging.ImageFormat.Png; } pMergeRaster.ImgFormat = imgFormat; pMergeRaster.Level = taskEnity.Level; pMergeRaster.TiledSize = taskEnity.TileSize; pMergeRaster.MBTilesPath = taskEnity.TaskPath; pMergeRaster.TopLayer = toplayer; pMergeRaster.SaveType = saveType; if (string.IsNullOrEmpty(taskEnity.TaskPath)) throw new Exception("请设置保存位置"); nThread = taskEnity.ThreadNum; nThread = nThread <= 0 ? 1 : nThread; } catch (Exception ex) { throw new Exception("参数设置异常"); } DateTime dt1 = DateTime.Now; pMergeRaster.CreatDown += (s, e1) => { DateTime dt3 = DateTime.Now; //this.Text = dt3.Subtract(dt1).TotalSeconds.ToString(); if (DownTime != null) DownTime(dt3, dt3.Subtract(dt1).TotalSeconds); GC.Collect(); }; pMergeRaster.Report += (s, c) => { if (ReportMess != null) { ReportMess(c, s); } }; try { pMergeRaster.CreateMulFilesKOTiles(taskEnity.RasterPaths, nThread); //SetState(true); } catch (Exception ex) { if (DownTime != null) DownTime(DateTime.Now, 0); throw new Exception(ex.Message); } } #endregion #region 批量切片相关信息 public void VisbleControls() { this.label4.Visible = false; this.txtSaveFilePath.Visible = false; this.btnBrowser.Visible = false; this.panel2.Visible = false; } /// /// 获取栅格影像 /// private List GetRasters { get { if (this.listBoxFileList.Items == null || this.listBoxFileList.Items.Count <= 0) return null; List rasterLst = new List(); for (int i = 0; i < this.listBoxFileList.Items.Count; i++) { rasterLst.Add(this.listBoxFileList.Items[i].ToString()); } return rasterLst; } } /// /// 获取矢量 /// private List GetVector { get { List lstVectorPaths = new List(); foreach (var item in this.listBoxVector.Items) { if (item.ToString().Contains("/")) { LayerInfo layerInfoMdb = selectMdbLayer.Find(p => p.LayerSourcePath + "/" + p.LayerName == item.ToString()); if (layerInfoMdb != null) lstVectorPaths.Add(new LayerInfo() { LayerSourcePath = layerInfoMdb.LayerSourcePath, LayerIndex = 0, LayerName = layerInfoMdb.LayerName }); } else { lstVectorPaths.Add(new LayerInfo() { LayerSourcePath = item.ToString(), LayerIndex = 0, LayerName = null }); } } return lstVectorPaths; } } /// /// 获取切片参数 /// public TaskDescribeEntity TaskParams { get { try { TaskDescribeEntity taskParams = new TaskDescribeEntity(); double dis = 0; double.TryParse(this.txtBuffer.Text, out dis); taskParams.Distance = dis; taskParams.LayerInfos = this.GetVector; taskParams.Level = Convert.ToInt32(this.txtLevel.Text); taskParams.RasterPaths = GetRasters; taskParams.ThreadNum = Convert.ToInt32(this.txtThreadNo.Text); taskParams.TileSize = Convert.ToInt32(this.txtPicSize.Text); taskParams.TileType = this.cboxTileFormat.SelectedIndex.ToString(); return taskParams; } catch { return null; } } } public void ClearTaskParams() { this.listBoxFileList.Items.Clear(); this.listBoxVector.Items.Clear(); //this.selectMdbLayer.Clear(); } public void SetParams(TaskDescribeEntity taskEntity) { this.listBoxFileList.Items.Clear(); this.listBoxVector.Items.Clear(); if (this.selectMdbLayer != null) this.selectMdbLayer.Clear(); else this.selectMdbLayer = new List(); if (taskEntity.LayerInfos != null && taskEntity.LayerInfos.Count > 0) { this.listBoxFileList.Items.AddRange(taskEntity.LayerInfos.ToArray()); this.selectMdbLayer.AddRange(taskEntity.LayerInfos); } if (taskEntity.RasterPaths != null && taskEntity.RasterPaths.Count > 0) { this.listBoxFileList.Items.AddRange(taskEntity.RasterPaths.ToArray()); GetBestLevelSize(); } if (!string.IsNullOrEmpty(taskEntity.TaskPath) && taskEntity.TaskPath.EndsWith(".kotiles")) { this.txtSaveFilePath.Text = taskEntity.TaskPath; } this.txtLevel.Text = taskEntity.Level.ToString(); this.txtPicSize.Text = taskEntity.TileSize.ToString(); this.txtThreadNo.Text = taskEntity.ThreadNum.ToString(); this.cboxTileFormat.SelectedIndex = taskEntity.TileType == "0" ? 0 : 1; } #endregion public void Dispose() { if (pMergeRaster != null) { pMergeRaster.Dispose(); } if (this.toplayer != null) { toplayer.Dispose(); toplayer = null; } } } }