В этой статье мы узнаем, как загружать и обрабатывать данные спутниковых снимков с помощью Python

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

Ожидание

В этом рассказе мы обсудим, как получить доступ к этим изображениям и какие инструменты необходимы для обработки этих данных изображений. Мы будем говорить о Sentinel-2, но решение применимо и для Landsat, и для некоторых других спутников.

Данные Sentinel-2 (Sentinel-2A и Sentinel-2B) обеспечивают мультиспектральные изображения с пространственным разрешением 10 метров с интервалом обращения 5 дней. Эти данные доступны в сервисе хранения файлов Amazon Web Services (AWS) — S3 — бесплатно.

Требования:

Python с установленным Gdal

Учетные данные AWS должны быть настроены, так как мы будем использовать корзину s3 для получения необходимых данных. - "ссылка"

Настройте учетные данные AWS либо с помощью терминала, либо в Boto3. Решите, что желаемая область интереса (AoI) должна быть в любом из трех форматов (широта/долгота, шейп-файл, координаты ограничительной рамки), для которых вы хотите обрабатывать спутниковые данные.

Получить фрагменты спутников для AOI:

Как только вы это сделаете, пересечите координаты AoI с шейп-файлом плиток sentinel2. Это даст вам все плитки, которые полностью покрывают область действия.

Создайте ключ S3 Sentinel-2 и получите доступ к данным:

Получив информацию о плитке и даты, для которых требуются данные, создайте ключ файла AWS S3 для всех файлов данных, доступных для этой плитки и даты.

import boto3
from botocore import UNSIGNED
from botocore.config import Config
s3 = boto3.resource('s3', config=Config(signature_version=UNSIGNED))
s3_client = boto3.client('s3')
sentinel2_tile = '43RFL'
_date = '13/02/2022 '
utm_zone, lat_band, grid_square = str(sentinel2_tile)[:2], str(sentinel2_tile)[2], str(sentinel2_tile)[3:5]
_year, _month = int(_date.split('/')[-1]), int(_date.split('/')[-2])
s3_key = os.path.join('sentinel-s2-l2a-cogs', str(utm_zone), str(lat_band), str(grid_square),
                       str(_year), str(_month), '')
response = s3_client.list_objects(Bucket='sentinel-cogs', Prefix=s3_key)
for content in response.get('Contents', []):
    key = content['Key']
    if key.endswith('.json'):
        product_id = str(key).split('/')[-2]
print(product_id)

После создания ключа вы можете либо получить доступ ко всем плиткам из ведра sentinel-cogs и скопировать их на свой локальный компьютер, либо получить доступ к изображениям онлайн с помощью Gdal.

from osgeo import gdal
ds = gdal.Open(‘/vsis3/sentinel-cogs/sentinel-s2-l2a-cogs/43/R/FL/2022/2/S2A_43RFL_20220213_0_L2A/B01.tif’)
print(ds)

Обработка изображений:

Эти изображения оптимизированы для работы в облаке, и к ним можно получить доступ «на лету». Можно выполнить дальнейшую обработку, например, сначала объединить обе плитки, преобразовав их в одну плитку, которая покрывает полную область применения, а затем отрезать из нее требуемую область области применения и, наконец, сохранить файл в растровом формате.

Неудивительно, что gdal может позаботиться об этих шагах — слиянии и отсечении — за один шаг.

raster_file_list = [‘/vsis3/sentinel-cogs/sentinel-s2-l2a-cogs/43/R/FL/2022/2/S2A_43RFL_20220213_0_L2A/B01.tif’,
‘/vsis3/sentinel-cogs/sentinel-s2-l2a-   cogs/43/R/FM/2022/2/S2A_43RFM_20220213_0_L2A/B01.tif’]
ds = gdal.BuildVRT(‘’, raster_file_list, VRTNodata=0, srcNodata=0)
gdal.Warp(‘output_file.tiff’, ds, format=’GTiff’, dstNodata=0,
 dstSRS=”+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0",
 cutlineDSName=shp_file, cropToCutline=True)

Это, наконец, вернет output.tiff в качестве требуемого выходного файла.