zoukankan      html  css  js  c++  java
  • 视图数据集为镶嵌数据集批量创建快视图

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

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

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

        视图和数据集

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

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

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

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

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

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

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

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

        

    private void btnCreate_Click(object sender, EventArgs e)
            {
                if (txtGdbPath.Text.Trim() == "" || Directory.Exists(txtGdbPath.Text) == false ||
                    txtPreviewPath.Text.Trim() == "" || Directory.Exists(txtPreviewPath.Text) == false)
                {
                    MessageBox.Show("请选择准确的空间数据库和快视图目录!");
                    return;
                }
    
                txtLog.Text += "开始:详细进度信息将写入日志文件。\r\n";
                long start = DateTime.Now.Ticks;
                LogHelper.AddMessage(string.Format("{0} 开始执行快视图生成操作...", DateTime.Now.ToLongTimeString()));
                //打开镶嵌数据集
                IMosaicDataset md = GdbHelper.OpenMosaicDataset(_workspace, cmbDatasets.SelectedItem.ToString());
                if (md == null)
                {
                    txtLog.Text += "错误:未获得到镶嵌数据集,请查看日志懂得详细信息。\r\n";
                    return;
                }
    
                short quality = (short)numQuality.Value;
                int dpi = (int)numDpi.Value;
                //批量创立快视图
                GdbHelper.CreatePreview(md, _activeView, cmbDatasets.SelectedItem.ToString(), txtPreviewPath.Text, quality, dpi);
    
                long end = DateTime.Now.Ticks;
                int totalTime = (int)((end - start) / TimeSpan.TicksPerSecond);
                LogHelper.AddMessage(string.Format("{0} 快视图生成操作完成,共计用时{1}秒。", DateTime.Now.ToLongTimeString(), totalTime));
    
                LogHelper.WriteToLogFile();
                txtLog.Text += "完成:请查看日志懂得详细信息。";
            }

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

        

        每日一道理
    这浓浓的母爱使我深深地认识到:即使你是一只矫健的雄鹰,也永远飞不出母爱的长空;即使你是一条扬帆行驶的快船,也永远驶不出母爱的长河!在人生的路上不管我们已走过多远,还要走多远,我们都要经过母亲精心营造的那座桥!
    public static void CreatePreview(IMosaicDataset mosaicDataset, IActiveView view, string mdName, string dirPreview, short quality, int outRes)
            {
                ITable pTable = GetMosaicDatasetTable(mosaicDataset);
                if (pTable == null) return;
    
                int indexName = pTable.FindField("NAME");
                int indexOID = pTable.FindField("OBJECTID");
                int indexRaster = pTable.FindField("RASTER");
    
                ICursor pCursor = pTable.Search(null, false);
                IRow pRow = pCursor.NextRow();
    
                int count = 1;
                while (pRow != null)
                {
                    string rasterName = Convert.ToString(pRow.get_Value(indexName));
                    string oid = Convert.ToString(pRow.get_Value(indexOID));
                    string picName = string.Format("{0}_{1}.jpg", mdName, oid);
                    picName = System.IO.Path.Combine(dirPreview, picName);
    
                    LogHelper.AddMessage(string.Format("正在创立第 {0} 个快视图:{1}...", count, picName));
    
                    if (File.Exists(picName))
                    {
                        LogHelper.AddMessage(string.Format("{0} 已存在,跳过...", picName));
                    }
                    else                    
                    {
                        try
                        {
                            IRasterCatalogItem pRasterCatalogItem = (IRasterCatalogItem)pRow;
                            IRasterDataset pRasterdataset = pRasterCatalogItem.RasterDataset;
    
                            IRasterLayer pRasterlayer = new RasterLayerClass();
                            pRasterlayer.CreateFromDataset(pRasterdataset);
    
                            IRaster pRaster = pRasterlayer.Raster;
                            IRasterProps pRasterpro = pRaster as IRasterProps;
    
                            if (view.FocusMap.LayerCount > 0)
                            {
                                view.FocusMap.ClearLayers();
                            }
                            view.FocusMap.AddLayer(pRasterlayer as ILayer);
    
                            IArea pArea = pRasterpro.Extent.Envelope as IArea;
                            view.FullExtent = pRasterpro.Extent;
                            view.FullExtent.CenterAt(pArea.Centroid);
                            view.Refresh();
                            view.FocusMap.RecalcFullExtent();
    
                            ExportActiveView(view, picName, pRasterpro.Extent, quality, outRes);
                        }
                        catch (Exception ex)
                        {
                            LogHelper.AddMessage(string.Format("为 {0} 创立快视图失败:", ex.Message));
                        }
                    }
    
                    pRow = pCursor.NextRow();
                    count++;
    
                    if (count % 100 == 0)
                    {
                        LogHelper.WriteToLogFile();
                        GC.Collect();//如不清算内存,将导致内存占用过大,x64系统到达3.8G阁下程序无响应
                    }
                }
    
                Marshal.ReleaseComObject(pCursor);
    
                view.Clear();
            }

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

        

    private static void ExportActiveView(ESRI.ArcGIS.Carto.IActiveView pActiveView, System.String picName, IEnvelope pEn, short quality, int outRes)
            {
                if (pActiveView == null || !(picName.EndsWith(".jpg"))) return;
    
                ESRI.ArcGIS.Output.IExport export = new ESRI.ArcGIS.Output.ExportJPEGClass();
                export.ExportFileName = picName;
                export.Resolution = outRes;//输出分辨率,即DPI,默认96
    
                IExportJPEG pEXG = export as IExportJPEG;
                pEXG.Quality = quality;//图片品质,0~100,100表示不压缩
    
                tagRECT exportRECT; // This is a structure
                exportRECT.right = pActiveView.ExportFrame.right;
                exportRECT.bottom = pActiveView.ExportFrame.bottom;
                exportRECT = pActiveView.ExportFrame;
    
                IDisplayTransformation pDisplayTransformation = pActiveView.ScreenDisplay.DisplayTransformation;
                pDisplayTransformation.TransformRect(pEn, ref exportRECT, 8);
    
                exportRECT.left = 0;
                exportRECT.top = 0;
    
                //isc
                //Set up the PixelBounds envelope to match the exportRECT
                ESRI.ArcGIS.Geometry.IEnvelope envelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();
                envelope.PutCoords(exportRECT.left, exportRECT.top, exportRECT.right, exportRECT.bottom);
                export.PixelBounds = envelope;
    
                System.Int32 hDC = export.StartExporting();
    
                pActiveView.Output(hDC, (System.Int16)export.Resolution, ref exportRECT, pEn, null); // Explicit Cast and 'ref' keyword needed 
                export.FinishExporting();
                export.Cleanup();
                pActiveView.Clear();
    
                Marshal.ReleaseComObject(pEXG);
                Marshal.ReleaseComObject(export);
    
                pEXG = null;
                export = null;
            }

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

        

    文章结束给大家分享下程序员的一些笑话语录: 火车
    一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现 列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面是一个老奶 奶和一个年轻漂亮的姑娘。两个上前坐了下来。程序员和那个姑娘他们比较 暧昧地相互看对方。这时,火车进入山洞,车厢里一片漆黑。此时,只听见 一个亲嘴的声音,随后就听到一个响亮的巴掌声。很快火车出了山洞,他们 四个人都不说话。
    那个老奶奶在喃喃道, “这个年轻小伙怎么这么无礼, 不过我很高兴我的孙女 扇了一个巴掌”。
    项目经理在想,“没想到这个程序员居然这么大胆,敢去亲那姑娘,只可惜那 姑娘打错了人,居然给打了我。”
    漂亮的姑娘想,“他亲了我真好,希望我的祖母没有打疼他”。
    程序员坐在那里露出了笑容, “生活真好啊。 这一辈子能有几次机会可以在亲 一个美女的同时打项目经理一巴掌啊”

  • 相关阅读:
    IOS -- 获取本地图片和网络图片的大小size
    xib中的label加边框
    iOS开发之Masonry框架源码深度解析
    10分钟搭建 App 主流框架
    卸载服务器GitLab
    linux安装git方法
    虚拟机安装centos7, 再安装gitlab 简单步骤
    collectionView 防止cell复用的方法
    UIButton 设置图片文字垂直居中排列
    button获取验证码60秒倒计时 直接用
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3084534.html
Copyright © 2011-2022 走看看