FAQ
ArcObjectsでラスタレイヤのピクセル値をテキストファイルに書き出す方法

ナレッジ番号:5486 | 登録日:2023/07/27 | 更新日:2024/12/02

【概要】

VBAコードを使用して、マルチバンド ラスタ レイヤの各バンドの各ピクセルの値をテキスト ファイルに書き出す方法について解説します。テキスト ファイルはC:\Tempフォルダに配置されます。

注:ラスタ イメージのバンド数や解像度によっては、処理の完了に時間を要することがあります。


【プロシージャ】
  1. ArcMapを起動します。

  2. 新規のUIButtonControlを追加します。

    A. カスタマイズダイアログボックスを表示するため、[ツール] > [カスタマイズ] を選択します。
    B. コマンドタブをクリックします。
    C. カテゴリリストボックスからUIControlsを選択します。
    D. ドロップダウンリストでボタンを、Untitleのこのマップドキュメントに保存するのか、
    すべてのマップドキュメントで使用できるようにNormalに保存するのか選択します。
    E. New UIControlをクリックします。
    F. UIButtonControlを選択し作成します。
    G. 選択したツールバーに新規のUIButtonControlをドラック&ドロップで追加します。
    H. カスタマイズダイアログを閉じます。

    ※ UIControlを作る詳細な情報は、ArcGIS Desktop Helpの「How to create custom commands with VBA」をみてください。

  3. UIButtonControlを右クリックし、ソースの表示を選択します。
            
  4. UIButtonControlのクリックイベントに、以下のコードを追加します。


    
    'メモ:
    
    '次のサンプル コードは最上位のレイヤ(ラスタの最初のバンド)のピクセル値をテキスト ファイルに書き出します。

    Dim pMxDoc As IMxDocument
    Set pMxDoc = ThisDocument
    Dim pLayer As ILayer
    Set pLayer = pMxDoc.FocusMap.Layer(0)

    ' ラスタレイヤであるかどうかチェックします。
    If TypeOf pLayer Is IRasterLayer Then
    Dim pRasterLayer As IRasterLayer
    Set pRasterLayer = pLayer
    Dim pRaster As IRaster
    Set pRaster = pRasterLayer.Raster
    Dim pRasterBandCol As IRasterBandCollection
    Set pRasterBandCol = pRaster
    Dim pRawpixel As IRawPixels

    Dim pRasterProps As IRasterProps
    Dim pPnt As IPnt
    Dim pSize As IPnt
    Dim pPixelBlock As IPixelBlock3
    Dim pPixelData
    Dim lPixelValue As Long
    Dim sTxtFile As String
    Dim objFSO
    Dim objTextStream
    sTxtFile = "C:\temp\" & pRasterLayer.Name & ".txt"

    'レイヤ名をファイル名としてテキスト ファイルを作成します。
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile sTxtFile, True

    'テキスト ファイルを開きます。
    Set objTextStream = objFSO.OpenTextFile(sTxtFile, 2, True)
    Dim h As Integer, i As Long, j As Long

    For h = 0 To pRasterBandCol.Count - 1

    Set pRawpixel = pRasterBandCol.Item(h)
    Set pRasterProps = pRawpixel
    Set pPnt = New DblPnt
    pPnt.SetCoords 0, 0
    Set pSize = New DblPnt
    pSize.SetCoords pRasterProps.Width, pRasterProps.Height
    Set pPixelBlock = pRawpixel.CreatePixelBlock(pSize)

    ' ピクセル ブロックを読み込みます。
    pRawpixel.Read pPnt, pPixelBlock

    ' ピクセル値の配列を取得します。
    pPixelData = pPixelBlock.PixelDataByRef(0)

    ' 各バンドのヘッダー情報を書き出します。
    objTextStream.WriteLine pRasterLayer.Name & "のバンド インデックス「" & h & "」のすべてのピクセル値"
    objTextStream.WriteLine "(X, Y) = ピクセル値"
    objTextStream.WriteLine ""

    '各ピクセルの値をテキスト ファイルに書き出します。
    '左上の角(0, 0)から開始します。
    For i = 0 To pRasterProps.Width - 1
    For j = 0 To pRasterProps.Height - 1
    pRawpixel.Read pPnt, pPixelBlock
    lPixelValue = pPixelBlock.GetVal(0, i, j)
    objTextStream.WriteLine "(" & i & ", " & j & ") = " & lPixelValue
    Next j
    Next i

    objTextStream.WriteLine ""
    objTextStream.WriteLine "-------------------------------------------------------"

    Next h

    'ファイルを閉じ、テキスト ストリームを空にします。
    objTextStream.Close
    Set objTextStream = Nothing
    Set objFSO = Nothing
    Else
    MsgBox "最上位のレイヤはラスタレイヤではありません。" & vbNewLine & _
    "テキスト ファイルは作成されませんでした。", vbExclamation, "エラー"
    Exit Sub
    End If
  5. コードを実行します。

■関連情報

メタデータ

種類

機能

製品