FAQ
参照渡しによってラスタのピクセルブロックを作成/修正することができない
ナレッジ番号:1306 | 登録日:2023/05/29 | 更新日:2024/11/21
- 【概要】
ピクセルブロックは参照渡しではなく値渡しで作成/修正する必要があります。
参照渡しの場合は処理が失敗します。
【原因】
これは既知の問題です。
【解決策】
値渡しによってピクセルブロックを作成/修正する方法を以下に示します。
この手順は以下の関連情報にある'ファイルベースのラスタデータセットを作成する'に相当します。
- ワークスペースを作成し、CreateRasterDatasetメソッドを使用してRasterDatasetを作成します。
IRasterDataset rasDS = rasWksp2.createRasterDataset(aFile, "GRID", point, 200, 100, 1, 1, 1, rstPixelType.PT_FLOAT, sr, true);
- RasterDatasetをRasterBandCollectionにキャストしてRasterBandを取得します。
IRasterBandCollection bands = new IRasterBandCollectionProxy(rasDS); IRasterBand band = bands.item(0);
- 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);
- IRawPixelに結果を書き込みます。
IPixelBlock pblock = new IPixelBlockProxy(pixelBlock);
rawPix.write(pnt, pblock);
- 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 - ワークスペースを作成し、CreateRasterDatasetメソッドを使用してRasterDatasetを作成します。
メタデータ
種類
製品