↗ Notebook Colab
Introduction

Le Lac Rouge et sa disparition

Le Lac Rouge est un petit plan d'eau situé dans les Laurentides, à environ 150 km au nord de Montréal, dans la région de Lanaudière. Son bassin versant s'étend sur des collines boisées aux sols argileux typiques du bouclier canadien post-glaciaire — un contexte géologique connu pour sa susceptibilité aux glissements de terrain, particulièrement lorsque le couvert végétal est perturbé.

Ces dernières années, le lac a fait l'objet d'une attention particulière : des glissements de terrain ont modifié son bassin versant de manière significative, affectant la stabilité des berges et potentiellement le lac lui-même. Comprendre quand ces changements ont eu lieu, où ils se sont produits, et ce qui les a déclenchés, est une question à la fois écologique et géomorphologique.

C'est dans ce contexte que ce projet mobilise la télédétection satellitaire : en analysant dix ans d'images Landsat sur la zone, on cherche à reconstituer l'historique des perturbations du couvert végétal — signal indirect mais robuste des changements au sol — et à remonter vers les causes probables des glissements.

🗺️
Localisation — Lac Rouge, Laurentides
→ carte de localisation ou vue satellite geemap centrée sur l'AOI

Localisation du Lac Rouge dans les Laurentides, Québec. La zone d'étude (AOI) est définie par un polygone GEE couvrant le bassin versant immédiat du lac et le chemin d'écoulement des eaux potentiellement affecté par les glissements.

Approche

Détecter les changements dans une série temporelle satellite

La végétation reflète l'état du sol de manière continue : une coupe forestière, un incendie ou un glissement laissent tous une trace spectrale caractéristique dans les images satellite. L'idée centrale de ce projet est d'exploiter cette propriété à travers une série temporelle dense d'images Landsat 8 et 9 (résolution 30 m, archives 2015–2025), pour détecter automatiquement les ruptures dans le signal de végétation.

L'algorithme utilisé est CCDC (Continuous Change Detection and Classification), développé par Zhu & Woodcock (2014) et intégré dans Google Earth Engine. Son principe : ajuster un modèle mathématique sur l'ensemble de la série temporelle pixel par pixel, et identifier les moments où les observations s'écartent significativement du modèle — ce sont les breaks, ou ruptures spectrales. Chaque break correspond à un changement abrupt au sol.

Préparation des images Landsat

Avant d'appliquer CCDC, les images sont prétraitées pour corriger les effets atmosphériques, renommer les bandes de manière cohérente entre Landsat 8 et 9, et calculer les indices spectraux. On utilise la Collection 2 Level-2 Surface Reflectance, déjà corrigée atmosphériquement par l'USGS.

La bande bleue est exclue de l'analyse : elle est trop sensible à la diffusion atmosphérique pour être fiable dans un modèle de détection de changements (Arévalo & Olofsson, 2023). Les bandes retenues sont GREEN, RED, NIR, SWIR1, SWIR2, complétées par deux indices calculés :

prepareL89Col2() — indices spectraux
# Le NBR (Normalized Burn Ratio) mesure la différence entre # le proche infrarouge (NIR, sensible à la biomasse vivante) # et le SWIR2 (sensible à l'humidité et aux cendres). # Un NBR élevé = végétation dense. Un NBR bas ou négatif = sol nu, brûlé ou coupé. NBR = scaled.normalizedDifference(['NIR', 'SWIR2']).rename('NBR') # Le NDVI (Normalized Difference Vegetation Index) est l'indice # de verdure le plus classique. Il est complémentaire au NBR # pour confirmer les changements de végétation. NDVI = scaled.normalizedDifference(['NIR', 'RED']).rename('NDVI') # Le NBRT intègre la température de surface pour mieux différencier # les coupes forestières (pas de chaleur) des incendies (forte chaleur). # NBRT = (NIR - SWIR2 * TEMP) / (NIR + SWIR2 * TEMP) nir = scaled.select('NIR') swir2_temp = scaled.select('SWIR2').multiply(scaled.select('TEMP')) NBRT = nir.subtract(swir2_temp).divide(nir.add(swir2_temp)).rename('NBRT')
Ces trois indices seront les principaux indicateurs utilisés pour caractériser et distinguer les types de perturbation. Le NBR est particulièrement pertinent ici car il est sensible à la fois à la perte de végétation (coupes) et aux cicatrices de feu.

Un masquage qualité rigoureux est ensuite appliqué : nuages, saturation radiométrique, aérosols épais et valeurs de réflectance aberrantes sont éliminés via les bandes QA fournies par l'USGS.

prepareL89Col2() — masquage qualité
# mask1 : pixels dont la qualité QA_PIXEL correspond à des conditions # claires (ciel dégagé, pas de nuage ni d'ombre portée) valid_QA = [21824, 21888] mask1 = image.select('QA_PIXEL').remap(valid_QA, [1] * len(valid_QA), 0) # mask2 : aucune saturation radiométrique sur les capteurs mask2 = image.select('QA_RADSAT').eq(0) # mask3 et mask4 : valeurs de réflectance dans la plage physiquement valide [0, 1] mask3 = scaled.select(sub_band).reduce(ee.Reducer.min()).gt(0) mask4 = scaled.select(sub_band).reduce(ee.Reducer.max()).lt(1) # mask5 : charge aérosol acceptable (pas d'atmosphère trop chargée) valid_TOA = [2, 4, 32, 66, 68, 96, 100, 130, 132, 160, 164] mask5 = image.select('SR_QA_AEROSOL').remap(valid_TOA, [1] * len(valid_TOA), 0) # Application combinée : seuls les pixels validant les 5 conditions sont conservés return image.addBands(scaled).updateMask( mask1.And(mask2).And(mask3).And(mask4).And(mask5))
Ce masquage strict est essentiel pour CCDC : l'algorithme construit son modèle à partir de toutes les observations disponibles. Une seule observation nuageuse non filtrée peut être interprétée comme un faux break. La qualité des résultats dépend directement de la qualité du masquage en amont.

Paramétrage de l'algorithme CCDC

CCDC ajuste, pour chaque pixel et chaque bande, un modèle harmonique combinant une tendance linéaire et plusieurs termes saisonniers. Quand les nouvelles observations s'écartent trop du modèle (test du χ² au seuil de 0.99), un break est déclaré et un nouveau segment commence.

ŷ(t) = INTP + SLP·t + COS₁·cos(2πt) + SIN₁·sin(2πt) + COS₂·cos(4πt) + SIN₂·sin(4πt) + COS₃·cos(6πt) + SIN₃·sin(6πt)

t en années fractionnaires. INTP = niveau moyen de réflectance, SLP = tendance long-terme, les paires COS/SIN capturent la saisonnalité à 3 fréquences (annuelle, semestrielle, trimestrielle).

ccdParams — configuration de l'algorithme
ccdParams = { # Toutes les bandes (sauf bleu) participent à la détection des breaks 'breakpointBands' : COMMON, # TMask : masque itératif supplémentaire basé sur GREEN et SWIR1, # pour détecter les nuages résiduels non filtrés par le QA 'tmaskBands' : ['GREEN', 'SWIR1'], # Nombre minimum d'observations claires pour qu'un segment soit valide. # En dessous de 6, le modèle n'est pas fiable. 'minObservations' : 6, # Seuil du test χ² : 0.99 signifie qu'un break n'est déclaré que si # la probabilité d'être un changement réel (et non du bruit) est ≥ 99 %. 'chiSquareProbability': 0.99, # Facteur d'échelle temporelle : un segment doit couvrir au moins # minObservations × minNumOfYearsScaler années pour être retenu. 'minNumOfYearsScaler': 1.33, # dateFormat = 1 : les dates sont exprimées en années fractionnaires # (ex. 2019.4 = fin mai 2019), ce qui facilite l'interprétation. 'dateFormat' : 1, 'maxIterations' : 25000 } ccdcResults = ee.Algorithms.TemporalSegmentation.Ccdc(**ccdParams)
Le résultat de CCDC est une image multi-bandes contenant, pour chaque pixel, un tableau de segments : dates de début et de fin (tStart, tEnd), coefficients du modèle harmonique (_coefs), magnitude du changement (_magnitude), probabilité de break validé (changeProb) et date du break (tBreak). C'est cette structure qui sera ensuite interrogée pour extraire les résultats.
Analyse à l'échelle du pixel

Reconstruire l'historique spectral d'un lieu

Avant de passer à la cartographie spatiale, il est utile d'observer le comportement de CCDC à l'échelle d'un pixel individuel. Cela permet de comprendre visuellement ce que l'algorithme détecte : comment le signal NBR évolue dans le temps, où se situent les breaks, et ce que le modèle harmonique ajusté représente entre deux ruptures.

On choisit un pixel dans la zone Nord-Ouest du lac (Lon −75.37, Lat 49.28), zone qui présente a priori les changements les plus importants. On extrait les observations Landsat sur ce pixel via getRegion(), puis on récupère les coefficients CCDC stockés dans ccdResults pour reconstruire les segments ajustés.

extraction et reconstruction des segments CCDC
# Définition du pixel à analyser lon, lat = -75.37275552749635, 49.28072638351623 pt = ee.Geometry.Point([lon, lat]) # Extraction de toutes les observations Landsat sur ce pixel. # getRegion() retourne une liste de lignes [id, lon, lat, time, valeur]. # On filtre les valeurs nulles (pixels masqués) et on convertit # les timestamps (en millisecondes depuis 1970) en années décimales. ts = collection.select('NBR').getRegion(pt, 30).getInfo() def millis_to_year(m): return 1970 + m / 1000 / 60 / 60 / 24 / 365.25 dates_obs = [] values_obs = [] for row in ts[1:]: # ts[0] = en-tête t, y = row[3], row[4] if y is not None: dates_obs.append(millis_to_year(t)) values_obs.append(y) # Récupération des paramètres de chaque segment CCDC pour ce pixel. # tStart et tEnd sont les bornes temporelles du segment (en années fract.). # NBR_coefs contient les 8 coefficients du modèle harmonique : # [INTP, SLP, COS1, SIN1, COS2, SIN2, COS3, SIN3] tStart = ccdResults.select('tStart' ).sample(pt, 30).first().get('tStart' ).getInfo() tEnd = ccdResults.select('tEnd' ).sample(pt, 30).first().get('tEnd' ).getInfo() coefs = ccdResults.select('NBR_coefs').sample(pt, 30).first().get('NBR_coefs').getInfo() # Reconstruction du modèle pour chaque segment. # Pour chaque segment i, on évalue la formule harmonique CCDC # sur une grille temporelle dense de 200 points. fits = [] for i in range(len(coefs)): t = np.linspace(tStart[i], tEnd[i], 200) INTP, SLP, COS1, SIN1, COS2, SIN2, COS3, SIN3 = coefs[i] y = (INTP + SLP * t + COS1 * np.cos(2*np.pi*t) + SIN1 * np.sin(2*np.pi*t) + COS2 * np.cos(4*np.pi*t) + SIN2 * np.sin(4*np.pi*t) + COS3 * np.cos(6*np.pi*t) + SIN3 * np.sin(6*np.pi*t)) fits.append((t, y))
Chaque segment produit une courbe lisse qui capture à la fois la tendance de long terme (SLP) et la saisonnalité (les termes cos/sin). Les breaks apparaissent graphiquement comme des sauts verticaux entre la fin d'un segment et le début du suivant — souvent avec un changement de niveau important, qui traduit la perturbation au sol.
📈
Série temporelle NBR — zone Nord-Ouest
→ capture du graphique matplotlib, pixel Lon −75.37 / Lat 49.28

Fig. 1 — NBR 2015–2025 sur le pixel Lon −75.37 / Lat 49.28 (zone Nord-Ouest). Les points bleus sont les observations Landsat. Les segments colorés sont les courbes harmoniques ajustées par CCDC. La chute brutale vers 2019.4 marque un break majeur : le NBR passe de ~0.57 à ~0.05, soit une quasi-disparition de la végétation.

📈
Série temporelle NDVI — zone Est
→ capture du second graphique matplotlib, pixel Lat 49.27 / Lon −75.45

Fig. 2 — NDVI 2015–2025 sur un pixel de la zone Est. Un break distinct apparaît entre 2023.4 et 2023.6 : le NDVI chute de 0.70 à 0.57 en quelques semaines — vitesse caractéristique d'un feu, très différente de l'évolution progressive d'une coupe.

Ces deux graphiques illustrent un fait central : les breaks ne se produisent pas tous au même moment ni dans les mêmes zones. La zone Nord-Ouest est dominée par une rupture en 2019, la zone Est par une rupture en 2023. Cette différence spatiale et temporelle sera déterminante pour l'interprétation des causes.

Cartographie spatiale

Localiser et dater les changements sur l'ensemble du bassin versant

L'analyse pixel par pixel donne un aperçu local, mais l'intérêt de CCDC est de produire une cartographie exhaustive : chaque pixel du bassin versant reçoit ses propres segments, ses propres breaks, ses propres magnitudes. On peut ainsi répondre à deux questions spatiales : les changements ont-ils eu lieu, et quand ?

Extraction des ruptures valides

On commence par construire un masque des ruptures valides sur la période 2015–2025. Une rupture est dite valide si CCDC lui attribue une probabilité de 1 (i.e. le seuil χ² à 99 % est franchi). Ce masque est ensuite utilisé pour compter le nombre de breaks par pixel et extraire leurs dates.

extraction des ruptures spatiales
# tBreak contient, pour chaque pixel, un tableau des dates de rupture # (en années fractionnaires). changeProb = 1 si la rupture est validée. change = ccdResults.select('tBreak') changeProb = ccdResults.select('changeProb') # On construit un masque booléen : True si la rupture est dans la # période d'intérêt ET si elle est validée statistiquement. start, end = 2015, 2025 mask = (change.gt(start) .And(change.lte(end)) .And(changeProb.eq(1))) # Nombre de ruptures valides par pixel. # arrayReduce(sum) additionne les 1 du masque le long du tableau de segments. numBreaks = (mask.arrayReduce(ee.Reducer.sum(), [0]) .arrayFlatten([['breaks']])) # Première rupture : on filtre les dates par le masque, on complète # à 1 segment minimum avec arrayPad, puis on prend l'élément 0. # selfMask() masque les pixels sans aucune rupture (valeur 0). dates = change.arrayMask(mask).arrayPad([1]) firstChange = (dates.arraySlice(0, 0, 1) .arrayFlatten([['firstChange']]) .selfMask()) # Dernière rupture : même logique, mais on prend l'élément −1 (dernier). lastChange = (dates.arraySlice(0, -1) .arrayFlatten([['lastChange']]) .selfMask())
La distinction entre première et dernière rupture est importante : elle permet de séparer les perturbations initiales (qui peuvent être la cause d'un glissement) des perturbations secondaires (conséquences ou événements ultérieurs indépendants). Un pixel avec firstChange = 2019 et lastChange = 2023 a connu deux événements distincts.
🗺️
changeProb — pixels avec au moins un break
→ capture de Map_prob

Fig. 3 — Pixels ayant subi au moins une rupture valide (rouge) entre 2015 et 2025. Le polygone rouge délimite le ROI (chemin d'écoulement des eaux). Les changements se concentrent principalement à l'Ouest et au Nord-Ouest du lac.

🗺️
numBreaks — nombre de ruptures par pixel
→ capture de Map_breaks

Fig. 4 — Nombre de ruptures valides par pixel (jaune = 0, orange = 1, rouge = 2, bordeaux = 3+). Les pixels ayant accumulé 2 à 3 ruptures correspondent à la zone de coupe 2019 qui a ensuite été touchée par les feux de 2023 puis un aménagement en 2024.

🗺️
firstChange — année du premier break
→ capture de Map_first

Fig. 5 — Année du premier break valide (gradient jaune→rouge, 2015–2025). La grande zone rouge à l'Ouest confirme 2019 comme perturbation initiale dominante sur la majorité de la surface affectée.

🗺️
lastChange — année du dernier break
→ capture de Map_last

Fig. 6 — Année du dernier break valide. Les pixels à break récent (2023–2024) se superposent en partie à la zone de coupe de 2019, confirmant que ces mêmes secteurs ont subi plusieurs perturbations successives.

Magnitude du changement

La date d'un break indique quand quelque chose s'est produit. La magnitude renseigne sur l'ampleur du changement : une valeur très négative signifie que la réflectance a chuté brutalement (perte de végétation), une valeur positive indique une augmentation (végétation qui repousse, ou sol humide après un feu). On extrait pour chaque pixel le break de plus grande amplitude absolue.

extraction de la magnitude maximale
# On récupère les magnitudes NBR, masquées par les breaks valides. # arrayPad([1]) garantit qu'il y a au moins un élément (0) même # pour les pixels sans rupture, évitant les erreurs d'indexation. magnitudes = (ccdResults.select('NBR_magnitude') .arrayMask(mask) .arrayPad([1])) # arrayArgmax() retourne l'indice de la valeur absolue maximale # dans le tableau de magnitudes de chaque pixel. # C'est cet indice qu'on utilisera pour extraire la magnitude # et la date correspondante. maxIndex = magnitudes.abs().arrayArgmax().arrayFlatten([['index']]) selectedMag = magnitudes.arrayGet(maxIndex) selectedTbk = dates.arrayGet(maxIndex).selfMask()
🗺️
Magnitude maximale du break NBR
→ couche selectedMag depuis le notebook

Fig. 7 — Magnitude absolue maximale du break NBR (palette viridis, −0.15 à +0.15). Les valeurs fortement négatives (violet foncé) à l'Ouest indiquent une perte massive et soudaine de végétation lors du break de 2019.

🛰️
Zoom satellite — zone de coupe Ouest (2019)
→ capture zoomée depuis Map_last filtré 2015–2020

Fig. 8 — Vue satellite zoomée sur la zone Ouest après le break de 2019. Le découpage géométrique en blocs rectangulaires et les routes forestières visibles sont la signature sans ambiguïté d'une coupe à blanc industrielle.

Identification des perturbations

Distinguer coupe forestière, feux et aménagement

On a détecté des breaks, on les a localisés et datés. Il reste à comprendre ce qui les a causés. Trois événements distincts ont affecté la zone entre 2015 et 2025, chacun avec une signature spectrale et spatiale différente.

Break de 2019 — Coupe forestière à l'Ouest

Le premier break majeur se produit entre 2019.4 et 2019.5 (environ mai–juin 2019) sur la zone Ouest du lac. Le NBR chute de ~0.57 à ~0.05 : la végétation arborée disparaît presque entièrement sur la zone affectée. Plusieurs éléments confirment qu'il s'agit d'une coupe forestière : le pattern spatial rectangulaire, l'avancée progressive sur plusieurs mois, et la présence de routes forestières visibles sur l'imagerie. Ces caractéristiques sont incompatibles avec un phénomène naturel.

Break de 2023 — Feux de forêt au Nord-Ouest et à l'Est

Un second break apparaît en 2023.4–2023.6 sur le secteur Est et Nord-Ouest. Pour le caractériser, on calcule le dNBR (différence de NBR avant et après l'événement), indicateur standard de sévérité des incendies. On compare un composite pré-événement (mai–juin 2023) avec un composite post-événement (août–septembre 2023).

calcul du dNBR — sévérité des feux de 2023
# Composite médiane avant le feu (saison de croissance, pas encore brûlé) pre_fire = collection_nbr.filterDate('2023-05-01', '2023-06-30').median() # Composite médiane après le feu (cicatrice visible) post_fire = collection_nbr.filterDate('2023-08-01', '2023-09-30').median() # dNBR = NBR_pre - NBR_post. # Une valeur positive élevée indique une forte perte de végétation (feu sévère). # Une valeur proche de 0 indique peu ou pas de changement. # Une valeur négative peut indiquer une végétation basse qui profite de l'ouverture. dnbr = pre_fire.select('NBR').subtract(post_fire.select('NBR')).rename('dNBR') # Le composite en couleurs naturelles (RGB) permet de localiser # visuellement la cicatrice de feu (zone gris foncé sur l'image) natural_color_vis = {'bands': ['RED', 'GREEN', 'BLUE'], 'min': 0, 'max': 0.3, 'gamma': 1.4}
Le dNBR est utilisé en opérationnel par les agences forestières pour cartographier la sévérité des incendies. Un dNBR > 0.1 indique généralement un feu de faible sévérité, > 0.27 une sévérité modérée, > 0.66 une sévérité élevée. La vitesse du changement (quelques semaines) et l'absence de pattern géométrique permettent de le distinguer clairement d'une coupe.
🛰️
Composite Landsat — août–oct. 2023
→ capture de Map_composite

Fig. 9 — Composite Landsat 8 en couleurs naturelles (août–octobre 2023). La cicatrice de feu apparaît en gris foncé au Nord-Ouest. Le contour rouge délimite l'AOI. L'absence de bords droits confirme l'origine naturelle du changement.

🗺️
dNBR — sévérité du feu 2023
→ capture de la couche dNBR 2023

Fig. 10 — dNBR calculé entre mai–juin et août–septembre 2023. Les valeurs positives élevées (jaune→rouge) indiquent les zones les plus sévèrement brûlées. L'été 2023 a enregistré des records historiques d'incendies au Québec, ce qui confirme la plausibilité de cette cause.

Break de 2024 — Aménagement post-coupe

Un troisième break, plus modeste, apparaît entre 2024.4 et 2024.5 dans la zone déjà déforestée de 2019. L'imagerie satellite révèle des parcelles plus claires, cohérentes avec un débroussaillage préparatoire à la plantation d'arbres — activité standard dans les zones de récolte 4 à 5 ans après la coupe initiale.

🛰️
Zoom satellite — zone 2024 (aménagement)
→ capture zoomée, image récente disponible dans le notebook

Fig. 11 — Vue satellite de la zone Ouest en 2024. Des parcelles claires apparaissent au sein de la zone déforestée de 2019, signatures d'un travail du sol ou d'une plantation d'arbres. Ce break n'est pas lié au glissement de terrain mais à la gestion forestière post-récolte.

On résume les trois événements détectés :

PériodeLocalisationIndiceAmplitudeCause identifiée
2019.4 – 2019.5 Ouest / Est NBR, NDVI 0.57 → ~0.05 Coupe forestière
2023.4 – 2023.6 Est, Nord-Ouest NDVI, dNBR 0.70 → 0.57 Feux de forêt
2024.4 – 2024.5 Ouest (zone 2019) NBR légère baisse Aménagement post-coupe
Interprétation

Vers une explication des glissements de terrain

Les résultats de l'analyse CCDC permettent de formuler une hypothèse solide sur les causes des glissements de terrain ayant affecté le Lac Rouge. La convergence de plusieurs lignes d'évidence pointe vers la coupe forestière de 2019 comme facteur déclenchant principal.

Pourquoi la coupe forestière est la cause la plus probable

La coupe se localise à l'Est du lac — exactement du côté d'où le glissement est supposé être parti. Les feux de 2023, eux, affectent principalement le Nord-Ouest et surviennent plusieurs années après les premiers signes de déstabilisation. Ils constituent un facteur aggravant, pas une cause initiale.

Sur le plan mécanique, les Laurentides sont caractérisées par des argiles marines sensibles (quick clays) déposées lors de la déglaciation. Ces sols peuvent passer brutalement d'un état solide à un état liquide si leur structure est perturbée. La végétation arborée joue un rôle stabilisateur essentiel : les racines ancrent le sol, réduisent le ruissellement de surface et maintiennent l'humidité à des niveaux acceptables. Supprimer 90 % du couvert arboré en quelques mois crée des conditions favorables à l'instabilité.

🗺️
Localisation du break 2019 vs zone de glissement
→ capture Map_first filtré 2015–2020, centré sur le secteur Est / zone du glissement

Fig. 12 — Superposition du premier break valide (2015–2020) avec la zone de glissement. La concordance spatiale entre la zone de coupe de 2019 (secteur Est) et la zone de glissement est l'argument le plus discriminant de l'analyse.

Niveau de certitude : modéré à élevé. La cohérence spatiale, temporelle et spectrale des observations converge fortement vers la coupe forestière de 2019 comme facteur déclenchant. Ce niveau de certitude reste néanmoins limité par les données disponibles : la télédétection optique ne mesure pas directement les propriétés mécaniques du sol.

Des données complémentaires permettraient de renforcer la conclusion : relevés géotechniques des argiles locales, chronologie précise des travaux forestiers, données pluviométriques 2019–2020 (un épisode de pluies intenses après une coupe est un scénario classique de déclenchement), et comparaison avec les zones de coupe non touchées par des glissements dans la même région.

Références
Arévalo, P., & Olofsson, P. (2023). Interpreting time series with CCDC. In Cloud-Based Remote Sensing with Google Earth Engine: Fundamentals and Applications (pp. 353–375). Springer International Publishing.
Zhu, Z., & Woodcock, C. E. (2014). Continuous change detection and classification of land cover using all available Landsat data. Remote Sensing of Environment, 144, 152–171.
Adapté pour Colab par J. Pelletier, Université de Montréal — GEO6343.
Données : USGS Landsat Collection 2 Level-2 (LANDSAT/LC08/C02/T1_L2, LANDSAT/LC09/C02/T1_L2) via Google Earth Engine · Zone d'étude : projects/geo6343/assets/APP/LacRouge.