ALOS/ALOS-2 PALSAR/PALSAR-2 Annual Mosaics
Produits utilisés : alos_palsar_mosaic, jers_sar_mosaic
Mots clés données utilisées ; ALOS PALSAR, données utilisées ; ALOS-2 PALSAR-2, ensembles de données ; ALOS/ALOS-2 PALSAR/PALSAR-2, données utilisées ; JERS SAR, ensembles de données ; JERS SAR, index:SAR
Aperçu
La mosaïque annuelle ALOS/ALOS2 PALSAR est un ensemble de données mondial d’une résolution de 25 m qui combine les données de nombreuses images capturées par les capteurs PALSAR et PALSAR-2 de la JAXA sur les satellites ALOS-1 et ALOS-2 respectivement. Ce produit contient des mesures radar en bande L et en polarisations HH et HV. Il a une résolution spatiale de 25 m et est disponible chaque année pour les années 2007 à 2010 (ALOS/PALSAR) et 2015 à 2022 (ALOS-2/PALSAR-2). Les données de la mosaïque ALOS/ALOS2 PALSAR font partie d’un ensemble de données mondial <https://www.eorc.jaxa.jp/ALOS/en/palsar_fnf/fnf_index.htm> fourni par le Centre de recherche sur l’observation de la Terre de l’Agence d’exploration aérospatiale japonaise (JAXA). Historiquement, la mosaïque annuelle JERS est générée à partir d’images acquises par le capteur SAR du satellite japonais Earth Resources Satellite-1 (JERS-1).
Les mosaïques annuelles ALOS/ALOS-2 PALSAR/PALSAR-2 et JERS de DE Africa sont des données de rétrodiffusion radar normalisées, pour lesquelles la correction radiométrique du terrain (RTC) a été appliquée aux données acquises avec différentes géométries d’imagerie sur la même région. La couverture et les métadonnées pertinentes de l’ensemble de données ALOS/ALOS2 PALSAR peuvent être consultées sur DE Africa Metadata Explorer tandis que la couverture de l’ensemble de données JERS est accessible via ce lien qui forme un package unique et cohérent de données prêtes à l’analyse (ARD), qui vous permet d’analyser les données de rétrodiffusion radar telles quelles sans avoir besoin d’appliquer des corrections supplémentaires.
Détails importants :
Spécifications du produit de mosaïque annuelle ALOS/ALOS2 PALSAR
Nombre de bandes : « 5 »
Pour obtenir la rétrodiffusion en décibels, convertissez les valeurs de rétrodiffusion en nombre numérique (DN) en utilisant $ 10 * log10(DN^2) - 83,0 $
La spécification du masque inclut « 0 » pour « no-data », « 50 » pour l’eau, « 100 » pour lay_over, « 150 » pour l’ombrage et « 255 » pour la terre
La date d’observation est exprimée en jours après le lancement, soit le 24 janvier 2006 et le 24 mai 2014 pour PALSAR et PALSAR-2 respectivement.
L’alignement natif des pixels est « centre »
Plage de dates : années sélectionnées de 2007 à 2022
Résolution spatiale : 25 x 25 m
Spécifications annuelles des produits de mosaïque JERS
Nombre de bandes : « 4 »
Pour obtenir la rétrodiffusion en décibels, convertissez les valeurs de rétrodiffusion en nombre numérique (DN) en utilisant $ 10 * log10(DN^2) - 84,66 $
La spécification du masque inclut « 0 » pour « no-data », « 50 » pour l’eau, « 100 » pour lay_over, « 150 » pour l’ombrage et « 255 » pour la terre
La date d’observation est exprimée en jours après le lancement, soit le 11 février 1992 pour JERS-1.
L’alignement natif des pixels est « centre »
Date : 1996
Résolution spatiale : 25 x 25 m
Pour une description détaillée des archives PALSAR ALOS/ALOS2 de DE Africa, consultez la documentation des spécifications techniques ALOS/ALOS2 de DE Africa <https://docs.digitalearthafrica.org/en/latest/data_specs/ALOS_PALSAR_annual_mosaic_specs.html>`__.
Description
Dans ce notebook, nous allons charger les données ALOS PALSAR en utilisant dc.load() pour renvoyer une série chronologique d’images satellites à partir d’un seul capteur.
Les sujets abordés comprennent :
Inspection des produits et mesures ALOS PALSAR disponibles dans le datacube
Utilisation de la fonction native « dc.load() » pour charger les données ALOS PALSAR à double polarisation et les visualiser
Utilisation de la fonction « dc.load() » pour charger une mosaïque JERS à polarisation unique et visualiser
Commencer
Pour exécuter cette analyse, exécutez toutes les cellules du bloc-notes, en commençant par la cellule « Charger les packages ».
Charger des paquets
[1]:
%matplotlib inline
import datacube
import sys
import math
import pandas as pd
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
from deafrica_tools.plotting import rgb
from deafrica_tools.datahandling import load_ard
from deafrica_tools.plotting import display_map
Se connecter au datacube
[2]:
dc = datacube.Datacube(app="ALOS")
Produits et mesures disponibles
Liste des produits
Nous pouvons utiliser la fonctionnalité « list_products » de Datacube pour inspecter les produits SAR de DE Africa disponibles dans le Datacube. Le tableau ci-dessous indique les noms des produits que nous utiliserons pour charger les données, une brève description des données et l’instrument satellite qui a acquis les données.
[3]:
dc.list_products().loc[dc.list_products()['description'].str.contains('SAR')]
[3]:
name | description | license | default_crs | default_resolution | |
---|---|---|---|---|---|
name | |||||
alos_palsar_mosaic | alos_palsar_mosaic | ALOS/PALSAR and ALOS-2/PALSAR-2 annual mosaic ... | None | EPSG:4326 | (-0.000222222222222, 0.000222222222222) |
jers_sar_mosaic | jers_sar_mosaic | JERS-1 SAR annual mosaic tiles generated for u... | None | EPSG:4326 | (-0.000222222222222, 0.000222222222222) |
Liste des mesures
Nous pouvons examiner plus en détail les données disponibles pour chaque produit SAR à l’aide de la fonctionnalité « list_measurements » de Datacube. Le tableau ci-dessous répertorie chacune des mesures disponibles dans les données.
[4]:
productA = "alos_palsar_mosaic"
[5]:
measurements = dc.list_measurements()
measurements.loc[productA]
[5]:
name | dtype | units | nodata | aliases | flags_definition | scale_factor | |
---|---|---|---|---|---|---|---|
measurement | |||||||
hh | hh | uint16 | 1 | 0.0 | [hh] | NaN | NaN |
hv | hv | uint16 | 1 | 0.0 | [hv] | NaN | NaN |
date | date | uint16 | 1 | 0.0 | [date] | NaN | NaN |
linci | linci | uint8 | 1 | 0.0 | [local incidence angle, linci, incidence] | NaN | NaN |
mask | mask | uint8 | 1 | 0.0 | [mask] | {'category': {'bits': [0, 1, 2, 3, 4, 5, 6, 7]... | NaN |
Charger la mosaïque annuelle de données ALOS PALSAR à l’aide de dc.load()
Maintenant que nous savons quels produits et mesures sont disponibles pour les produits, nous pouvons charger des données à partir du datacube en utilisant « dc.load ».
Dans l’exemple ci-dessous, nous allons charger ALOS PALSAR pour Le Caire et ses environs en Égypte entre 2007 et 2022.
Nous allons charger les données de deux polarisations, ainsi que le masque de données ('mask'
) et la date d’observation. Les données sont chargées dans le système de référence de coordonnées (CRS) natif EPSG:4326. Elles peuvent être reprojetées si output_crs
et resolution
sont définis dans la requête.
Remarque : pour une discussion plus générale sur la manière de charger des données à l’aide du datacube, reportez-vous au bloc-notes « Introduction au chargement des données <../Beginners_guide/03_Loading_data.ipynb> ».
[6]:
# Setting the query for area in the proximity of Cairo
lon = (31.90, 32.10)
lat = (30.37, 30.55)
query = {"x": lon,
"y": lat,
"time": ("2007", "2022")}
Visualiser la zone sélectionnée
[7]:
display_map(x=lon, y=lat)
[7]:
[8]:
#loading the data with the mask band included
bands = ['hh','hv','mask', 'date']
ds_ALOS = dc.load(product='alos_palsar_mosaic',
measurements=bands,
**query)
print(ds_ALOS)
<xarray.Dataset> Size: 61MB
Dimensions: (time: 12, latitude: 811, longitude: 900)
Coordinates:
* time (time) datetime64[ns] 96B 2007-07-02T11:59:59.500000 ... 202...
* latitude (latitude) float64 6kB 30.55 30.55 30.55 ... 30.37 30.37 30.37
* longitude (longitude) float64 7kB 31.9 31.9 31.9 31.9 ... 32.1 32.1 32.1
spatial_ref int32 4B 4326
Data variables:
hh (time, latitude, longitude) uint16 18MB 2126 2712 ... 885 748
hv (time, latitude, longitude) uint16 18MB 802 915 ... 312 435
mask (time, latitude, longitude) uint8 9MB 255 255 255 ... 255 255
date (time, latitude, longitude) uint16 18MB 582 582 ... 2775 2775
Attributes:
crs: EPSG:4326
grid_mapping: spatial_ref
[9]:
#creation of a new band (HV/HH = hvhh) for RGB display
ds_ALOS['hvhh'] = ds_ALOS.hv / ds_ALOS.hh
[10]:
# Set the timesteps to visualise
timesteps = [0,5,10]
# Generate RGB plots at each timestep
rgb(ds_ALOS, bands=['hh','hv','hvhh'], index=timesteps)

Contrôle de la date d’observation
Chaque mosaïque annuelle est créée à partir de plusieurs observations d’une même année. Cela peut entraîner une discontinuité entre les images, comme illustré ci-dessus. Cela signifie également que les mosaïques de différentes années peuvent provenir de différentes saisons.
[11]:
# plot date for a mosaic
ds_ALOS.isel(time=3).date.plot.imshow(robust=True);

La date d’observation doit être prise en compte lors de l’évaluation des changements détectés d’une année sur l’autre. Dans cet exemple, nous trouvons les dates d’observation les plus anciennes, les plus récentes et la médiane pour chaque mosaïque chargée.
[12]:
min_days = ds_ALOS.date.min(dim=['latitude','longitude']).values
max_days = ds_ALOS.date.max(dim=['latitude','longitude']).values
med_days = ds_ALOS.date.median(dim=['latitude','longitude']).astype(min_days.dtype).values
[13]:
# Define ALOS and ALOS-2 launch dates
alos_launch = np.datetime64('2006-01-24')
alos2_launch = np.datetime64('2014-05-24')
[14]:
# Calculate earliest, latest and median observation dates, using launch dates and offsets reported in the date band
indexed_time = ds_ALOS.time.values
min_dates = np.empty(len(indexed_time),dtype='<M8[D]')
max_dates = np.empty(len(indexed_time),dtype='<M8[D]')
med_dates = np.empty(len(indexed_time),dtype='<M8[D]')
for i, time in enumerate(indexed_time):
if time < np.datetime64('2015'):
min_dates[i] = alos_launch + np.timedelta64(min_days[i], 'D')
max_dates[i] = alos_launch + np.timedelta64(max_days[i], 'D')
med_dates[i] = alos_launch + np.timedelta64(med_days[i], 'D')
else:
min_dates[i] = alos2_launch + np.timedelta64(min_days[i], 'D')
max_dates[i] = alos2_launch + np.timedelta64(max_days[i], 'D')
med_dates[i] = alos2_launch + np.timedelta64(med_days[i], 'D')
Les plages de dates ci-dessous montrent que les observations peuvent s’étendre sur plusieurs mois. Il arrive parfois que les données utilisées proviennent d’une autre année.
[15]:
for i in zip(min_dates, max_dates, (max_dates - min_dates).astype(int)): print("Date range and span (in days)", i)
Date range and span (in days) (numpy.datetime64('2007-06-27'), numpy.datetime64('2007-08-29'), 63)
Date range and span (in days) (numpy.datetime64('2008-08-31'), numpy.datetime64('2008-09-29'), 29)
Date range and span (in days) (numpy.datetime64('2009-08-17'), numpy.datetime64('2009-09-03'), 17)
Date range and span (in days) (numpy.datetime64('2010-07-22'), numpy.datetime64('2010-08-20'), 29)
Date range and span (in days) (numpy.datetime64('2015-07-07'), numpy.datetime64('2015-07-07'), 0)
Date range and span (in days) (numpy.datetime64('2016-07-05'), numpy.datetime64('2016-07-05'), 0)
Date range and span (in days) (numpy.datetime64('2017-07-04'), numpy.datetime64('2017-07-04'), 0)
Date range and span (in days) (numpy.datetime64('2018-03-27'), numpy.datetime64('2018-03-27'), 0)
Date range and span (in days) (numpy.datetime64('2019-01-01'), numpy.datetime64('2019-01-01'), 0)
Date range and span (in days) (numpy.datetime64('2020-12-29'), numpy.datetime64('2020-12-29'), 0)
Date range and span (in days) (numpy.datetime64('2021-12-28'), numpy.datetime64('2021-12-28'), 0)
Date range and span (in days) (numpy.datetime64('2021-12-28'), numpy.datetime64('2021-12-28'), 0)
[16]:
# Assign median dates to be the timestamps
ds_ALOS['time'] = med_dates.astype('datetime64[ns]')
Conversion des valeurs DN en unités décibels
Les données de rétrodiffusion étant fournies sous forme de nombre numérique (DN), elles peuvent être converties en rétrodiffusion en décibels pour améliorer le contraste à l’aide de l’équation de conversion fournie. Avant de convertir en décibels, nous appliquons également le masque de données pour exclure les pixels dans l’ombre radar ou avec superposition.
[17]:
#convert DN to db values
ds_ALOS['hh_db'] = 10 * np.log10(ds_ALOS.hh.where(ds_ALOS.mask.isin([50,255]))**2) - 83.0
ds_ALOS['hv_db'] = 10 * np.log10(ds_ALOS.hv.where(ds_ALOS.mask.isin([50,255]))**2) - 83.0
ds_ALOS['hvhh_db'] = ds_ALOS['hv_db'] - ds_ALOS ['hh_db']
[18]:
# Set the timesteps to visualise
timesteps = [0,5,10]
# Generate RGB plots at each timestep
rgb(ds_ALOS, bands=['hh_db','hv_db','hvhh_db'], index=timesteps)

Analyse d’histogramme pour l’ensemble de données ALOS/ALOS-2 PALSAR
Utilisez des histogrammes pour inspecter la distribution des valeurs de rétrodiffusion.
[19]:
#plotting each polorisation bands following converting to dB values
fig, ax = plt.subplots(1, 3, figsize=(14, 4))
ds_ALOS.hh_db.plot.hist(ax=ax[0], facecolor='red')
ds_ALOS.hv_db.plot.hist(ax=ax[1], facecolor='green')
ds_ALOS.hvhh_db.plot.hist(ax=ax[2], facecolor='blue')
plt.tight_layout()

Charger le jeu de données JERS à l’aide de dc.load()
Dans l’exemple ci-dessous, nous allons charger la mosaïque annuelle JERS pour Le Caire et ses environs en Égypte en 1996.
Nous allons charger les données de polarisation HH, ainsi que le masque de données (mask
). Les données sont chargées dans le système de référence de coordonnées (CRS) EPSG:4326 natif. Elles peuvent être reprojetées si output_crs
et resolution
sont définis dans la requête.
Remarque : pour une discussion plus générale sur la manière de charger des données à l’aide du datacube, reportez-vous au bloc-notes « Introduction au chargement des données <../Beginners_guide/03_Loading_data.ipynb> ».
[20]:
# Setting the query for area in the proximity of Cairo
lon = (31.90, 32.10)
lat = (30.37, 30.55)
query_jers = {"x": lon,
"y": lat,
"time": ("1996")}
[21]:
#loading the data with the mask band included
bands = ['hh','mask']
ds_JERS = dc.load(product='jers_sar_mosaic',
measurements=bands,
**query_jers)
print(ds_JERS)
<xarray.Dataset> Size: 2MB
Dimensions: (time: 1, latitude: 811, longitude: 900)
Coordinates:
* time (time) datetime64[ns] 8B 1996-07-01T23:59:59.500000
* latitude (latitude) float64 6kB 30.55 30.55 30.55 ... 30.37 30.37 30.37
* longitude (longitude) float64 7kB 31.9 31.9 31.9 31.9 ... 32.1 32.1 32.1
spatial_ref int32 4B 4326
Data variables:
hh (time, latitude, longitude) uint16 1MB 6505 6953 ... 2750 2750
mask (time, latitude, longitude) uint8 730kB 255 255 255 ... 255 255
Attributes:
crs: EPSG:4326
grid_mapping: spatial_ref
[22]:
#convert DN values in JERS dataset to db values
ds_JERS['hh_db'] = 10 * np.log10(ds_JERS.hh.where(ds_JERS.mask.isin([50,255]))**2) - 84.66
[23]:
# Plot all VH observations for the year
ds_JERS.hh_db.plot(cmap="Greys_r", robust=True,size=8);

Analyse d’histogramme pour la polarisation JERS HH
Inspecter la distribution de la rétrodiffusion dans cette zone
[24]:
#plotting each polorisation bands following converting to dB values
fig, ax = plt.subplots(1, 2, figsize=(14, 4))
ds_JERS.hh.plot.hist(ax=ax[0], bins=20, facecolor='red')
ds_JERS.hh_db.plot.hist(ax=ax[1], bins=20, facecolor='green')
plt.tight_layout()

Informations Complémentaires
Licence : Le code de ce carnet est sous licence Apache, version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>. Les données de Digital Earth Africa sont sous licence Creative Commons par attribution 4.0 <https://creativecommons.org/licenses/by/4.0/>.
Contact : Si vous avez besoin d’aide, veuillez poster une question sur le canal Slack Open Data Cube <http://slack.opendatacube.org/>`__ ou sur le GIS Stack Exchange en utilisant la balise open-data-cube
(vous pouvez consulter les questions posées précédemment ici). Si vous souhaitez signaler un problème avec ce bloc-notes, vous pouvez en déposer un sur Github.
Version de Datacube compatible :
[25]:
print(datacube.__version__)
1.8.20
Dernier test :
[26]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[26]:
'2025-01-15'