public override bool Deactivate() { if (!isInSubCommand) { m_pDrawLineTrack.m_pDrawedPoints = null; m_pDrawLineTrack.m_pGeometryBag = null; m_pActiveView.Refresh(); } return(true); }
/// <summary> /// Zooms to a Location /// </summary> /// <param name="envelope"></param> private void ZoomTo(IEnvelope envelope) { try { IMxDocument mxDocument = null; ESRI.ArcGIS.Carto.IActiveView activeView = null; mxDocument = ArcMap.Application.Document as IMxDocument; activeView = (ESRI.ArcGIS.Carto.IActiveView)mxDocument.FocusMap; activeView.Extent = (IEnvelope)envelope; activeView.Refresh(); } catch (Exception ex) { ShowError(ex); } }
/// <summary> /// Pans to a Location /// </summary> /// <param name="point"></param> private void PanTo(IPoint point) { try { IMxDocument mxDocument = null; ESRI.ArcGIS.Carto.IActiveView activeView = null; IEnvelope envelope = null; mxDocument = ArcMap.Application.Document as IMxDocument; activeView = (ESRI.ArcGIS.Carto.IActiveView)mxDocument.FocusMap; envelope = activeView.Extent.Envelope; envelope.CenterAt(point.Envelope.LowerLeft); activeView.Extent = envelope; activeView.Refresh(); return; } catch (Exception ex) { ShowError(ex); } }
//开始提取 private void Deal() { IWorkspace pWorkspace = default(IWorkspace); string sDesFeatClsName = null; IFeatureClass pDesFeatCls = default(IFeatureClass); string sInfo = null; IFeatureLayer pFeatLayer = default(IFeatureLayer); IFeatureClass pFeatureCls = default(IFeatureClass); IGeometry pDomainGeometry = default(IGeometry); int ErrorCount = 0; int lFeatCount = 0; bool bIsCut = false; if (this.ChkClip.Checked) { bIsCut = true; ////是否剪切 } else { bIsCut = false; } int intChooseLayer = 0; ////印骅 20081121 获得多边形范围 int iRegion = 0; if (_featureLayerRegion != null) { IFeatureCursor featureCursor = _featureLayerRegion.FeatureClass.Search(null, true); IFeature feature = featureCursor.NextFeature(); while (feature != null) { iRegion++; if (Convert.ToBoolean(((DataGridViewCheckBoxCell)dgvRegionChoose.Rows[iRegion - 1].Cells["colChoose"]).Value)) { intChooseLayer++; IPolygon polygon = feature.Shape as IPolygon; pDomainGeometry = polygon; if (_map.LayerCount == 0) { MessageBoxEx.Show("没有加载图层或没有图层处于选中状态!请选中需要提取的图层!", "提示"); return; } int iCount = 0; IDataset pTempDataset = default(IDataset); //ploger = new WHFUtilities.clsLog(); //ploger.DBConnectionString = "Data Source=" + g_Sys.DbName + ";User ID=" + g_Sys.DbUser + " ;Password="******"当前操作层:" + pFeatLayer.Name; this.lblInfo.Text = sInfo; Application.DoEvents(); if (!string.IsNullOrEmpty(sDesFeatClsName.Trim())) { if (pFeatureCls != null) { this.lblInfo.Text = sInfo + "正在获得目标要素类,请稍候...."; lblInfo.Refresh(); Application.DoEvents(); if (sDesFeatClsName.Contains(".")) { int dotIndex = 0; dotIndex = sDesFeatClsName.IndexOf("."); sDesFeatClsName = sDesFeatClsName.Substring(dotIndex + 1, sDesFeatClsName.Length - dotIndex - 1); } //判断是否需要创建要素类 yh 15/4/09 ClsCreateFeat.CheckFeatCls(bIsCut, pFeatLayer, ref lFeatCount, pDomainGeometry); if (lFeatCount != 0) { IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace; IFields pFields = pFeatureCls.Fields; pDesFeatCls = ClsCreatAndGetDataset.CreatOrOpenFeatClsByName(ref pFeatureWorkspace, sDesFeatClsName, ref pFields, null, null); pWorkspace = (IWorkspace)pFeatureWorkspace; //pFeatureCls.Fields = pFields; } if (pDesFeatCls != null) { //如果不剪切的,则使用该方法,需要剪切,则使用选择集,分位于内部要素和位于外部要素或直接使用pfeatcls搜索二遍 //如果数据量大的话,搜索二遍的方法是不可行的 ISpatialReference pSpatialReference = null; Dictionary <string, string> pDicField = null; iCount = (int)ClsCreateFeat.OutPutFeat(ref pDesFeatCls, ref pFeatureCls, strRegionLayer[i], pDomainGeometry, bIsCut, ref pSpatialReference, pDicField, ref this.lblInfo, sInfo); IFeatureLayer showFeatureLayer = new FeatureLayer(); showFeatureLayer.FeatureClass = pDesFeatCls; ILayer showLayer = showFeatureLayer as ILayer; showLayer.Name = pDesFeatCls.AliasName; _map.AddLayer(showLayer); // 陈昉 2009-3-1 修改 修改原因 写日志 if (iCount > 0) { pTempDataset = (IDataset)pFeatureCls; //ploger.log(System.Environment.MachineName, g_Sys.User.UserID, System.DateTime.Now.ToString(), // "数据管理子系统", "WHFDataExtract", "快速提取" + pTempDataset.Name + "中" + iCount + // "个要素到" + pDesFeatCls.AliasName, "目标:" + System.IO.Path.GetFileName(pWorkspace.PathName)); } } else { ErrorCount = ErrorCount + 1; } } } } } } feature = featureCursor.NextFeature(); } this.Refresh(); Application.DoEvents(); if (ErrorCount > 0) { this.lblInfo.Text = "操作中有错误发生!"; //g_clsErrorHandle.DisplayInformation("操作中有错误发生!", false); MessageBoxEx.Show("操作中有错误发生!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } if (intChooseLayer == 0) { MessageBoxEx.Show("没有选择提取要素,请选择!", "提示"); return; } //Member member = new Member(); //member.AddLayerToMap(pWorkspace, _map); ESRI.ArcGIS.Carto.IActiveView activeView = _map as ESRI.ArcGIS.Carto.IActiveView; activeView.Refresh(); this.lblInfo.Text = "操作完成!"; MessageBoxEx.Show("操作完成!", "提示"); } }
protected override void OnClick() { // Get the min/max zoom from user input int minzoom = 0; int maxzoom = 6; Ecotrust.Form1 form1 = new Ecotrust.Form1(); if (form1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { minzoom = (int)form1.numericUpDown1.Value; maxzoom = (int)form1.numericUpDown2.Value; } else { return; //TODO } // Use the FolderBrowserDialog Class to choose export folder System.Windows.Forms.FolderBrowserDialog folderDialog = new System.Windows.Forms.FolderBrowserDialog(); folderDialog.Description = "Select output folder for map tiles..."; string exportDir = ""; if (folderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // The returned string will be the full path, filename and file-extension for the chosen shapefile. Example: "C:\test\cities.shp" exportDir = folderDialog.SelectedPath; if (exportDir == "") { return; // TODO raise error } } else { return; //TODO } ESRI.ArcGIS.ArcMapUI.IMxDocument mxDocument = ArcMap.Application.Document as ESRI.ArcGIS.ArcMapUI.IMxDocument; // Dynamic Cast ESRI.ArcGIS.Carto.IActiveView activeView = mxDocument.ActiveView; ESRI.ArcGIS.Carto.IMap map = activeView.FocusMap; ESRI.ArcGIS.Geometry.IEnvelope mapaoi = activeView.Extent; // Set up export object and tile pixel coordinates int tileSizeX = 256; int tileSizeY = 256; // set up exporter with transparent background ESRI.ArcGIS.Output.IExportPNG pngexport = new ESRI.ArcGIS.Output.ExportPNGClass(); ESRI.ArcGIS.Display.IColor tcolor = new ESRI.ArcGIS.Display.RgbColorClass(); // Warning: 254,254,254 will be set to transparent; don't use in any of map styling ((IRgbColor)tcolor).Red = 254; ((IRgbColor)tcolor).Green = 254; ((IRgbColor)tcolor).Blue = 254; ((ExportPNG)pngexport).BackgroundColor = tcolor; pngexport.TransparentColor = tcolor; ESRI.ArcGIS.Output.IExport export = (ESRI.ArcGIS.Output.IExport)pngexport; ESRI.ArcGIS.esriSystem.tagRECT exportRECT; exportRECT.left = 0; exportRECT.top = 0; exportRECT.right = tileSizeX; exportRECT.bottom = tileSizeY; ESRI.ArcGIS.Geometry.IEnvelope envelope = new ESRI.ArcGIS.Geometry.EnvelopeClass(); envelope.PutCoords(exportRECT.left, exportRECT.top, exportRECT.right, exportRECT.bottom); export.PixelBounds = envelope; map.DelayDrawing(true); // Turn off all layers for (int i = 0; i < map.LayerCount; i++) { map.get_Layer(i).Visible = false; } // Calculate total number of tiles needed GlobalMercator mercator = new GlobalMercator(); GlobalMercator.Coords tempmins; GlobalMercator.Coords tempmaxs; Double numTiles = 0; for (int tz = minzoom; tz <= maxzoom; tz++) { tempmins = mercator.MetersToTile(mapaoi.XMin, mapaoi.YMin, tz); tempmaxs = mercator.MetersToTile(mapaoi.XMax, mapaoi.YMax, tz); numTiles += ((tempmaxs.y - tempmins.y) + 1) * ((tempmaxs.x - tempmins.x) + 1); } numTiles *= map.LayerCount; ESRI.ArcGIS.esriSystem.IStatusBar statusBar = ArcMap.Application.StatusBar; statusBar.set_Message(0, "Rendering " + numTiles.ToString() + " tiles"); // Create a CancelTracker ESRI.ArcGIS.esriSystem.ITrackCancel trackCancel = new ESRI.ArcGIS.Display.CancelTrackerClass(); ESRI.ArcGIS.Framework.IProgressDialogFactory progressDialogFactory = new ESRI.ArcGIS.Framework.ProgressDialogFactoryClass(); // Set the properties of the Step Progressor System.Int32 int32_hWnd = ArcMap.Application.hWnd; ESRI.ArcGIS.esriSystem.IStepProgressor stepProgressor = progressDialogFactory.Create(trackCancel, int32_hWnd); stepProgressor.MinRange = 0; stepProgressor.MaxRange = (int)numTiles; stepProgressor.StepValue = 1; stepProgressor.Message = "Calculating " + numTiles.ToString() + " tiles"; // Create the ProgressDialog. This automatically displays the dialog ESRI.ArcGIS.Framework.IProgressDialog2 progressDialog2 = (ESRI.ArcGIS.Framework.IProgressDialog2)stepProgressor; // Explict Cast // Set the properties of the ProgressDialog progressDialog2.CancelEnabled = true; progressDialog2.Description = "Rendering " + numTiles.ToString() + " map tiles"; progressDialog2.Title = "Creating map tiles..."; progressDialog2.Animation = ESRI.ArcGIS.Framework.esriProgressAnimationTypes.esriDownloadFile; System.Boolean boolean_Continue = true; int tileCount = 0; for (int lyrnum = 0; lyrnum < map.LayerCount; lyrnum++) { // Turn on the layer of interest ESRI.ArcGIS.Carto.ILayer layer = map.get_Layer(lyrnum); layer.Visible = true; // Set extents //ESRI.ArcGIS.Geometry.IEnvelope layeraoi = layer.AreaOfInterest; ESRI.ArcGIS.Geometry.IEnvelope aoi = new ESRI.ArcGIS.Geometry.EnvelopeClass(); // Create layer directory if it doesn't exist DirectoryInfo dir = new DirectoryInfo(exportDir + "\\" + layer.Name); if (!dir.Exists) { dir.Create(); } DateTime startTime = DateTime.Now; // Loop through zoom levels, rows, cols for (int tz = minzoom; tz <= maxzoom; tz++) { GlobalMercator.Coords mins = mercator.MetersToTile(mapaoi.XMin, mapaoi.YMin, tz); GlobalMercator.Coords maxs = mercator.MetersToTile(mapaoi.XMax, mapaoi.YMax, tz); // Create zoom directory if it doesn't exist DirectoryInfo dir2 = new DirectoryInfo(dir.FullName + "\\" + tz); if (!dir2.Exists) { dir2.Create(); } for (int tx = (int)mins.x; tx <= (int)maxs.x; tx++) { // Create X directory if it doesn't exist DirectoryInfo dir3 = new DirectoryInfo(dir2.FullName + "\\" + tx); if (!dir3.Exists) { dir3.Create(); } for (int ty = (int)mins.y; ty <= (int)maxs.y; ty++) { // Flip y-axis for output tile name int invertTy = (int)((Math.Pow(2, tz) - 1) - ty); tileCount += 1; // TODO Calculate time and set new message // TimeSpan timeElapsed = TimeSpan.FromTicks(DateTime.Now.Subtract(startTime).Ticks); // * ((double)tileCount - (numTiles + 1)) / (numTiles + 1)); // double timeRemaining = (timeElapsed.TotalSeconds / (tileCount / numTiles)) - timeElapsed.TotalSeconds; //(" + ((int)timeRemaining).ToString() +" remaining)"; stepProgressor.Message = layer.Name + "\\" + tz + "\\" + tx + "\\" + invertTy + ".png (" + tileCount + " of " + numTiles + ")"; export.ExportFileName = dir3.FullName + "\\" + invertTy + ".png"; GlobalMercator.Bounds bnd = mercator.TileBounds(tx, ty, tz); aoi.PutCoords(bnd.minx, bnd.miny, bnd.maxx, bnd.maxy); aoi.SpatialReference = map.SpatialReference; // TODO aoi spatial reference == mercator? // Use FullExtent instead of Extent to make the extent independent of the activeView ratio activeView.FullExtent = aoi; // Export System.Int32 hDC = export.StartExporting(); activeView.Output(hDC, (System.Int16)export.Resolution, ref exportRECT, null, null); // Explicit Cast and 'ref' keyword needed export.FinishExporting(); export.Cleanup(); stepProgressor.Position = tileCount; //Check if the cancel button was pressed. If so, break out of row boolean_Continue = trackCancel.Continue(); if (!boolean_Continue) { break; } } //Check if the cancel button was pressed. If so, break out of col boolean_Continue = trackCancel.Continue(); if (!boolean_Continue) { break; } } //Check if the cancel button was pressed. If so, break out of layers boolean_Continue = trackCancel.Continue(); if (!boolean_Continue) { break; } // Write log using (System.IO.StreamWriter file = new System.IO.StreamWriter(exportDir + "\\log.txt", true)) { file.WriteLine(layer.Name + ", zoom " + tz + ", numtiles " + tileCount + ":" + mins.x + " " + mins.y + " " + maxs.x + " " + maxs.y); } } // Turn it off layer.Visible = false; } map.DelayDrawing(false); // Turn ON all layers for (int i = 0; i < map.LayerCount; i++) { map.get_Layer(i).Visible = true; } // restore extent activeView.FullExtent = mapaoi; activeView.Refresh(); // Done trackCancel = null; stepProgressor = null; progressDialog2.HideDialog(); progressDialog2 = null; }