Как сохранить файл GeoTIFF в Python?

#python #numpy #geotiff

#питон #тупица #геотиф

Вопрос:

Я пытаюсь рассчитать dNBR определенной области, используя Landsat 8 на python, и сохранить результат в виде геотифа, чтобы я мог использовать его в QGIS.

Следуя другим учебным пособиям, расчет dNBR работает нормально, но я изо всех сил пытаюсь сохранить эту переменную (dnbr_landsat) в качестве геотифа. Он создает геотиф, но когда я просматриваю его в QGIS, он полностью черный, без значений, как будто ему на самом деле не был присвоен массив, и в консоли я получаю следующую ошибку в строке 103. «Ошибка атрибута: объект «Полоса» не имеет атрибута»writeArray»»

 os.chdir("C:/Users/my_name/Landsat_08")  # Stack the Landsat 8 bands # This creates a numpy array with each "layer" representing a single band landsat_prefire_path = glob(  "LC08_L1TP_095086_20141221_20200910_02_T1/LC08_L1TP_095086_20141221_20200910_02_T1*.tif" )  prefire_bands = landsat_prefire_path  # We handle the connections with "with" with rasterio.open(prefire_bands[4]) as src:  prefire_b5 = src.read(1)   with rasterio.open(prefire_bands[6]) as src:  prefire_b7 = src.read(1)   # Allow division by zero np.seterr(divide='ignore', invalid='ignore')  # Calculate NDVI prefire_nbr = (prefire_b5.astype(float) - prefire_b7.astype(float)) / (prefire_b5   prefire_b7)  # Take a spatial subset of the ndvi layer produced ndvi_sub = prefire_nbr[2000:3000, 2000:3000]  # Plot plt.imshow(ndvi_sub) plt.show()  landsat_postfire_path = glob("LC08_L1TP_095086_20150106_20200910_02_T1/LC08_L1TP_095086_20150106_20200910_02_T1*.tif")  data = gdal.Open("C:/Users/my_name/Landsat_08/LC08_L1TP_095086_20150106_20200910_02_T1/LC08_L1TP_095086_20150106_20200910_02_T1_b5.tif") band = data.GetRasterBand(1) arr = band.ReadAsArray()  [cols, rows] = arr.shape  postfire_bands = landsat_postfire_path  with rasterio.open(postfire_bands[4]) as src:  postfire_b5 = src.read(1)   with rasterio.open(postfire_bands[6]) as src:  postfire_b7 = src.read(1)  # Allow division by zero np.seterr(divide='ignore', invalid='ignore')  # Calculate NDVI postfire_nbr = (postfire_b5.astype(float) - postfire_b7.astype(float)) / (postfire_b5   postfire_b7)  # Take a spatial subset of the ndvi layer produced ndvi_sub = postfire_nbr[2000:3000, 2000:3000]  # Plot plt.imshow(ndvi_sub) plt.show()  dnbr_landsat = prefire_nbr - postfire_nbr   # Define dNBR classification bins dnbr_class_bins = [-np.inf, -.1, .1, .27, .66, np.inf]  #dnbr_landsat_class = np.digitize(dnbr_landsat, dnbr_class_bins)  dnbr_landsat_class = xr.apply_ufunc(np.digitize,  dnbr_landsat,  dnbr_class_bins) plt.imshow(dnbr_landsat_class) plt.show()  gt = data.GetGeoTransform() proj = data.GetProjection()  driver = gdal.GetDriverByName('GTiff') dataset = driver.Create("dNBR_Landsat2.tif", rows, cols, 1, gdal.GDT_UInt16) dataset.SetGeoTransform(gt) dataset.SetProjection(proj)  tif_data = dataset.GetRasterBand(1) tif_data.writeArray(dnbr_landsat) tif_data.SetNoDataValue(np.nan) tif_data.FlushCache()  tif_data = None dataset = None  

Относительно новичок в Python, поэтому я уверен, что это может быть что-то простое, что я пропустил.