Экспорт многополосного GeoTIFF в маске Earthpy с Rasterio привел к оригинальному файлу без маски - PullRequest
1 голос
/ 05 марта 2020

В настоящее время я хотел замаскировать сложенный файл Landsat 8 GeoTIFF с полосой Pixel QA, чтобы удалить облака и тени облаков. До сих пор я успешно следовал уроку здесь и правильно нарисовал замаскированную сцену, используя комбинацию EarthPy и Rasterio. Результирующая замаскированная сцена представляет собой NumPy замаскированный массив.

Однако, когда я пытаюсь экспортировать чистый массив как файл GeoTIFF (clean.tif), результирующий файл содержит исходную сцену вместо файла замаскированной сцены , Ниже приведен код, который у меня есть:

from rasterio.plot import plotting_extent
import rasterio as rio
import earthpy.plot as ep
import earthpy.mask as em

# Open mask file
with rio.open("mask.tif") as mask_src:
  mask = mask_src.read()
  mask_meta = mask_src.profile

# Open scene file
with rio.open("scene.tif") as scene_src:
  scene = scene_src.read()
  scene_ext = plotting_extent(scene_src)
  scene_trf = scene_src.transform
  scene_meta = scene_src.profile

# Perform masking
clean = em.mask_pixels(scene, mask)

# Print metadata for mask and scene files
print("masked scene shape => " + str(clean.shape))
print("mask meta => " + str(mask_meta))
print("scene meta => " + str(scene_meta))

# Open and write destination tif file
with rio.open("clean.tif", 'w', **scene_meta) as clean_dst:
  clean_dst.write(clean)

# Open destination tif file
with rio.open("clean.tif") as final_dst:
  final = final_dst.read()
  final_ext = plotting_extent(scene_src)

# Plot mask file
ep.plot_bands(mask)
# Plot scene file
ep.plot_rgb(scene, rgb=[4, 3, 2], extent=scene_ext, stretch=True)
# Plot masked scene
ep.plot_rgb(clean, rgb=[4, 3, 2], extent=scene_ext)
# Plot destination tif file
ep.plot_rgb(final, rgb=[4, 3, 2], extent=final_ext, stretch=True)

А вот графики файлов:

  1. файл маски:
    mask file

  2. файл сцены:
    scene file

  3. построенный в масках массив:
    plotted masked array

  4. сохраненный замаскированный массив в геотиф:
    saved masked array to geotiff

Здесь - это ссылка Dropbox на файлы и скрипт. Действительно почесал голову вокруг этого, я ценю любые указания относительно того, что случилось и как это исправить. Спасибо всем:)

1 Ответ

1 голос
/ 05 марта 2020

Исправлено, мне нужно указать значение NoData, которое берется из исходной сцены в массив маски. Вот исправленный скрипт:

from rasterio.plot import plotting_extent
import rasterio as rio
import earthpy.plot as ep
import earthpy.mask as em

# Open mask file
with rio.open("mask.tif") as mask_src:
  mask = mask_src.read()
  mask_meta = mask_src.profile

# Open scene file
with rio.open("scene.tif") as scene_src:
  scene = scene_src.read()
  scene_ext = plotting_extent(scene_src)
  scene_trf = scene_src.transform
  scene_meta = scene_src.profile
  scene_nodata = scene_src.nodata

# Perform masking
clean = em.mask_pixels(scene, mask)
clean = clean.filled(scene_nodata)

# Print metadata for mask and scene files
print("masked scene shape => " + str(clean.shape))
print("mask meta => " + str(mask_meta))
print("scene meta => " + str(scene_meta))

# Open and write destination tif file
with rio.open("clean.tif", 'w', **scene_meta) as clean_dst:
  clean_dst.write(clean)

# Open destination tif file
with rio.open("clean.tif") as final_dst:
  final = final_dst.read()
  final_ext = plotting_extent(scene_src)

# Plot mask file
ep.plot_bands(mask)
# Plot scene file
ep.plot_rgb(scene, rgb=[4, 3, 2], extent=scene_ext, stretch=True)
# Plot masked scene
ep.plot_rgb(clean, rgb=[4, 3, 2], extent=scene_ext)
# Plot destination tif file
ep.plot_rgb(final, rgb=[4, 3, 2], extent=final_ext, stretch=True)

Надеюсь, это будет полезно для людей, которые сталкиваются с той же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...