• RasterDataset的OrigionalPointPixelBlock的OrigionalPoint是两个不同的概念(一个是左下角,一个是左上角)


    Create File Raster Dataset

    Description:

    This sample shows how to create a file raster dataset and populate pixel values using IPixelBlock.
    Products:

    Engine: VBA, VB6, C#, VB.NET, Java

    Platforms: Windows, Solaris, LinuxMinimum ArcGIS Release: 9.0

    How to use:
    1. Add this function to your project.
    2. Call this function from your code.
    [VBA and VB6]
              Public Function createFileRasterDataset(sDir As String, sFile As String) As IRasterDataset      

    ' This function creates a new img file in the given workspace
    ' and then assigns pixel values
    On Error GoTo er
    Dim pWs As IRasterWorkspace2
    Dim pDs As IRasterDataset
    Dim pPoint As IPoint
    Set pPoint = New Point
    pPoint.PutCoords 0, 0

    ' Create the dataset
    Set pWs = createRasterWorkspace(sDir)
    Set pDs = pWs.CreateRasterDataset(sFile, "IMAGINE Image", pPoint, _
    200, 100, 1, 1, 1, PT_UCHAR, New UnknownCoordinateSystem, True)

    Dim pRawpixel As IRawPixels
    Dim pPixelBlock As IPixelBlock3
    Dim pPnt As IPnt, pSize As IPnt
    Dim pPixelData
    Dim pBands As IRasterBandCollection
    Dim pRasterProps As IRasterProps
    Dim pCache

    ' QI for IRawPixels and IRasterProps
    Set pBands = pDs
    Set pRawpixel = pBands.Item(0)
    Set pRasterProps = pRawpixel

    ' Create pixelblock
    Set pPnt = New DblPnt
    pPnt.SetCoords 0, 0
    Set pSize = New DblPnt
    pSize.SetCoords pRasterProps.Width, pRasterProps.Height
    Set pPixelBlock = pRawpixel.CreatePixelBlock(pSize)

    ' Read pixelblock
    pRawpixel.Read pPnt, pPixelBlock

    ' Get pixeldata array
    pPixelData = pPixelBlock.PixelDataByRef(0)

    ' Loop through all the pixels and assign value
    Dim i As Long, j As Long
    For i = 0 To pRasterProps.Width - 1
    For j = 0 To pRasterProps.Height - 1
    pPixelData(i, j) = (i * j) Mod 255
    Next j
    Next i

    ' Write the pixeldata back
    Set pCache = pRawpixel.AcquireCache
    pRawpixel.Write pPnt, pPixelBlock
    pRawpixel.ReturnCache pCache

    ' Return
    Set createFileRasterDataset = pDs

    ' Clean up
    Set pWs = Nothing
    Set pDs = Nothing
    Set pPoint = Nothing
    Set pRawpixel = Nothing
    Set pPixelBlock = Nothing
    Set pPnt = Nothing
    Set pSize = Nothing
    Set pRasterProps = Nothing
    Set pBands = Nothing
    Set pCache = Nothing
    Exit Function

    er:
    MsgBox "Data creation failed: " + Err.Description

    End Function


    Public Function createRasterWorkspace(sPath As String) As IRasterWorkspace2
    ' Create RasterWorkspace

    Dim pWsFact As IWorkspaceFactory
    Set pWsFact = New RasterWorkspaceFactory

    If pWsFact.IsWorkspace(sPath) Then
    Set createRasterWorkspace = pWsFact.OpenFromFile(sPath, 0)
    End If

    Set pWsFact = Nothing

    End Function


    [C#]
              // Libraries needed to run this code:
    // ESRI.ArcGIS.Geodatabase, ESRI.ArcGIS.DataSourcesRaster, ESRI.ArcGIS.Geometry
    public IRasterDataset createFileRasterDataset(string directoryName, string fileName)
    {
    // This function creates a new img file in the given workspace
    // and then assigns pixel values
    try
    {
    IRasterDataset rasterDataset = null;
    IPoint originPoint = new PointClass();
    originPoint.PutCoords(0, 0);

    // Create the dataset
    IRasterWorkspace2 rasterWorkspace2 = null;
    rasterWorkspace2 = createRasterWorkspace(directoryName);

    rasterDataset = rasterWorkspace2.CreateRasterDataset(fileName, "IMAGINE Image", originPoint, 200, 100, 1, 1, 1, rstPixelType.PT_UCHAR, new UnknownCoordinateSystemClass(), true);

    IRawPixels rawPixels = null;
    IPixelBlock3 pixelBlock3 = null;
    IPnt pixelBlockOrigin = null;
    IPnt pixelBlockSize = null;
    IRasterBandCollection rasterBandCollection;
    IRasterProps rasterProps;

    // QI for IRawPixels and IRasterProps
    rasterBandCollection = (IRasterBandCollection) rasterDataset;
    rawPixels = (IRawPixels) rasterBandCollection.Item(0);
    rasterProps = (IRasterProps) rawPixels;

    // Create pixelblock
    pixelBlockOrigin = new DblPntClass();
    pixelBlockOrigin.SetCoords(0, 0);

    pixelBlockSize = new DblPntClass();
    pixelBlockSize.SetCoords(rasterProps.Width, rasterProps.Height);

    pixelBlock3 = (IPixelBlock3) rawPixels.CreatePixelBlock(pixelBlockSize);

    // Read pixelblock
    rawPixels.Read(pixelBlockOrigin, (IPixelBlock) pixelBlock3);

    // Get pixeldata array
    System.Array pixelData;
    pixelData = (System.Array) pixelBlock3.get_PixelDataByRef(0);

    // Loop through all the pixels and assign value
    for(int i = 0; i < rasterProps.Width; i++)
    for (int j = 0; j < rasterProps.Height; j++)
    pixelData.SetValue(Convert.ToByte((i * j) % 255), i, j);

    pixelBlock3.set_PixelData(0, (System.Object) pixelData);

    // Write the pixeldata back
    System.Object cachePointer;

    cachePointer = rawPixels.AcquireCache();

    rawPixels.Write(pixelBlockOrigin, (IPixelBlock) pixelBlock3);

    rawPixels.ReturnCache(cachePointer);

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

    public IRasterWorkspace2 createRasterWorkspace(string pathName)
    {
    // Create RasterWorkspace
    IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();

    return workspaceFactory.OpenFromFile(pathName, 0) as IRasterWorkspace2;
    }


    [VB.NET]
              ' Imports: ESRI.ArcGIS.DataSourcesRaster, ESRI.ArcGIS.Geodatabase, ESRI.ArcGIS.Geometry 

    Public Function createFileRasterDataset(ByVal directoryName As String, ByVal fileName As String) As IRasterDataset

    ' This function creates a new img file in the given workspace
    ' and then assign pixel values
    Try
    Dim rasterDataset As IRasterDataset = Nothing
    Dim originPoint As IPoint = New PointClass
    originPoint.PutCoords(0, 0)

    ' Create the dataset
    Dim rasterWorkspace2 As IRasterWorkspace2 = Nothing
    rasterWorkspace2 = createRasterWorkspace(directoryName)
    rasterDataset = rasterWorkspace2.CreateRasterDataset(fileName, "IMAGINE Image", originPoint, 200, 100, 1, 1, 1, rstPixelType.PT_UCHAR, New UnknownCoordinateSystemClass, True)

    Dim rawPixels As IRawPixels = Nothing
    Dim pixelBlock3 As IPixelBlock3 = Nothing
    Dim pixelBlockOrigin As IPnt = Nothing
    Dim pixelBlockSize As IPnt = Nothing
    Dim rasterBandCollection As IRasterBandCollection
    Dim rasterProps As IRasterProps

    ' QI for IRawPixels and IRasterProps
    rasterBandCollection = CType(rasterDataset, IRasterBandCollection)
    rawPixels = CType(rasterBandCollection.Item(0), IRawPixels)
    rasterProps = CType(rawPixels, IRasterProps)

    ' Create pixelblock
    pixelBlockOrigin = New DblPntClass
    pixelBlockOrigin.SetCoords(0, 0)

    pixelBlockSize = New DblPntClass
    pixelBlockSize.SetCoords(rasterProps.Width, rasterProps.Height)

    pixelBlock3 = CType(rawPixels.CreatePixelBlock(pixelBlockSize), IPixelBlock3)

    ' Read pixelblock
    rawPixels.Read(pixelBlockOrigin, CType(pixelBlock3, IPixelBlock))

    ' Get pixeldata array
    Dim pixelData As System.Array
    pixelData = CType(pixelBlock3.PixelDataByRef(0), System.Array)

    ' Loop through all the pixels and assign value
    Dim i As Integer
    Dim j As Integer
    For i = 0 To rasterProps.Width - 1
    For j = 0 To rasterProps.Height - 1
    pixelData.SetValue(Convert.ToByte((i * j) Mod 255), i, j)
    Next j
    Next i

    pixelBlock3.PixelData(0) = CType(pixelData, System.Object)

    ' Write the pixeldata back
    Dim cachePointer As System.Object
    cachePointer = rawPixels.AcquireCache()
    rawPixels.Write(pixelBlockOrigin, CType(pixelBlock3, IPixelBlock))
    rawPixels.ReturnCache(cachePointer)

    Return rasterDataset

    Catch ex As Exception
    System.Diagnostics.Debug.WriteLine(ex.Message)
    Return Nothing
    End Try

    End Function

    Public Function createRasterWorkspace(ByVal pathName As String) As IRasterWorkspace2

    ' Create RasterWorkspace
    Dim workspaceFactory As IWorkspaceFactory = New RasterWorkspaceFactoryClass

    Return CType(workspaceFactory.OpenFromFile(pathName, 0), IRasterWorkspace2)

    End Function

    [Java]
              
    /**
    * Description: creates a new img file in the given workspace
    * and then assign pixel values
    *
    * @param aPath
    * @param aFile
    * @return
    */

    public static IRasterDataset createFileRasterDataset(String aPath, String aFile) throws IOException{
    IPoint point = new Point();
    point.putCoords(0, 0);
    UnknownCoordinateSystem sr = new UnknownCoordinateSystem();
    /*create the dataset*/
    IRasterWorkspace2 rasWksp2 = createRasterWorkspace(aPath);
    IRasterDataset rasDS = rasWksp2.createRasterDataset(aFile, "IMAGINE Image", point, 200, 100, 1, 1, 1, rstPixelType.PT_CHAR, sr, true);
    /*QI for IRawPixels and IRasterProps*/
    IRasterBandCollection bands = new IRasterBandCollectionProxy(rasDS);
    IRawPixels rawPix = new IRawPixelsProxy(bands.item(0));
    IRasterProps rasProps = new IRasterPropsProxy(rawPix);
    /*create pixelblock*/
    IPnt pnt = new DblPnt();
    pnt.setCoords(0, 0);
    IPnt size = new DblPnt();
    size.setCoords(rasProps.getWidth(), rasProps.getHeight());
    IPixelBlock pixelBlk = rawPix.createPixelBlock(size);
    /*read pixelblock*/
    rawPix.read(pnt, pixelBlk);
    IPixelBlock3 pixelBlock = new IPixelBlock3Proxy(pixelBlk);
    int[][] pixelData = (int[][])pixelBlock.getPixelDataByRef(0);
    /*loop through all the pixels and assign value*/
    for(int i = 0; i < rasProps.getWidth() - 1; i++){
    for(int j = 0; j < rasProps.getHeight() - 1; i++){
    pixelData[i][j] = (i * j) % 255;
    }
    }
    /*write the pixeldata back*/
    Object cache = rawPix.acquireCache();
    rawPix.write(pnt, new IPixelBlockProxy(pixelBlock));
    rawPix.returnCache(cache);

    return rasDS;
    }


    Feedback Send feedback on this sample
  • 相关阅读:
    汉诺塔问题
    两个有序链表序列的合并
    数列求和
    求集合数据的均方差
    [NOIP2014] 提高组 洛谷P1328 生活大爆炸版石头剪刀布
    [NOIP2014] 普及组
    洛谷P1726 上白泽慧音
    洛谷P1808 单词分类
    洛谷P1889 士兵站队
    洛谷P1288 取数游戏II
  • 原文地址:https://www.cnblogs.com/zhangjun1130/p/1676540.html
Copyright © 2020-2023  润新知