У меня возникли проблемы с отсутствием значений данных в пакете Python rasterio при применении полигональной маски к набору растровых данных. Этот конкретный растр — Landsat uint8 с 7 каналами, и значение отсутствия данных по своей сути не указано, поскольку 255 — это зарезервированное значение для отсутствия данных. Однако иногда данные uint8 сжимаются из данных uint16, и значение 255 является допустимым значением данных, которое я не хочу рассматривать как «нет данных» (данные имеют полный диапазон битов). По умолчанию функция маски rasterio считает 0 значением «нет данных», если этот аргумент не указан, что также проблематично, поскольку 0 иногда считается допустимым значением данных. Есть ли способ переопределить значение метаданных для «нет данных»?
Я пробовал несколько разных способов обойти эту проблему (подробно описано ниже), но ни один из них не увенчался успехом.
Преобразование данных uint8 в данные uint16 с помощью rasterio.open() и присвоение '256' в качестве значения отсутствия данных, поскольку оно будет находиться вне диапазона любых данных uint8, но будет принят в пределах диапазона данных uint16. Вот как некоторые программы, такие как ArcMap, иногда не присваивают значений данных.
Аналогично шагу 1, но попробовал открыть данные uint8 с помощью rasterio. open() и установив в функции nodata=np.nan. Получена ошибка: «Указанное значение nodata, nan, выходит за пределы допустимого диапазона его типа данных». Несмотря на то, что в документации nan указан как допустимая запись для аргумента nodata.
Во время процесса маски с использованием rasterio.mask() указано nodata=nan. Получена ошибка «Невозможно преобразовать fill_value nan в dtype».
import rasterio
import fiona
import numpy as np
fp_src = ''
fp_dst = ''
shape = ''
# get shapes
with fiona.open(shape, 'r') as shapefile:
geoms = [feature['geometry'] for feature in shapefile]
# Method Number 1
# ~~~~~~~~~~~~~~~~~~~~~~~~~
# open original raster, copy meta & alter dtype
with rasterio.open(fp_src) as src_dataset:
kwds = src_dataset.profile
kwds['dtype'] = 'uint16'
src_meta = src_dataset.meta
# write a new raster with the copied and altered meta
with rasterio.open(fp_dst, 'w', **kwds) as dst_dataset:
dst_meta = dst_dataset.meta
src_dataset.close()
dst_dataset.close()
img = rasterio.open(fp_dst)
# mask img and set nodata to 256 (out of the uint8 range)
out_image, out_transform = mask(img, geoms, nodata=256)
# out_image output: values outside of the geoms are 256 & values inside are 0.
# Method Number 2
# ~~~~~~~~~~~~~~~~~~~~~~~~~
# open original raster, copy meta & alter dtype
with rasterio.open(fp_src) as src_dataset:
kwds = src_dataset.profile
kwds['nodata'] = np.nan
kwds['dtype'] = 'uint16'
src_meta = src_dataset.meta
# write a new raster with the copied and altered meta
with rasterio.open(fp_dst, 'w', **kwds) as dst_dataset:
dst_meta = dst_dataset.meta
src_dataset.close()
dst_dataset.close()
img = rasterio.open(fp_dst)
# mask img and let the mask function default to the image's newly created nodata (np.nan from inside with rastario.open...)
out_image, out_transform = mask(img, geoms)
# out_image output: nodata value, nan, is beyond the valid range of its data type
# Method Number 3
# ~~~~~~~~~~~~~~~~~~~~~~~~~
# mask img and set nodata to nan
out_image, out_transform = mask(fp_src, geoms, nodata=np.nan)
# out_image output: Cannot convert fill_value nan to dtype.
Я надеюсь увидеть, что все пиксели за пределами данного полигона(ов) преобразуются в запись «нет данных», которая не обязательно является частью допустимого диапазона, чтобы не было вероятность того, что сценарий случайно воспримет допустимое значение как отсутствие данных.
У меня возникли проблемы с отсутствием значений данных в пакете Python rasterio при применении полигональной маски к набору растровых данных. Этот конкретный растр — Landsat uint8 с 7 каналами, и значение отсутствия данных по своей сути не указано, поскольку 255 — это зарезервированное значение для отсутствия данных. Однако иногда данные uint8 сжимаются из данных uint16, и значение 255 является допустимым значением данных, которое я не хочу рассматривать как «нет данных» (данные имеют полный диапазон битов). По умолчанию функция маски rasterio считает 0 значением «нет данных», если этот аргумент не указан, что также проблематично, поскольку 0 иногда считается допустимым значением данных. Есть ли способ переопределить значение метаданных для «нет данных»?
Я пробовал несколько разных способов обойти эту проблему (подробно описано ниже), но ни один из них не увенчался успехом.
[list] [*]Преобразование данных uint8 в данные uint16 с помощью rasterio.open() и присвоение '256' в качестве значения отсутствия данных, поскольку оно будет находиться вне диапазона любых данных uint8, но будет принят в пределах диапазона данных uint16. Вот как некоторые программы, такие как ArcMap, иногда не присваивают значений данных. [*]Аналогично шагу 1, но попробовал открыть данные uint8 с помощью rasterio. open() и установив в функции nodata=np.nan. Получена ошибка: «Указанное значение nodata, nan, выходит за пределы допустимого диапазона его типа данных». Несмотря на то, что в документации nan указан как допустимая запись для аргумента nodata. [*]Во время процесса маски с использованием rasterio.mask() указано nodata=nan. Получена ошибка «Невозможно преобразовать fill_value nan в dtype». [/list]
[code]import rasterio import fiona import numpy as np
fp_src = '' fp_dst = '' shape = ''
# get shapes with fiona.open(shape, 'r') as shapefile: geoms = [feature['geometry'] for feature in shapefile]
# Method Number 1 # ~~~~~~~~~~~~~~~~~~~~~~~~~
# open original raster, copy meta & alter dtype with rasterio.open(fp_src) as src_dataset: kwds = src_dataset.profile kwds['dtype'] = 'uint16' src_meta = src_dataset.meta
# write a new raster with the copied and altered meta with rasterio.open(fp_dst, 'w', **kwds) as dst_dataset: dst_meta = dst_dataset.meta
src_dataset.close() dst_dataset.close()
img = rasterio.open(fp_dst)
# mask img and set nodata to 256 (out of the uint8 range) out_image, out_transform = mask(img, geoms, nodata=256) # out_image output: values outside of the geoms are 256 & values inside are 0.
# Method Number 2 # ~~~~~~~~~~~~~~~~~~~~~~~~~
# open original raster, copy meta & alter dtype with rasterio.open(fp_src) as src_dataset: kwds = src_dataset.profile kwds['nodata'] = np.nan kwds['dtype'] = 'uint16' src_meta = src_dataset.meta
# write a new raster with the copied and altered meta with rasterio.open(fp_dst, 'w', **kwds) as dst_dataset: dst_meta = dst_dataset.meta
src_dataset.close() dst_dataset.close()
img = rasterio.open(fp_dst)
# mask img and let the mask function default to the image's newly created nodata (np.nan from inside with rastario.open...) out_image, out_transform = mask(img, geoms) # out_image output: nodata value, nan, is beyond the valid range of its data type
# Method Number 3 # ~~~~~~~~~~~~~~~~~~~~~~~~~
# mask img and set nodata to nan out_image, out_transform = mask(fp_src, geoms, nodata=np.nan) # out_image output: Cannot convert fill_value nan to dtype.
[/code]
Я надеюсь увидеть, что все пиксели за пределами данного полигона(ов) преобразуются в запись «нет данных», которая не обязательно является частью допустимого диапазона, чтобы не было вероятность того, что сценарий случайно воспримет допустимое значение как отсутствие данных.
У меня были проблемы с отсутствием значений данных в пакете Python Rasterio при применении многоугольной маски на растровом наборе данных. Этот конкретный раст - Landsat Uint8 с 7 полосами, а значение NO данных не указано по своей природе, потому...
Я пытаюсь использовать Matplotlib для создания контуров давления из растрового изображения .tiff, содержащего значения давления, но я не могу получить правильный размер/положение для вывода.
Окончательным результатом должно быть изображение .png,...