当前位置 博文首页 > 流浪若相惜的专栏:GP学习(十)-Mosaic raster datasets to a f

    流浪若相惜的专栏:GP学习(十)-Mosaic raster datasets to a f

    作者:[db:作者] 时间:2021-07-31 21:13

    <span style="color: rgb(255, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12.48px; line-height: 17.472px;"><strong>声明:仅做自己学习整理用,内容拷贝自ArcEngine SDK开发文档</strong></span>
    
    // Copyright 2010 ESRI
    // 
    // All rights reserved under the copyright laws of the United States
    // and applicable international laws, treaties, and conventions.
    // 
    // You may freely redistribute and use this sample code, with or
    // without modification, provided you include the original copyright
    // notice and use restrictions.
    // 
    // See the use restrictions.
    // 
    
    using System;
    using Microsoft.Win32;
    using ESRI.ArcGIS.esriSystem;
    using ESRI.ArcGIS.DataSourcesRaster;
    using ESRI.ArcGIS.Geodatabase;
    using ESRI.ArcGIS.DataManagementTools;
    using ESRI.ArcGIS.Geoprocessor;
    using ESRI.ArcGIS.Geoprocessing;
    using ESRI.ArcGIS.DataSourcesGDB;
    
    namespace CreateFileRasterMosaic
    {
        //Sample creating a file raster mosaic from rasters in a folder and its subfolders
        //Steps:
        //  1. Create an unmanaged PGDB raster catalog
        //  2. Load rasters in the input folder and its subfolders to the new raster catalog
        //  3. Create a mosaic file raster dataset from the unmanaged raster catalog
    
        class CreateFileRasterMosaic
        {
            //Local variables for data path
            //The TEMP directory will be used to create temporary raster catalog and output raster dataset
            //Remove temp.mdb in TEMP directory if it exists
            //You can substitute the paths with your data location
    
            static string inputFolder = @"C:\data";
            static string outputFolder = @"C:\Temp";
            static string outputName = "mosaic.tif";
            static string tempRasterCatalog = "temp_rc";
            static string tempPGDB = "temp.mdb";
            static string tempPGDBPath = outputFolder + "\\" + tempPGDB;
            static string tempRasterCatalogPath = tempPGDBPath + "\\" + tempRasterCatalog;
    
            static void Main(string[] args)
            {
                ESRI.ArcGIS.esriSystem.AoInitialize aoInit = null;
                try
                {
                    ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);
                    aoInit = new AoInitializeClass();
                    esriLicenseStatus licStatus = aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcView);
                    Console.WriteLine("License Checkout successful.");
                }
                catch (Exception exc)
                {
                    // If it fails at this point, shutdown the test and ignore any subsequent errors.
                    Console.WriteLine(exc.Message);
                }
    
                try
                {
                    //Create temporary unmanaged raster catalog and load all rasters
                    CreateUnmanagedRasterCatalog();
    
                    //Open raster catalog
                    IRasterWorkspaceEx rasterWorkspaceEx = (IRasterWorkspaceEx)OpenRasterPGDBWorkspace(tempPGDBPath);
                    IRasterCatalog rasterCatalog = rasterWorkspaceEx.OpenRasterCatalog(tempRasterCatalog);
    
                    //Mosaic rasters in the raster catalog
                    Mosaic(rasterCatalog);
                }
                catch (Exception exc)
                {
                    Console.WriteLine(exc.Message);
                }
    
                Console.Write("Please press any key to close the application.");
                Console.ReadKey();
    
                //Do not make any call to ArcObjects after ShutDown() call
                aoInit.Shutdown();
            }
    
            static void CreateUnmanagedRasterCatalog()
            {
                try
                {
                    //Use geoprocessing to create the geodatabase, the raster catalog, and load our directory
                    //to the raster catalog.
                    Geoprocessor geoprocessor = new Geoprocessor();
    
                    //Create personal GDB in the TEMP directory
                    CreatePersonalGDB createPersonalGDB = new CreatePersonalGDB();
                    createPersonalGDB.out_folder_path = outputFolder;
                    createPersonalGDB.out_name = tempPGDB;
    
                    geoprocessor.Execute(createPersonalGDB, null);
    
                    //Create an unmanaged raster catalog in the newly created personal GDB
                    CreateRasterCatalog createRasterCatalog = new CreateRasterCatalog();
    
                    createRasterCatalog.out_path = tempPGDBPath;
                    createRasterCatalog.out_name = tempRasterCatalog;
                    createRasterCatalog.raster_management_type = "unmanaged";
    
                    geoprocessor.Execute(createRasterCatalog, null);
    
                    //Load data into the unmanaged raster catalog
                    WorkspaceToRasterCatalog wsToRasterCatalog = new WorkspaceToRasterCatalog();
    
                    wsToRasterCatalog.in_raster_catalog = tempRasterCatalogPath;
                    wsToRasterCatalog.in_workspace = inputFolder;
                    wsToRasterCatalog.include_subdirectories = "INCLUDE_SUBDIRECTORIES";
    
                    geoprocessor.Execute(wsToRasterCatalog, null);
                }
                catch (Exception exc)
                {
                    Console.WriteLine(exc.Message);
                }
            }
    
            static void Mosaic(IRasterCatalog rasterCatalog)
            {
                try
                {
                    //Mosaics all rasters in the raster catalog to an output raster dataset
                    IMosaicRaster mosaicRaster = new MosaicRasterClass();
                    mosaicRaster.RasterCatalog = rasterCatalog;
    
                    //Set mosaicking options, you may not need to set these for your data
                    mosaicRaster.MosaicColormapMode = rstMosaicColormapMode.MM_MATCH;
                    mosaicRaster.MosaicOperatorType = rstMosaicOperatorType.MT_LAST;
    
                    //Open output workspace
                    IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
                    IWorkspace workspace = workspaceFactory.OpenFromFile(outputFolder, 0);
    
                    //Save out to a target raster dataset
                    //It can be saved to TIFF, IMG, GRID, BMP, GIF, JPEG2000, JPEG, Geodatabase, ect.
                    ISaveAs saveas = (ISaveAs)mosaicRaster;
                    saveas.SaveAs(outputName, workspace, "TIFF");
                }
                catch (Exception exc)
                {
                    Console.WriteLine(exc.Message);
                }
            }
    
            static IWorkspace OpenRasterPGDBWorkspace(string connStr)
            {
                Type t = Type.GetTypeFromProgID("esriDataSourcesGDB.AccessWorkspaceFactory");
                System.Object obj = Activator.CreateInstance(t);
                IWorkspaceFactory2 workspaceFactory = obj as IWorkspaceFactory2;
                return workspaceFactory.OpenFromFile(connStr, 0);
            }
        }
    }
    

    cs