FAQ
参照渡しによってラスタのピクセルブロックを作成/修正することができない

ナレッジ番号:1306 | 登録日:2023/05/29 | 更新日:2024/11/21

【概要】

ピクセルブロックは参照渡しではなく値渡しで作成/修正する必要があります。
参照渡しの場合は処理が失敗します。


【原因】

これは既知の問題です。


【解決策】

値渡しによってピクセルブロックを作成/修正する方法を以下に示します。

この手順は以下の関連情報にある'ファイルベースのラスタデータセットを作成する'に相当します。
  1. ワークスペースを作成し、CreateRasterDatasetメソッドを使用してRasterDatasetを作成します。

    IRasterDataset rasDS = rasWksp2.createRasterDataset(aFile, "GRID", point, 200, 100, 1, 1, 1, rstPixelType.PT_FLOAT, sr, true);

  2. RasterDatasetをRasterBandCollectionにキャストしてRasterBandを取得します。

    IRasterBandCollection bands = new IRasterBandCollectionProxy(rasDS); IRasterBand band = bands.item(0);

  3. RasterBandを使用してPixelBlockを作成し、値を設定します。これはIRawPixelsインタフェースへのハンドルを取得し、必要なメソッドを呼ぶことによって実現できます。

    IRawPixels rawPix = new IRawPixelsProxy(band);
    IPixelBlock pixelBlk = rawPix.createPixelBlock(size);
    IPnt pnt = new DblPnt();
    pnt.setCoords(0, 0);
    IPnt size = new DblPnt();
    IRasterProps rasProps = new IRasterPropsProxy(rawPix);
    size.setCoords(rasProps.getWidth(), rasProps.getHeight());


    /*read pixelblock*/
    rawPix.read(pnt, pixelBlk);
    IPixelBlock3 pixelBlock = new IPixelBlock3Proxy(pixelBlk);
    float[][] pixelData = (float[][])pixelBlock.getPixelData(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); j++){
       pixelData[i][j] = (float)((i * j) % 255);
      }
     }

    pixelBlock.setPixelData(0,pixelData);

  4. IRawPixelに結果を書き込みます。

    IPixelBlock pblock = new IPixelBlockProxy(pixelBlock);
    rawPix.write(pnt, pblock);

  5. Javaの場合は後処理が必要です。ラスタへのハンドルはガベージコレクションされません。そのために作成されたファイルがおかしくなる場合があります。これらのオブジェクトは以下のコードを呼ぶことによって明示的にガベージコレクションを行う必要があります。

    com.linar.jintegra.Cleaner.release(rawPix);
    com.linar.jintegra.Cleaner.release(rasProps);
    com.linar.jintegra.Cleaner.release(band);
    com.linar.jintegra.Cleaner.release(bands);
    com.linar.jintegra.Cleaner.release(rasDS);
    return rasDS;

■関連情報

・ファイルベースのラスタデータセットを作成する


■備考
プラットフォーム          N/A
ESRI Art. Number        28812

メタデータ

種類

製品