Gezintiyi Atla

Harmonized Landsat Sentinel-2

AIforEarth EarthObservation ESA NASA SatelliteImagery

Kuzey Amerika için Landsat-8 ve Sentinel-2 uydularından alınan uydu fotoğrafları.

Harmonized Landsat Sentinel-2 (HLS) ürünü, Landsat için 2013’ten günümüze, Sentinel-2 için 2015’ten günümüze kadar, Landsat-8 ve Sentinel-2 uydularından 30 m çözünürlükteki ortak döşeme sistemine uyumlu hale getirilmiş verileri içerir. HLS, Ulusal Havacılık ve Uzay Dairesi (NASA) tarafından yönetilir.

Bu veri kümesi Ag-Analytics® tarafından tutulur. Ag-Analytics® aynı zamanda bir ilgi alanı (AOI) poligonu, tarih aralığı ve diğer seçenekleri kabul eden bir API sağlar ve tek MSI bantlarının işlenen görüntülerinin yanı sıra Normalleştirilmiş Fark Bitki Örtüsü İndeksi ve diğer ölçümler ile bulutta filtrelenmiş mozaikler döndürür.

Bu veri kümesi haftalık olarak güncelleştirilir.

Depolama kaynakları

Veriler Doğu ABD 2 veri merkezindeki bloblarda, aşağıdaki blob kapsayıcısı içinde depolanır:

https://hlssa.blob.core.windows.net/hls

Bu kapsayıcının içinde veriler aşağıdaki ölçütlere göre düzenlenir:

<folder>/HLS.<product>.T<tileid>.<daynum>.<version>_<subdataset>.tif

  • folder değeri Landsat için L309, Sentinel-2 için S309’dur
  • product değeri Landsat için L30, Sentinel-2 için S30’dur
  • tileid değeri Sentinel-2 döşeme sisteminden alınan dört karakterli bir döşeme kodudur
  • daynum değeri dört basamaklı yıl ve üç basamaklı gündür (001 ile 365 arasında), örn. 2019001 değeri 1 Ocak 2019 anlamına gelir
  • version her zaman v1.4’tür
  • subdataset bir alt veri kümesini gösteren iki karakterli, 1 indeksli dizedir (aşağıya bakın)

Enlem/boylamdan döşeme kimliklerine yönelik bir eşleme burada bulunabilir. “Veri erişimi” altında verilen not defteri, bu tablonun enlem/boylama göre bir döşeme kimliğini aramak için kullanıldığını gösterir. Döşeme Kimlikleri Ag-Analytics® API’si kullanılarak da bulunabilir.

Veriler aşağıdaki birincil döşemeler için sağlanır:

[‘10 U’,‘11 U’,‘12 U’,‘13 U’,‘14 U’,‘15 U’,‘16 U’,‘10 T’,‘11 T’,‘12 T’,‘13 T’,‘14 T’,‘15 T’,‘16 T’,‘17 T’,‘18 T’,‘19 T’,‘10 S’,‘11 S’,‘12 S’,‘13 S’,‘14 S’,‘15 S’,‘16 S’,‘17 S’,‘18 S’,‘12 R’,‘13 R’,‘14 R’,‘15 R’,‘16 R’,‘17 R’]

Bantlar aşağıdaki gibidir:

Bant adı OLI bant numarası MSI bant numarası L30 alt veri kümesi numarası S30 alt veri kümesi numarası
Coastal aerosol 1 1 01 01
Mavi 2 2 02 02
Yeşil 3 3 03 03
Kırmızı 4 4 04 04
Red-edge 1 5 05
Red-edge 2 6 06
Red-edge 3 7 07
NIR broad 8 08
NIR narrow 5 8A 05 09
SWIR 1 6 11 06 10
SWIR 2 7 12 07 11
Water vapor 9 12
Cirrus 9 10 08 13
Thermal infrared 1 10 09
Thermal infrared 2 11 10
QA 11 14

Örneğin, HLS.S30.T16TDL.2019206.v1.4_01.tif dosya adı https://hlssa.blob.core.windows.net/hls/S309/HLS.S30.T16TDL.2019206.v1.4_03.tif adresinde bulunur ve 2019’un 206. gününde veri kümesi bandı 03 (MSI Bandı 3, Yeşil) için döşeme 16TDL’nin (birincil döşeme 16T, alt döşeme DL) Sentinel-2 (S30) HLS verilerini temsil eder.

Ayrıca, blob kapsayıcılarını sürücü olarak bağlamanıza olanak tanıyan BlobFuse gibi HLS verilerine erişmenizi sağlamak üzere salt okunur bir SAS (paylaşılan erişim imzası) belirteci sağlıyoruz:

st=2019-08-07T14%3A54%3A43Z&se=2050-08-08T14%3A54%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=EYNJCexDl5yxb1TxNH%2FzILznc3TiAnJq%2FPvCumkuV5U%3D

Linux için bağlama yönergeleri burada bulunabilir.

HLS verileri yüzlerce terabayt kullanabileceğinden, büyük ölçekli işleme için en uygun bölge, görüntülerin depolandığı Doğu ABD 2 veri merkezidir. Çevre bilimleri uygulamaları için HLS verilerini kullanıyorsanız, işlem gereksinimlerinizi desteklemek üzere bir AI for Earth hibesine başvurmayı düşünün.

İletişim

Bu veri kümesi hakkındaki sorularınız için aiforearthdatasets@microsoft.com adresiyle iletişime geçin.

Bildirimler

MICROSOFT, AZURE AÇIK VERİ KÜMELERİNİ “OLDUĞU GİBİ” SAĞLAR. MICROSOFT, VERİ KÜMELERİNİ KULLANMANIZLA İLGİLİ AÇIK VEYA ÖRTÜLÜ HİÇBİR GARANTİ VEYA TAAHHÜTTE BULUNMAZ. YEREL KANUNLARINIZIN İZİN VERDİĞİ ÖLÇÜDE, MICROSOFT DOĞRUDAN, BAĞLI, ÖZEL, DOLAYLI, TESADÜFİ VEYA CEZA GEREKTİRENLER DE DAHİL OLMAK ÜZERE HERHANGİ BİR HASAR YA DA KAYIPLA İLGİLİ HİÇBİR SORUMLULUK KABUL ETMEZ.

Bu veri kümesi Microsoft’un kaynak verileri aldığı orijinal hükümler kapsamında sağlanır. Veri kümesi Microsoft’tan alınan verileri içerebilir.

Erişim

Şuralarda kullanılabilirKullanılması gereken durumlar
Azure Notebooks

Quickly explore the dataset with Jupyter notebooks hosted on Azure or your local machine.

Tercih ettiğiniz hizmeti seçin:

Azure Notebooks

Azure Notebooks

Paket: Dil: Python

Demo notebook for accessing HLS data on Azure

This notebook provides an example of accessing HLS (Harmonized Landsat Sentinel-2) data from blob storage on Azure, extracting image metadata using GDAL, and displaying an image using both GDAL and rasterio.

HLS data are stored in the East US 2 data center, so this notebook will run more efficiently on the Azure compute located in East US 2. You don't want to download hundreds of terabytes to your laptop! If you are using HLS data for environmental science applications, consider applying for an AI for Earth grant to support your compute requirements.

HLS data on Azure are managed by Ag-Analytics. Ag-Analytics also provides an API which allows the caller to query to perform spatial queries over the HLS archive, as well as querying for additional data such as cloud cover and Normalized Difference Vegetation Index (NDVI). Ag-Analytics also provides an API to retrieve tile IDs matching spatial queries.

Imports and environment

In [2]:
# Standard-ish packages
import requests
import json
import os
import re
import time
import tempfile
import numpy as np
import urllib
import zipfile, io
import matplotlib.pyplot as plt
import pandas as pd
from collections import defaultdict
from IPython.display import Image

# Less standard, but all of the following are pip- or conda-installable
import rasterio
from azure.storage.blob import BlockBlobService
from rasterio import plot
from osgeo import gdal,osr

# Storage locations are documented at http://aka.ms/ai4edata-hls
hls_container_name = 'hls'
hls_account_name = 'hlssa'
hls_blob_root ='https://hlssa.blob.core.windows.net/hls'

# This file is provided by NASA; it indicates the lat/lon extents of each
# hls tile.
#
# The file originally comes from:
#
# https://hls.gsfc.nasa.gov/wp-content/uploads/2016/10/S2_TilingSystem2-1.txt
#
# ...but as of 8/2019, there is a bug with the column names in the original file, so we
# access a copy with corrected column names.
hls_tile_extents_url = 'https://ai4edatasetspublicassets.blob.core.windows.net/assets/S2_TilingSystem2-1.txt?st=2019-08-23T03%3A25%3A57Z&se=2028-08-24T03%3A25%3A00Z&sp=rl&sv=2018-03-28&sr=b&sig=KHNZHIJuVG2KqwpnlsJ8truIT5saih8KrVj3f45ABKY%3D'

# Load this file into a table, where each row is:
#
# Tile ID, Xstart, Ystart, UZ, EPSG, MinLon, MaxLon, MinLon, MaxLon
print('Reading tile extents...')
s = requests.get(hls_tile_extents_url).content
hls_tile_extents = pd.read_csv(io.StringIO(s.decode('utf-8')),delimiter=r'\s+')
print('Read tile extents for {} tiles'.format(len(hls_tile_extents)))

# Read-only shared access signature (SAS) URL for the hls container
hls_sas_url = 'st=2019-08-07T14%3A54%3A43Z&se=2050-08-08T14%3A54%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=EYNJCexDl5yxb1TxNH%2FzILznc3TiAnJq%2FPvCumkuV5U%3D'

hls_blob_service = BlockBlobService(account_name=hls_account_name,sas_token=hls_sas_url)

%matplotlib inline
Reading tile extents...
Read tile extents for 56686 tiles

Functions

In [3]:
def get_hls_tile(blob_url):
    """
    Given a URL pointing to an HLS image in blob storage, load that image via GDAL
    and return both data and metadata.
    """    
    
    formatted_gdal_bloburl='/{}/{}'.format('vsicurl',blob_url)
    
    tile_open = gdal.Open(formatted_gdal_bloburl)
    data = tile_open.GetRasterBand(1)
    ndv,xsize,ysize = data.GetNoDataValue(),tile_open.RasterXSize,tile_open.RasterYSize
    
    projection = osr.SpatialReference()
    projection.ImportFromWkt(tile_open.GetProjectionRef())
    
    datatype = data.DataType
    datatype = gdal.GetDataTypeName(datatype)  
    data_array = data.ReadAsArray()

    return ndv,xsize,ysize,projection,data_array


def list_available_tiles(prefix):
    """
    List all blobs in an Azure blob container matching a prefix.  
    
    We'll use this to query tiles by location and year.
    """
    
    files = []
    generator = hls_blob_service.list_blobs(hls_container_name, prefix)
    for blob in generator:
        files.append(blob.name)
    return files

    
def lat_lon_to_hls_tile_id(lat,lon):
    """
    Get the hls tile ID for a given lat/lon coordinate pair
    """  
    
    found_matching_tile = False

    for i_row,row in hls_tile_extents.iterrows():
        found_matching_tile = lat >= row.MinLat and lat <= row.MaxLat \
        and lon >= row.MinLon and lon <= row.MaxLon
        if found_matching_tile:
            break
    
    if not found_matching_tile:
        return None
    else:
        return row.TilID

Find a tile for a given location and date

In [10]:
# Specify a location and year of interest
lat = 47.6101; lon = -122.2015 # Bellevue, WA

year = '2019'
daynum = '109'    # 1-indexed day-of-year
folder = 'S309'   # 'S309' for Sentinel, 'L309' for Landsat
product = 'S30'   # 'S30' for Sentinel, 'L30' for Landsat
year = '2019'

tile_id = lat_lon_to_hls_tile_id(lat,lon)
assert tile_id is not None, 'Invalid lat/lon'
prefix = folder + '/HLS.' + product + '.T' + tile_id + '.' + year

print('Finding files with prefix {}'.format(prefix))
matches = list_available_tiles(prefix)
assert len(matches) > 0, 'No matching tiles'

blob_name = matches[0]
print('Found {} matching tiles, using file {}'.format(len(matches),blob_name))
Finding files with prefix S309/HLS.S30.T10TET.2019
Found 1190 matching tiles, using file S309/HLS.S30.T10TET.2019001.v1.4_01.tif

...or build a tile path from components

In [17]:
lat = 47.6101; lon = -122.2015 # Bellevue, WA

year    = '2019'
daynum  = '001'   # 1-indexed day-of-year
folder  = 'S309'  # 'S309' for Sentinel, 'L309' for Landsat
product = 'S30'   # 'S30' for Sentinel, 'L30' for Landsat
band    = '01'
tile_id = '10TET' # See hls.gsfc.nasa.gov/wp-content/uploads/2016/10/S2_TilingSystem2-1.txt
version = 'v1.4'  # Currently always v1.4

blob_name = folder + '/HLS.' + product + '.T' + tile_id + '.' + year + daynum + '.' + version \
    + '_' + band + '.tif'

print('Using file {}'.format(blob_name))
Using file S309/HLS.S30.T10TET.2019001.v1.4_01.tif

Access a file (one band of one image) using GDAL's virtual file system (vsicurl)

In [18]:
gdal.SetConfigOption('GDAL_HTTP_UNSAFESSL', 'YES')
blob_url = hls_blob_root + '/' + blob_name
print('Reading tile from {}'.format(blob_url))
ndv,xsize,ysize,projection,data_array = get_hls_tile(blob_url)

print('No-data value: {}'.format(ndv))
print('\nSize: {},{}'.format(xsize,ysize))
print('\nProjection:\n{}'.format(projection))
Reading tile from https://hlssa.blob.core.windows.net/hls/S309/HLS.S30.T10TET.2019001.v1.4_01.tif
No-data value: -1000.0

Size: 3660,3660

Projection:
PROJCS["UTM Zone 10, Northern Hemisphere",
    GEOGCS["Unknown datum based upon the WGS 84 ellipsoid",
        DATUM["Not_specified_based_on_WGS_84_spheroid",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-123],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH]]

Display Sentinel image using rasterio and vsicurl

In [11]:
# Bands 2, 3, and 4 are B, G, and R in Sentinel-2 HLS images

base_url = '/vsicurl/' + hls_blob_root + '/' + blob_name
band2_url = re.sub('_(\d+).tif','_02.tif',base_url)
band3_url = re.sub('_(\d+).tif','_03.tif',base_url)
band4_url = re.sub('_(\d+).tif','_04.tif',base_url)
print('Reading bands from:\n{}\n{}\n{}'.format(band2_url,band3_url,band4_url))

band2 = rasterio.open(band2_url)
band3 = rasterio.open(band3_url)
band4 = rasterio.open(band4_url)

norm_value = 2000
image_data = []
for band in [band4,band3,band2]:
    band_array = band.read(1)
    band_array = band_array / norm_value
    image_data.append(band_array)
    band.close()

rgb = np.dstack((image_data[0],image_data[1],image_data[2]))
np.clip(rgb,0,1,rgb)
plt.imshow(rgb)
Reading bands from:
/vsicurl/https://hlssa.blob.core.windows.net/hls/S309/HLS.S30.T10TET.2019001.v1.4_02.tif
/vsicurl/https://hlssa.blob.core.windows.net/hls/S309/HLS.S30.T10TET.2019001.v1.4_03.tif
/vsicurl/https://hlssa.blob.core.windows.net/hls/S309/HLS.S30.T10TET.2019001.v1.4_04.tif
Out[11]:
<matplotlib.image.AxesImage at 0x16fd21ac898>