kennyQiita
@kennyQiita

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GDAL Openは成功するが、AttributeError: 'NoneType' object が発生する

解決したいこと

  • AttributeError: 'NoneType' object has no attribute 'RasterCount'を解決したい。
  • AttributeError: 'NoneType' object has no attribute 'RasterCount'の理由を知りたい

JupyterNotebookにてPythonスクリプトで以下を実行しています。gdal.Open()は成功していますが、読み込まれた画像に対しての処理を実施する際に、AttributeError: 'NoneType' object has no attribute XXXXが発生しています。
いろいろと試行錯誤してみましたが解説せず、解決策を探しています。。。

発生している問題・エラー

AttributeError                            Traceback (most recent call last)
Cell In[29], line 24
     22 # IMG_1読込
     23 ds_1 = gdal.Open(IMG_PATH_1_CUT, gdal.GA_ReadOnly)
---> 24 image_1 = np.array([ds_1.GetRasterBand(i + 1).ReadAsArray() for i in range(ds_1.RasterCount)])
     25 del ds_1 #不要メモリ解放
     27 # IMG_2読込

AttributeError: 'NoneType' object has no attribute 'RasterCount'

該当するソースコード

from osgeo import gdal
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
def cut4_geotiff(IMG_IN, IMG_OUT, minX, maxX, minY, maxY):
    gdal.Translate(IMG_OUT, IMG_IN, projWin=[minX,maxY,maxX,minY])
    return print("Extraction process was completed! : ", IMG_IN)
# ダウンロードしたファイルを指定して、切り出した上で、赤青合成を行い、PNGで表示
if __name__ == '__main__':
    # 処理対象ファイルの指定
    IMG_PATH_1 = "AS200355208498-180908_webcog.tif"
    IMG_PATH_2 = "AS201462808498-200905_webcog.tif"
    
    # AOI抽出後(切り出し後)のGeotiffの保存先の指定
    IMG_PATH_1_CUT = "AS200355208498-180908_webcog_cut.tif"
    IMG_PATH_2_CUT = "AS201462808498-200905_webcog_cut.tif"
    IMG_JPG = "out.jpeg"
    
    # AOI(切り出し部分)の四隅緯度経度指定
    minX = 141.93507323883878
    minY = 42.75282111399301
    maxX = 141.94639048725506
    maxY = 42.75848804932892
    
    # AOIの抽出処理(四隅): 切り出し処理
    cut4_geotiff(IMG_PATH_1, IMG_PATH_1_CUT, minX, maxX, minY, maxY)
    cut4_geotiff(IMG_PATH_2, IMG_PATH_2_CUT, minX, maxX, minY, maxY)
    
    # IMG_1読込
    ds_1 = gdal.Open(IMG_PATH_1_CUT, gdal.GA_ReadOnly)
    image_1 = np.array([ds_1.GetRasterBand(i + 1).ReadAsArray() for i in range(ds_1.RasterCount)])
    del ds_1 #不要メモリ解放

    # IMG_2読込
    ds_2 = gdal.Open(IMG_PATH_2_CUT, gdal.GA_ReadOnly)
    image_2 = np.array([ds_2.GetRasterBand(i + 1).ReadAsArray() for i in range(ds_2.RasterCount)])
    del ds_2 #不要メモリ解放

    # 画像間のピクセル数を揃える処理(今回は必要なし)
    x_min = min([image_1.shape[1], image_2.shape[1]]) 
    y_min = min([image_1.shape[2], image_2.shape[2]]) 
    # print("MinX : ", image_1.shape[1], image_2.shape[1])
    # print("MinY : ", image_1.shape[2], image_2.shape[2])

    # 出力用配列の準備
    image = np.zeros((x_min,y_min,3)).astype(np.uint8)
    image[:,:,0] = image_2[0, :x_min, :y_min]
    image[:,:,1] = image_1[0, :x_min, :y_min]
    image[:,:,2] = image_1[0, :x_min, :y_min]
    # print(image_1.shape, image_2.shape, image.shape)

    # 不要メモリの解放
    del image_1
    del image_2

    # 出力画像の保存
    pil_img = Image.fromarray(image)
    # print(pil_img.mode)
    pil_img.save(IMG_JPG)

    print("DONE!")

自分で試したこと

  1. gdal.Open()した画像を単純にprint()すると、Noneと表示されました。
    image.png
    結果:
    image.png

  2. 単純にもともとの画像をgdal.open()した場合は、読み込んだ画像に対して正常に処理ができました。
    image.png

その他

cut4_geotiff関数は成功している(エラーなし)のように思えますが、切り出された画像ファイルはNotebookのフォルダでは確認できませんでした。
image.png

こちらに記載されている内容を模倣しています。
https://sorabatake.jp/25931/

0

No Answers yet.

Your answer might help someone💌