Как получить правильный масштаб массива полос в GDAL Python? - PullRequest
1 голос
/ 05 февраля 2020

Я новичок в использовании GDAL в Python, и я пытаюсь использовать его для извлечения данных о полосах из SAFE-продуктов Sentinel 2. Мне удалось извлечь массив диапазонов, но я не смог правильно его масштабировать.

Это извлекает немасштабированный массив Band 4:

import gdal

product_path = "S2B_MSIL2A_20200124T101219_N0213_R022_T33UUU_20200124T121752.SAFE"
dataset = gdal.Open(product_path + "MTD_MSIL2A.xml")
bands10m_path = dataset.GetSubDatasets()[0][0]
bands10m_dataset = gdal.Open(bands10m_path)
b4_band = bands10m_dataset.GetRasterBand(1)
b4_array = b4_band.ReadArray()

Пока все хорошо, но тип данных массива - uint16, а значения варьируются от 0 до 16896.

b4_band.GetMinimum() и b4_band.GetMaximum(), оба возвращают None.

И b4_band.GetStatistics(True,True) возвращает [0.0, 2829.0, 347.05880000000104, 334.8397839901348] (как min, max, mean, stddev).

Помогает ли это мне как-то извлечь правильную шкалу? Я не в курсе ...

1 Ответ

2 голосов
/ 06 февраля 2020

Хорошо знать, что даже если масштаб / смещение указаны в файле, GDAL не будет автоматически применять их.

В случае Sentinel 2 они указываются не в файле, а в метаданных (xml). Вы можете посмотреть файл xml, который вы используете в своем примере с текстовым редактором. И найдите «QUANTIFICATION_VALUE», как предложено @Val.

Его также можно извлечь из метаданных, проанализированных GDAL. Это можно сделать с помощью dataset.GetMetadata(), который вернет диктонар. Вы также можете вызвать утилиту gdal.Info, оба метода показаны ниже.

import gdal

archive = 'S2A_MSIL2A_20200126T082221_N0213_R121_T34HDH_20200126T110103.zip'

# Use a dataset
ds = gdal.Open(archive)
meta = ds.GetMetadata()
ds = None

# Alternatively use gdal.Info
r = gdal.Info(archive, format='json')
meta = r['metadata']['']

Вы можете отфильтровать соответствующие значения и преобразовать их из строки в число с плавающей точкой, например:

{k: float(v) for k,v in meta.items() if k.endswith('_QUANTIFICATION_VALUE')}

# Result in:
{'AOT_QUANTIFICATION_VALUE': 1000.0,
 'BOA_QUANTIFICATION_VALUE': 10000.0,
 'WVP_QUANTIFICATION_VALUE': 1000.0}
...