1. 程式人生 > >ArcEngine 柵格資料 總結

ArcEngine 柵格資料 總結

本文大部分內容參考AO幫助文件和ArcMap幫助文件,大家實際使用中遇到的問題也可以在本帖下方留言交流,謝謝!
歡迎瀏覽,拒絕轉載!

基礎知識

柵格資料基礎知識:傳送門

柵格資料是由一系列等間距的格網矩陣組成,用來表達完整的主題、光譜、影象資訊。
柵格資料模型分為柵格資料集(Raster dataset)、柵格目錄(Raster catalog)、鑲嵌資料集(Mosaic dataset)。他們以檔案系統、個人地理資料庫、檔案地理資料庫、企業地理資料庫為資料來源進行儲存。

柵格資料集也就是我們經常所得的jpg、tif檔案等, ArcGIS 將這些柵格資料抽象為 RasterDataset,柵格資料集就代表了磁碟中的一個檔案,它由一個或多個波段組成。在使用柵格資料集的時候,柵格資料會被轉換成 IMG 檔案儲存在資料庫中。我們可以對柵格資料集進行一些操作,如改變空間參考,建立影像金字塔等。

柵格目錄,正如其名字一樣是一個目錄,跟書的目錄相似,它記錄了一個或者多個柵格資料集,每一個柵格資料集都作為一條記錄儲存在柵格目錄中。柵格目錄對柵格資料集的管理有兩種方式,託管和非託管。託管方式的時候,柵格資料是儲存在資料庫中, 非託管的時候,柵格目錄記錄了柵格資料集的路徑,也就是柵格資料並沒有儲存在資料庫中。當我們刪除一條記錄的時候,對我們的柵格資料沒有任何影響。

鑲嵌資料集可以說是柵格資料集和柵格目錄的混合技術,它的儲存方式和柵格目錄類似,但是在使用的時候和普通的柵格資料集是一樣的,鑲嵌資料集用於管理和釋出海量多解析度,多感測器影像,對柵格資料提供了動態鑲嵌和實時處理的功能。
對檔案地理資料庫、個人地理資料庫和 ArcSDE 地理資料庫中的柵格儲存加以比較:
這裡寫圖片描述

類圖

線上地址:傳送門
本地路徑:本地路徑:如 C:\Program Files (x86)\ArcGIS\DeveloperKit10.2\Diagrams\DataSourcesRasterObjectModel.pdf

和柵格資料集有關的GP工具

這裡寫圖片描述

柵格資料介面使用示例

這裡寫圖片描述

開啟柵格資料工作空間

//Open a file geodatabase workspace as RasterWorkspace.
static IRasterWorkspaceEx OpenFGDB(string FGDBPath)
{
    //FGDBPath string example: c:\data\raster.gdb.
IWorkspaceFactory2 workspaceFactory = new FileGDBWorkspaceFactoryClass(); return (IRasterWorkspaceEx)workspaceFactory.OpenFromFile(FGDBPath, 0); } //Open an ArcSDE workspace as RasterWorkspace. static IRasterWorkspaceEx OpenSDE(string conString) { //conString example: SERVER=ais;INSTANCE=9200;VERSION=sde.DEFAULT;USER=raster;PASSWORD=raster. IWorkspaceFactory2 workspaceFactory = new SdeWorkspaceFactoryClass(); return (IRasterWorkspaceEx)workspaceFactory.OpenFromString(conString, 0); } //Open an accessed workspace as RasterWorkspace. static IRasterWorkspaceEx OpenAccess(string PGDBPath) { //FGDBPath string example: c:\data\rasters.mdb. IWorkspaceFactory2 workspaceFactory = new AccessWorkspaceFactoryClass(); return (IRasterWorkspaceEx)workspaceFactory.OpenFromFile(PGDBPath, 0); } //Open a file workspace as RasterWorkspace. static IRasterWorkspace OpenFileWorkspace(string wsPath) { //wsPath example: c:\data\rasters. IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass(); return (IRasterWorkspace)workspaceFact.OpenFromFile(wsPath, 0); }

開啟柵格資料集

IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(datasetName);
IRasterDataset rasterDataset = rasterWorkspaceEx.OpenRasterDataset(datasetName);

建立柵格資料集

  1. Creating a raster dataset(建立以檔案儲存的柵格資料集,如TIFF)
    1)Create a workspace.建立工作空間
    2)Create a TIFF file with specified width, height, pixel type, cell size, and other necessary dimensions.建立一個TIFF檔案,並指定它的寬度,高度,畫素型別、像元大小和其他必要的維度。
    3)Use the IPixelBlock and IRasterEdit interfaces to edit the pixel values.使用IPixelBlock 和 IRasterEdit 介面來編輯像元的值。
public static IRasterDataset CreateRasterDataset(string Path, string FileName)
{
    try
    {
        IRasterWorkspace2 rasterWs = OpenRasterWorkspace(Path);
        //Define the spatial reference of the raster dataset.
        ISpatialReference sr = new UnknownCoordinateSystemClass();
        //Define the origin for the raster dataset, which is the lower left corner of the raster.
        IPoint origin = new PointClass();
        origin.PutCoords(15.0, 15.0);
        //Define the dimensions of the raster dataset.
        int width = 100; //This is the width of the raster dataset.
        int height = 100; //This is the height of the raster dataset.
        double xCell = 30; //This is the cell size in x direction.
        double yCell = 30; //This is the cell size in y direction.
        int NumBand = 1; // This is the number of bands the raster dataset contains.
        //Create a raster dataset in TIFF format.
        IRasterDataset rasterDataset = rasterWs.CreateRasterDataset(FileName, "TIFF", 
            origin, width, height, xCell, yCell, NumBand, rstPixelType.PT_UCHAR, sr,
            true);

        //If you need to set NoData for some of the pixels, you need to set it on band 
        //to get the raster band.
        IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset;
        IRasterBand rasterBand;
        IRasterProps rasterProps;
        rasterBand = rasterBands.Item(0);
        rasterProps = (IRasterProps)rasterBand;
        //Set NoData if necessary. For a multiband image, a NoData value needs to be set for each band.
        rasterProps.NoDataValue = 255;
        //Create a raster from the dataset.
        IRaster raster = rasterDataset.CreateFullRaster();

        //Create a pixel block using the weight and height of the raster dataset. 
        //If the raster dataset is large, a smaller pixel block should be used. 
        //Refer to the topic "How to access pixel data using a raster cursor".
        IPnt blocksize = new PntClass();
        blocksize.SetCoords(width, height);
        IPixelBlock3 pixelblock = raster.CreatePixelBlock(blocksize)as IPixelBlock3;

        //Populate some pixel values to the pixel block.
        System.Array pixels;
        pixels = (System.Array)pixelblock.get_PixelData(0);
        for (int i = 0; i < width; i++)
            for (int j = 0; j < height; j++)
                if (i == j)
                    pixels.SetValue(Convert.ToByte(255), i, j);
                else
                    pixels.SetValue(Convert.ToByte((i * j) / 255), i, j);

        pixelblock.set_PixelData(0, (System.Array)pixels);

        //Define the location that the upper left corner of the pixel block is to write.
        IPnt upperLeft = new PntClass();
        upperLeft.SetCoords(0, 0);

        //Write the pixel block.
        IRasterEdit rasterEdit = (IRasterEdit)raster;
        rasterEdit.Write(upperLeft, (IPixelBlock)pixelblock);

        //Release rasterEdit explicitly.
        System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit);

        return rasterDataset;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}

public static IRasterWorkspace2 OpenRasterWorkspace(string PathName)
{
    //This function opens a raster workspace.
    try
    {
        IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass();
        return workspaceFact.OpenFromFile(PathName, 0)as IRasterWorkspace2;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}
  1. Creating a raster dataset in a geodatabase(建立以GDB儲存的柵格資料集,如GRID)
    1)Create a file geodatabase workspace factory.建立哥FGDB的工作工廠物件。
    2)Create a raster workspace and query IRasterWorkspaceEx.建立一個柵格工作空間物件並且轉換到IRasterWorkspaceEx物件上
    3)Define the storage and raster properties using the RasterStorageDef and RasterDef classes. 利用RasterStorageDef 和RasterDef 類定義柵格資料集的儲存和柵格屬性。
    4)Create the dataset using the CreateRasterDataset method.利用CreateRasterDataset方法建立柵格資料集。
IWorkspaceFactory wsf = new FileGDBWorkspaceFactoryClass();
IRasterWorkspaceEx ws = (IRasterWorkspaceEx)wsf.OpenFromFile(@"c:\temp\fgdb.gdb", 0);

//Define the raster storage.
IRasterStorageDef storage = new RasterStorageDefClass();
storage.Tiled = true;
storage.TileHeight = 128;
storage.TileWidth = 128;

//Define the spatial reference.
IRasterDef rasterDef = new RasterDefClass();
rasterDef.SpatialReference = new UnknownCoordinateSystemClass();

//Create data.
IRasterDataset rasterDs = ws.CreateRasterDataset("newraster", 3,
rstPixelType.PT_SHORT, storage, "sde.DEFAULT", rasterDef, null);

訪問HDF和NIFF資料的子集

一些柵格格式,如分層資料格式(HDF),可以在單個檔案中包含多個subdatasets。訪問HDF subdatasets使用IRasterDatasetJukebox介面,請參見下面的程式碼示例:

IWorkspaceFactory wsf = new FileGDBWorkspaceFactoryClass();
IRasterWorkspaceEx ws = (IRasterWorkspaceEx)wsf.OpenFromFile(@"c:\temp\fgdb.gdb", 0);

//Define the raster storage.
IRasterStorageDef storage = new RasterStorageDefClass();
storage.Tiled = true;
storage.TileHeight = 128;
storage.TileWidth = 128;

//Define the spatial reference.
IRasterDef rasterDef = new RasterDefClass();
rasterDef.SpatialReference = new UnknownCoordinateSystemClass();

//Create data.
IRasterDataset rasterDs = ws.CreateRasterDataset("newraster", 3,
rstPixelType.PT_SHORT, storage, "sde.DEFAULT", rasterDef, null);

讀取JPEG EXIF擴充套件標記資訊

public static void JPEG_EXIFtag(IRasterDataset exifDataset)
{
    //exifDataset represents a raster dataset opened from a JPEG file that has EXIF tags.
    IDataset dataset = (IDataset)exifDataset;
    //Get the EXIF tags and the associated values.
    IPropertySet propertySet = dataset.PropertySet;    
    System.Object tag_names;
    System.Object tag_values;
    propertySet.GetAllProperties(out tag_names, out tag_values);
    string[] stringNames = (string[])tag_names;
    object[] stringValues = (object[])tag_values;
    for (int i = 0; i < stringNames.Length - 1; i++)    
    {
        System.Console.WriteLine(stringNames[i]);
        System.Console.WriteLine(stringValues[i]);    
    }
}

讀取畫素資料

  • 使用光柵遊標訪問畫素資料
public static void UsingRasterCursorWithPixelBlock(IRasterDataset2 rasterDs)
{
    try
    {
        //Create a raster. 
        IRaster2 raster2 = rasterDs.CreateFullRaster()as IRaster2;
        //Create a raster cursor with a system-optimized pixel block size by passing a null.
        IRasterCursor rasterCursor = raster2.CreateCursorEx(null);
        //Use the IRasterEdit interface.
        IRasterEdit rasterEdit = raster2 as IRasterEdit;
        //Loop through each band and pixel block.
        IRasterBandCollection bands = rasterDs as IRasterBandCollection;
        IPixelBlock3 pixelblock3 = null;
        long blockwidth = 0;
        long blockheight = 0;
        System.Array pixels;
        IPnt tlc = null;
        object v;
        long bandCount = bands.Count;
        do
        {
            pixelblock3 = rasterCursor.PixelBlock as IPixelBlock3;
            blockwidth = pixelblock3.Width;
            blockheight = pixelblock3.Height;
            pixelblock3.Mask(255);
            for (int k = 0; k < bandCount; k++)
            {
                //Get the pixel array.
                pixels = (System.Array)pixelblock3.get_PixelData(k);
                for (long i = 0; i < blockwidth; i++)
                {
                    for (long j = 0; j < blockheight; j++)
                    {
                        //Get the pixel value.
                        v = pixels.GetValue(i, j);
                        //Do something with the value.
                    }
                }
                //Set the pixel array to the pixel block.
                pixelblock3.set_PixelData(k, pixels);
            }
            //Write back to the raster.
            tlc = rasterCursor.TopLeft;
            rasterEdit.Write(tlc, (IPixelBlock)pixelblock3);
        }
        while (rasterCursor.Next() == true);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}
  • 使用RawBlocks 物件訪問畫素資料
    Raster pixels can be accessed through the IRasterEdit and IPixelBlock3 interfaces. These interfaces read and edit pixels on raster objects. The RawBlocks object, new at ArcGIS 10, works with pixels on a raster band. It reads pixels using an internal tiling structure and loops through the pixel blocks without resampling.
    This topic shows how to use the RawBlocks object to manipulate raster data at a pixel level.
    概要翻譯:可以通過IRasterEdit 和 IPixelBlock3 介面訪問柵格畫素,這兩個介面會在柵格物件本身讀去和編輯柵格畫素。在ArcGIS10版本以後,提供了使用RawBlocks 物件,它在柵格波段上操作畫素,它使用一個內部瓦片結構和迴圈遍歷畫素塊(沒有重取樣)讀取畫素。這一主題展示瞭如何使用RawBlocks物件在一個畫素水平操縱柵格資料。
public static void ReadWriteRawBlocks(IRasterDataset rasDs)
{
    IRasterBandCollection rasBandCol = (IRasterBandCollection)rasDs;
    IRawBlocks rawBlocks;
    IRasterInfo rasInfo;
    IPixelBlock pb;

    // Iterate through each band of the dataset.
    for (int m = 0; m <= rasBandCol.Count - 1; m++)
    {
        // QI to IRawBlocks from IRasterBandCollection.
        rawBlocks = (IRawBlocks)rasBandCol.Item(m);
        rasInfo = rawBlocks.RasterInfo;
        // Create the pixel block.
        pb = rawBlocks.CreatePixelBlock();

        // Determine the tiling scheme for the raster dataset.

        int bStartX = (int)Math.Floor((rasInfo.Extent.Envelope.XMin -
            rasInfo.Origin.X) / (rasInfo.BlockWidth * rasInfo.CellSize.X));
        int bEndX = (int)Math.Ceiling((rasInfo.Extent.Envelope.XMax -
            rasInfo.Origin.X) / (rasInfo.BlockWidth * rasInfo.CellSize.X));
        int bStartY = (int)Math.Floor((rasInfo.Origin.Y -
            rasInfo.Extent.Envelope.YMax) / (rasInfo.BlockHeight *
            rasInfo.CellSize.Y));
        int bEndY = (int)Math.Ceiling((rasInfo.Origin.Y -
            rasInfo.Extent.Envelope.YMin) / (rasInfo.BlockHeight *
            rasInfo.CellSize.Y));

        // Iterate through the pixel blocks.
        for (int pbYcursor = startY; pbYcursor < endY; pbYcursor++)
        {
            for (int pbXcursor = startX; pbXcursor < endX; pbXcursor++)
            {
                // Get the pixel block.
                rawBlocks.ReadBlock(pbXcursor, pbYcursor, 0, pb);
                System.Array safeArray;
                // Put the pixel block into a SafeArray for manipulation.
                safeArray = (System.Array)pb.get_SafeArray(0);

                // Iterate through the pixels in the pixel block.
                for (int safeArrayHeight = 0; safeArrayHeight < pb.Height;
                    safeArrayHeight++)
                {
                    for (int safeArrayWidth = 0; safeArrayWidth < pb.Width;
                        safeArrayWidth++)
                    {
                        // Use System.Array.SetValue to write the new pixel value back into the SafeArray.
                        safeArray.SetValue(Convert.ToByte(128), safeArrayWidth,
                            safeArrayHeight);
                    }
                }
                // Set the SafeArray back to the pixel block.
                pb.set_SafeArray(0, safeArray);

                // Write the pixel block back to the dataset.
                rawBlocks.WriteBlock(pbXcursor, pbYcursor, 0, pb);
            }
        }
    }
}

建立柵格屬性表

static void BuildRasterAttributeTable(IRasterDataset rasterDataset, ITable table)
{
    //Cast to IRasterDatasetEdit2 to build a raster attribute table.
    IRasterDatasetEdit2 rasterDatasetEdit = (IRasterDatasetEdit2)rasterDataset;

    //Build a default raster attribute table with VALUE and COUNT fields.
    if (table == null)
    {
        rasterDatasetEdit.BuildAttributeTable();
    }
    else
    {
        //Assign the given table as the raster attribute table.
        rasterDatasetEdit.AlterAttributeTable(table);
    }
}

讀取柵格資料屬性(官方文件)

這裡寫圖片描述

主要用到的介面:
1) IRasterProps
2) IRasterBandCollection
3) IRasterDataset
4) IRasterPyramid3
5) IRasterBand
柵格屬性列表:
列數和行數(Columns and Rows):通過IRasterProps的Width和Height屬性獲取
波段數量(Number of Bands):通過IRasterBandCollection介面獲取(可以由IRaster物件跳轉介面到此介面)
像元大小(CellSize(X,Y)):通過IRasterProps的MeanCellSize
格式(Format):通過IRasterDataset的Format屬性獲取
源型別(Source Type):可以通過GP工具SetRasterProperties來設定。
畫素型別(Pixel Type):通過IRasterProps介面的PixelType 屬性獲取
畫素位深(Pixel Depth):根據畫素型別來判斷畫素位深
無資料值(NoData Value):通過IRasterProps 的NoDataValue屬性獲取
顏色表/色帶(Colormap):通過IRaster2介面的Colormap屬性獲取色帶
金字塔(Pyramids):通過IRasterPyramid3介面來建立、獲取、刪除金字塔(PS:用IRasterDataset介面跳轉到IRasterPyramid3介面)
壓縮(Compression):通過IRasterDataset的CompressionType屬性獲取壓縮型別
範圍(Extent):將IRasterDataset介面物件轉換成IGeoDataset物件來範圍資訊
空間參考(Spatial Reference):1)將IRasterDataset介面物件轉換成IGeoDataset物件來獲取空間參考資訊 2)通過IRasterProps 的屬性SpatialReference獲取 3)其它方法
統計(Statistics):通過IRasterBand介面的Statistics屬性獲取波段的統計資訊
波段集合:通過IRasterBandCollection 介面來新增、刪除、獲取波段。

構建金字塔

構建金字塔有兩種方式:1)利用IRasterPyramid3介面來建立金字塔 2)利用GP工具建立金字塔
示例程式碼:
1)

IRasterPyramid3 pRasterPyramid = rasterDataset as IRasterPyramid3;
if (pRasterPyramid != null && !pRasterPyramid.Present)
{
    //-1代表建立全部級別的金字塔,0代表刪除金字塔,其它代表建立對應級別的金字塔
    pRasterPyramid.BuildPyramid(-1, rstResamplingTypes.RSP_NearestNeighbor);
}

2)
這裡寫圖片描述

//如何監聽GP訊息請參考文章《ArcEngine GP筆記(持續補充中......)》
ESRI.ArcGIS.DataManagementTools.BuildPyramids buildPyramids = new ESRI.ArcGIS.DataManagementTools.BuildPyramids();
buildPyramids.in_raster_dataset = sRasterFile; //柵格資料來源
buildPyramids.resample_technique = cmbEditResample.Text; //重分類方法
buildPyramids.compression_type = cmbEditCompressType.Text; //壓縮型別
buildPyramids.compression_quality = Convert.ToInt32(txtCompressQuality.Text); //壓縮質量
IGeoProcessorResult gpResult = m_geoProcesser.Execute(buildPyramids, null);
if (gpResult.Status == ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded)
{
    //do something 
}

個人經驗:遇到資料量大的資料建立金字塔比較耗時,建議使用第二種方式GP工具建立金字塔,可以對GP工具進行監聽,實時輸出動態訊息;資料量小的時候可以使用介面,簡單快捷。個人經驗僅供參考,如有意見,請留言!

柵格資料另存

柵格資料另存有兩種方式:1)一種利用ISaveAs和ISaveAs2介面 2)利用GP工具另存
示例程式碼:
1)

ISaveAs2 pSaveAs = pSaster as ISaveAs2;
if (!pSaveAs.CanSaveAs(sFormat))
{
    XtraMessageBox.Show("不支援指定畫素型別或檔案格式的輸出", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    return ;
}
IWorkspaceFactory worksapceFactory = new RasterWorkspaceFactoryClass();
workspace = worksapceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(m_sOutputPath), 0);
IDataset dataset = pSaveAs.SaveAs(System.IO.Path.GetFileName(m_sOutputPath), workspace, sFormat);

2)
可以利用CopyRaster工具拷貝一份柵格資料實現柵格資料的另存。
個人經驗: ISaveAs 儲存Grid格式資料技巧

柵格資料裁切

柵格資料裁切有兩種方式:1)利用介面進行裁切 2)利用GP工具進行裁切
1)
①基於IEnvelope物件裁切,主要用到的介面:IRasterGeometryProc

IRasterGeometryProc pRasterGeometryProc = new RasterGeometryProcClass();
pRasterGeometryProc.Clip(pClipEnvelope,pInputRaster)

②利用 IExtractionOp2介面進行裁切,然後用ISaveAs2介面儲存裁切後的結果。程式碼連結:傳送門(這種方法不支援含孔洞的面作為裁切範圍)
③呼叫IClipFilter裁切,參考連結
④呼叫IRasterFunction裁切,參考連結

// Create the Function Arguments object.
IClipFunctionArguments rasterFunctionArguments = (IClipFunctionArguments)new
    ClipFunctionArguments();
// The input data can be of type IRasterDataset, IRasterBand, or IRaster.
rasterFunctionArguments.Raster = inputData;
// Set the parameters for the function:
// Set the clipping type (clip outside leaves the area inside the envelope untouched)
rasterFunctionArguments.ClippingType =
    esriRasterClippingType.esriRasterClippingOutside;
// Set the extents to clip to by providing a raster envelope object.
rasterFunctionArguments.ClippingGeometry = rasterEnvelope;

// Create the Raster Function object.
IRasterFunction rasterFunction = new ClipFunction();
// Create the Function Raster Dataset object.
IFunctionRasterDataset functionRasterDataset = new FunctionRasterDataset();
// Create a name object for the Function Raster Dataset.
IFunctionRasterDatasetName functionRasterDatasetName = (IFunctionRasterDatasetName)
    new FunctionRasterDatasetName();
// Specify the output file name for the new dataset (including the .afr extension at the end).
functionRasterDatasetName.FullName = @"c:\temp\Clip.afr";
functionRasterDataset.FullName = (IName)functionRasterDatasetName;
// Initialize the new Function Raster Dataset with the Raster Function and its arguments.
functionRasterDataset.Init(rasterFunction, rasterFunctionArguments);

2)
呼叫Clip工具進行裁切,程式碼略(這塊我做過基於範圍、檔案、ROI繪製圖形的裁切,不會的可以留言,我可以把示例程式碼發過去)。
這塊有幾個注意事項:
① 注意輸入資料和裁切範圍要有座標系
② 注意被裁切的資料和裁切範圍是否可以疊加上
③ 注意將裁切範圍轉換到輸入資料的座標系上去
④ 如果基於柵格檔案裁切,clipping_geometry設定為 “NONE”;如果基於向量檔案裁切,clipping_geometry設定為 “ClippingGeometry”;
⑤ 如果基於四角座標裁切,注意rectangle引數格式;如果in_template_dataset不為空字串或空物件,設定rectangle引數為“#”即可。

in_rectangle = string.Format("{0} {1} {2} {3}", pEnvelope.XMin, pEnvelope.YMin, pEnvelope.XMax, pEnvelope.YMax);

柵格資料視覺化

1.柵格資料渲染包括一下幾種:
- Raster Unique value Renderer 唯一值渲染
- Raster Classify Renderer 分類渲染
- Raster Stretch Renderer 色帶拉伸渲染
- RGB渲染,必須為多波段影像
主要用到的介面:
1) IRasterLayer
2) IRasterRenderer

這裡寫圖片描述
示例程式碼暫時略,有問題的同學可以留言。這塊想著以後有時間的話以新帖子總結,順便將色帶總結了。

2.柵格圖層的顯示效果
柵格圖層的顯示效果受亮度、對比度、透明度等因素的影響。
用到的介面:
1)ILayerEffects
2)IRasterDisplayProps

柵格資料分析

分享幾個我專案中用到的柵格分析功能的例子:
1)坡度分析

private IRaster ProduceSlopeData(DirectoryInfo demFile, string outputFolder,
  string strOutputMeasurement, double zFactor, IGeoDataset inputGeoDataset, IWorkspace pWorkspace)
{
    IRaster solpeRaster = null;
    ISurfaceOp pSurface = new RasterSurfaceOpClass();
    esriGeoAnalysisSlopeEnum enumSlope = (strOutputMeasurement == "DEGREE") ? esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopeDegrees :
        esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopePercentrise;
    IGeoDataset outSlopeDataset = pSurface.Slope(inputGeoDataset, enumSlope, zFactor);
    //輸出坡度資料
    ISaveAs pSlopeSaveAs = outSlopeDataset as ISaveAs;
    string outputSlopeName = demFile.Parent.Name.ToUpper() +"SLP";
    //string outputSlopeName = demFile.Parent.Name + "SLP.tif";

    if (System.IO.File.Exists(System.IO.Path.Combine(outputFolder, outputSlopeName)))
    {
        IRasterDataset oldRasterDataset = (pWorkspace as IRasterWorkspace).OpenRasterDataset(outputSlopeName);
        (oldRasterDataset as IDataset).Delete();
    }
    IDataset solpeDataset = pSlopeSaveAs.SaveAs(outputSlopeName, pWorkspace, "GRID");
    //IDataset solpeDataset = pSlopeSaveAs.SaveAs(outputSlopeName, pWorkspace, "TIFF");
    IRasterDataset solpeRasterDataset = solpeDataset as IRasterDataset;
    if (solpeRasterDataset != null)
    {
        solpeRaster = solpeRasterDataset.CreateDefaultRaster();
    }

    System.Runtime.InteropServices.Marshal.ReleaseComObject(outSlopeDataset);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(solpeRasterDataset);
    return solpeRaster;
}

2)坡向分析

private void ProduceAspectData(DirectoryInfo demFile, string outputFolder, IGeoDataset inputGeoDataset, IWorkspace pWorkspace)
{
    ISurfaceOp pSurface = new RasterSurfaceOpClass();
    IGeoDataset outAspectDataset = pSurface.Aspect(inputGeoDataset);
    ISaveAs pAspectSaveAs = outAspectDataset as ISaveAs;

    string outputAspectName = demFile.Parent.Name.ToUpper() + "SPD";
    //string outputAspectName = demFile.Parent.Name + "SPD.tif";
    string outputAspectFilePath = System.IO.Path.Combine(outputFolder, outputAspectName);
    if (System.IO.File.Exists(outputAspectFilePath))
    {
        IRasterDataset oldRasterDataset = (pWorkspace as IRasterWorkspace).OpenRasterDataset(outputAspectName);
        (oldRasterDataset as IDataset).Delete();
    }
    IDataset aspectDataset = pAspectSaveAs.SaveAs(outputAspectName, pWorkspace, "GRID");
    //IDataset aspectDataset = pAspectSaveAs.SaveAs(outputAspectName, pWorkspace, "TIFF");

    System.Runtime.InteropServices.Marshal.ReleaseComObject(outAspectDataset);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(aspectDataset);
}

3)重分類

private IRasterDataset ProduceSlopeZone(DirectoryInfo demFile, string outputFolder,
    IWorkspace pWorkspace, IRaster pInRaster)
{
    if (pInRaster == null)
    {
        m_richTxtBoxLog.SelectionColor = System.Drawing.Color.Red;
        m_richTxtBoxLog.AppendText("生成高程帶資料失敗!\r\n");
        return null;
    }
    IReclassOp pReclassOp = new RasterReclassOpClass();
    IGeoDataset pGeodataset = pInRaster as IGeoDataset;
    INumberRemap pNumRemap = new NumberRemapClass();
    IRasterStatistics pRasterStatistic = GetRasterStatistics(pInRaster);
    pNumRemap.MapRange(0, 2, 0);
    pNumRemap.MapRange(2, 3, 2);
    pNumRemap.MapRange(3, 5, 3);
    pNumRemap.MapRange(5, 6, 5);
    pNumRemap.MapRange(6, 8, 6);
    pNumRemap.MapRange(8, 10, 8);
    pNumRemap.MapRange(10, 15, 10);
    pNumRemap.MapRange(15, 25, 15);
    pNumRemap.MapRange(25, 35, 25);
    pNumRemap.MapRange(35, 45, 35);
    if (pRasterStatistic.Maximum > 45)
    {
        pNumRemap.MapRange(45, 90, 45);
    }
    IRemap pRemap = pNumRemap as IRemap;
    IRaster2 pOutRaster = pReclassOp.ReclassByRemap(pGeodataset, pRemap, false) as IRaster2;
    //儲存
    ISaveAs pAspectSaveAs = pOutRaster as ISaveAs;
    string outputAspectName = demFile.Parent.Name.ToUpper() + "SPZA.tif";
    if (System.IO.File.Exists(System.IO.Path.Combine(outputFolder, outputAspectName)))
    {
        IRasterDataset oldRasterDataset = (pWorkspace as IRasterWorkspace).OpenRasterDataset(outputAspectName);
        (oldRasterDataset as IDataset).Delete();
    }
    IDataset aspectDataset = pAspectSaveAs.SaveAs(outputAspectName, pWorkspace, "TIFF");
    System.Runtime.InteropServices.Marshal.ReleaseComObject(pInRaster);
    return (aspectDataset as IRasterDataset);        
}

/// <summary>
/// 獲取柵格統計
/// </summary>
/// <param name="pRaster"></param>
/// <returns></returns>
private IRasterStatistics GetRasterStatistics(IRaster pRaster)
{
    if (null == pRaster)
        return null;

    IRasterBandCollection pRBandCol = pRaster as IRasterBandCollection;
    IRasterBand pRBand = pRBandCol.Item(0);
    if (pRBand.Statistics == null)
    {
        pRBand.ComputeStatsAndHist();
    }
    return pRBand.Statistics;
}

和柵格資料相關的GP工具箱

和柵格資料有關的工具箱:3D Analyst Tools 、Data Management Tools、Spatial Analyst Tools 等工具箱。

具體內容不在此贅述,有問題的可以留言。

本文書寫參考內容:
1)官方幫助文件
2)個人專案經驗
3)參考部落格:arcengine柵格資料使用總結
4)相關文件資料:CSDN下載-》ArcEngine 柵格資料總結.ppt