为镶嵌数据集批量创建快视图

镶嵌数据集(Mosaic Dataset)是ArcGIS 10.0中推出的一种全新的空间数据模型,用于管理海量影像数据。我们经常需要访问影像数据的快视图,本文将为您介绍如何批量地为镶嵌数据集创建快视图文件。

环境说明:本例采用的是File Geodatabase,即文件地理数据库来存储镶嵌数据集;使用ArcObjects开发,以ArcGIS Add-In的方式部署在ArcMap中,作为一个命令工具使用。下图是工具的界面设计:

为镶嵌数据集批量创建快视图_第1张图片

可以看到该工具实现功能需要经过几个关键步骤:

1.用户点击选择按钮,打开文件夹浏览对话框,选择File Geodatabase;

2.程序自动访问File Geodatabase,并获取其中所有的Mosaic Dataset,放到下拉框列表中供用户选择;

3.用户设置其他输出参数:快视图存储路径、DPI、图片压缩比等;

4.用户点击“开始生成”按钮,执行批量创建快视图任务;

5.程序提示当前创建内容,显示进度,完成后提示用户。

其中最为关键的是用户点击开始生成按钮后的操作,包括访问镶嵌数据集,遍历其中每一景影像数据,并为其创建快视图。

以下是点击按钮执行的代码:

[csharp]  view plain  copy
  1. private void btnCreate_Click(object sender, EventArgs e)  
  2. {  
  3.     if (txtGdbPath.Text.Trim() == "" || Directory.Exists(txtGdbPath.Text) == false ||  
  4.         txtPreviewPath.Text.Trim() == "" || Directory.Exists(txtPreviewPath.Text) == false)  
  5.     {  
  6.         MessageBox.Show("请选择正确的空间数据库和快视图目录!");  
  7.         return;  
  8.     }  
  9.   
  10.     txtLog.Text += "开始:详细进度信息将写入日志文件。\r\n";  
  11.     long start = DateTime.Now.Ticks;  
  12.     LogHelper.AddMessage(string.Format("{0} 开始执行快视图生成操作...", DateTime.Now.ToLongTimeString()));  
  13.     //打开镶嵌数据集  
  14.     IMosaicDataset md = GdbHelper.OpenMosaicDataset(_workspace, cmbDatasets.SelectedItem.ToString());  
  15.     if (md == null)  
  16.     {  
  17.         txtLog.Text += "错误:未获取到镶嵌数据集,请查看日志了解详细信息。\r\n";  
  18.         return;  
  19.     }  
  20.   
  21.     short quality = (short)numQuality.Value;  
  22.     int dpi = (int)numDpi.Value;  
  23.     //批量创建快视图  
  24.     GdbHelper.CreatePreview(md, _activeView, cmbDatasets.SelectedItem.ToString(), txtPreviewPath.Text, quality, dpi);  
  25.   
  26.     long end = DateTime.Now.Ticks;  
  27.     int totalTime = (int)((end - start) / TimeSpan.TicksPerSecond);  
  28.     LogHelper.AddMessage(string.Format("{0} 快视图生成操作完成,共计用时{1}秒。", DateTime.Now.ToLongTimeString(), totalTime));  
  29.   
  30.     LogHelper.WriteToLogFile();  
  31.     txtLog.Text += "完成:请查看日志了解详细信息。";  
  32. }  

以下是遍历镶嵌数据集的代码:

[csharp]  view plain  copy
  1. public static void CreatePreview(IMosaicDataset mosaicDataset, IActiveView view, string mdName, string dirPreview, short quality, int outRes)  
  2. {  
  3.     ITable pTable = GetMosaicDatasetTable(mosaicDataset);  
  4.     if (pTable == nullreturn;  
  5.   
  6.     int indexName = pTable.FindField("NAME");  
  7.     int indexOID = pTable.FindField("OBJECTID");  
  8.     int indexRaster = pTable.FindField("RASTER");  
  9.   
  10.     ICursor pCursor = pTable.Search(nullfalse);  
  11.     IRow pRow = pCursor.NextRow();  
  12.   
  13.     int count = 1;  
  14.     while (pRow != null)  
  15.     {  
  16.         string rasterName = Convert.ToString(pRow.get_Value(indexName));  
  17.         string oid = Convert.ToString(pRow.get_Value(indexOID));  
  18.         string picName = string.Format("{0}_{1}.jpg", mdName, oid);  
  19.         picName = System.IO.Path.Combine(dirPreview, picName);  
  20.   
  21.         LogHelper.AddMessage(string.Format("正在创建第 {0} 个快视图:{1}...", count, picName));  
  22.   
  23.         if (File.Exists(picName))  
  24.         {  
  25.             LogHelper.AddMessage(string.Format("{0} 已存在,跳过...", picName));  
  26.         }  
  27.         else                      
  28.         {  
  29.             try  
  30.             {  
  31.                 IRasterCatalogItem pRasterCatalogItem = (IRasterCatalogItem)pRow;  
  32.                 IRasterDataset pRasterdataset = pRasterCatalogItem.RasterDataset;  
  33.   
  34.                 IRasterLayer pRasterlayer = new RasterLayerClass();  
  35.                 pRasterlayer.CreateFromDataset(pRasterdataset);  
  36.   
  37.                 IRaster pRaster = pRasterlayer.Raster;  
  38.                 IRasterProps pRasterpro = pRaster as IRasterProps;  
  39.   
  40.                 if (view.FocusMap.LayerCount > 0)  
  41.                 {  
  42.                     view.FocusMap.ClearLayers();  
  43.                 }  
  44.                 view.FocusMap.AddLayer(pRasterlayer as ILayer);  
  45.   
  46.                 IArea pArea = pRasterpro.Extent.Envelope as IArea;  
  47.                 view.FullExtent = pRasterpro.Extent;  
  48.                 view.FullExtent.CenterAt(pArea.Centroid);  
  49.                 view.Refresh();  
  50.                 view.FocusMap.RecalcFullExtent();  
  51.   
  52.                 ExportActiveView(view, picName, pRasterpro.Extent, quality, outRes);  
  53.             }  
  54.             catch (Exception ex)  
  55.             {  
  56.                 LogHelper.AddMessage(string.Format("为 {0} 创建快视图失败:", ex.Message));  
  57.             }  
  58.         }  
  59.   
  60.         pRow = pCursor.NextRow();  
  61.         count++;  
  62.   
  63.         if (count % 100 == 0)  
  64.         {  
  65.             LogHelper.WriteToLogFile();  
  66.             GC.Collect();//如不清理内存,将导致内存占用过大,x64系统达到3.8G左右程序无响应  
  67.         }  
  68.     }  
  69.   
  70.     Marshal.ReleaseComObject(pCursor);  
  71.   
  72.     view.Clear();  
  73. }  

以下是创建快视图的代码:

[csharp]  view plain  copy
  1. private static void ExportActiveView(ESRI.ArcGIS.Carto.IActiveView pActiveView, System.String picName, IEnvelope pEn, short quality, int outRes)  
  2. {  
  3.     if (pActiveView == null || !(picName.EndsWith(".jpg"))) return;  
  4.   
  5.     ESRI.ArcGIS.Output.IExport export = new ESRI.ArcGIS.Output.ExportJPEGClass();  
  6.     export.ExportFileName = picName;  
  7.     export.Resolution = outRes;//输出分辨率,即DPI,默认96  
  8.   
  9.     IExportJPEG pEXG = export as IExportJPEG;  
  10.     pEXG.Quality = quality;//图片质量,0~100,100表示不压缩  
  11.   
  12.     tagRECT exportRECT; // This is a structure  
  13.     exportRECT.right = pActiveView.ExportFrame.right;  
  14.     exportRECT.bottom = pActiveView.ExportFrame.bottom;  
  15.     exportRECT = pActiveView.ExportFrame;  
  16.   
  17.     IDisplayTransformation pDisplayTransformation = pActiveView.ScreenDisplay.DisplayTransformation;  
  18.     pDisplayTransformation.TransformRect(pEn, ref exportRECT, 8);  
  19.   
  20.     exportRECT.left = 0;  
  21.     exportRECT.top = 0;  
  22.   
  23.     //isc  
  24.     //Set up the PixelBounds envelope to match the exportRECT  
  25.     ESRI.ArcGIS.Geometry.IEnvelope envelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();  
  26.     envelope.PutCoords(exportRECT.left, exportRECT.top, exportRECT.right, exportRECT.bottom);  
  27.     export.PixelBounds = envelope;  
  28.   
  29.     System.Int32 hDC = export.StartExporting();  
  30.   
  31.     pActiveView.Output(hDC, (System.Int16)export.Resolution, ref exportRECT, pEn, null); // Explicit Cast and 'ref' keyword needed   
  32.     export.FinishExporting();  
  33.     export.Cleanup();  
  34.     pActiveView.Clear();  
  35.   
  36.     Marshal.ReleaseComObject(pEXG);  
  37.     Marshal.ReleaseComObject(export);  
  38.   
  39.     pEXG = null;  
  40.     export = null;  
  41. }  

以上就是为镶嵌数据集批量创建快视图的关键代码,如需完整代码,请在评论中留下邮箱地址,若有疑问,也请在评论中提出。

你可能感兴趣的:(为镶嵌数据集批量创建快视图)