Ga naar inhoud

Satellietdata oproepen, filteren en visualiseren

Visualisatie van een image in Google Earth Engine

In het eerste practicum gingen we aan de slag met een Sentinel-2 beeld van de Braziliaanse stad Bélem uit 2024. Aangezien de volledige Sentinel-bibliotheek beschikbaar is binnen Google Earth Engine, kan dit beeld eenvoudig worden ingeladen. Bekijk hiervoor eerst de naam nog eens van je gedownload S2-bestand, bijvoorbeeld:

S2A_MSIL2A_20240911T133831_N0511_R124_T22MGD_20240911T190800.SAFE

Dit is dus een Sentinel-2 beeld genomen op 11 september 2024. Dit zelfde beeld is ook beschikbaar binnen Google Earth Engine, als een 'ee.Image'. Deze kun je als volgt inladen onder een variabele 'S2_Belem':

//Voorbeeld: Sentinel-2 beeld van vorig practicum
var S2_Belem = ee.Image('COPERNICUS/S2_SR_HARMONIZED/20240911T133831_20240911T133831_T22MGD')
print(S2_Belem)

// Zoom in de Map-view naar de locatie van het beeld., met Zoom-factor 9
Map.centerObject(S2_Belem, 9);

Hiermee werd slechts een variabele aangemaakt die het beeld omvat. Om het beeld te visualiseren (toevoegen aan het mapvenster) wordt gebruik gemaakt van de functie Map.addLayer():

//Visualiseren van het satellietbeeld
Map.addLayer(S2_Belem);
Bij het uitvoeren van bovenstaande code bekomen we een zwart vlak, niet bepaald de visualisatie die we wensen.


Bij het uitvoeren van bovenstaande code bekomen we een zwart vlak, niet bepaald de visualisatie die we wensen. Dit komt omdat we nog geen visualisatieparameters hebben aangegeven, waardoor de eerste 3 banden naar de rode, groene en blauwe band respectievelijk worden toegekend en de pixelrange zo groot is dat alle pixels een zwarte kleur krijgen. Om dit manueel aan te passen, zoek je je toegevoegde laag in 'Layers' in de Map-view. Klik op het tandwieltje. Een visualisatie-scherm springt open. Pas de parameters aan, zodat je een normale kleurencomposiet verkrijgt, met een stretch van 3 sigma en druk op 'Apply'. Een visueel beter resultaat wordt verkregen.

Image stretching

Verschillende stretch opties laten toe de histogrammen van het beeld te strechten om een betere visualisatie te krijgen. De stretch wordt uitgevoerd op basis van de huidige map view: ben je bijvoorbeeld ingezoomd om een stuk homogeen bos, wordt de stretch hierbinnen uitgevoerd.


Instellen van de visualisatieparameters kan via 'Layers' in de Map view.


Het is echter niet handig om steeds opnieuw de visualisatie handmatig in te stellen. Gelukkig kan deze ook als code geïmporteerd worden in GEE (klik op 'Import'). De visualisatieparameters worden toegevoegd in de Imports. Deze kunnen dan in de Map.addLayer() -functie worden meegeven tijdens het visualiseren.


In de code-editor zelf kunnen de visualisatieparameters eveneens gedefinieerd worden als een Object.

// Aanmaken van visualisatieparameters
var visualization = {
  min: 0,
  max: 3000,
  bands: ['B4', 'B3', 'B2'],
};
Map.centerObject(S2_Belem, 9);
Map.addLayer(S2_Belem, visualization,'Bèlem_met_Vis');

Beeldcollecties zoeken en filteren

In voorgaande paragraaf visualiseerden we een Sentinel-2 beeld die we reeds hadden opgezocht waarvan wisten dat de kwaliteit goed zat én waarvan we de bestandsnaam reeds kenden. Het is natuurlijk niet handig om steeds een filenaam te moeten kennen om verder te kunnen werken in Earth Engine. Daarmee zouden we ook de geweldige kracht van het programma om doorheen vele petabytes aan aardobservatiedata te zoeken onbenut laten.

In wat volgt gaan we op basis van een locatie op zoek gaan naar geschikte satellietbeelden, door het filteren van gehele beeldcollecties, in earth engine gekend als ImageCollections .

Region of Interest (ROI) intekenen

Starten doen we met het intekenen van een gewenste Region Of Interest (ROI) in de Map View. Een ROI is niets anders dan de afbakening van het studiegebied, waarbinnen we onze data wensen te verkrijgen. Hiermee kunnen we bijgevolg ook de datacollectie gaan filteren op basis van locatie.

Er kan rechtstreeks gezoomd worden naar een locatie via de zoekbalk bovenaan of door het scrollen met de muis. Teken vervolgs een gewenste gebied in door gebruik te maken van de toolknoppen in de "Map View": .

In dit voorbeeld kiezen we voor de Konigin der badsteden, Oostende, als ons studiegebied:


Automatisch wordt een nieuwe variabele aangemaakt onder de naam 'geometry', welke eenvoudig hernoemd kan worden naar een eenvoudig te gebruiken variabelenaam:


Bekijk de eigenschappen van de polygoon door het naar de console te printen:

//Polygoon-informatie naar de console schrijven:
print(Oostende)

Inlezen en filteren van een ImageCollection

Voor deze oefening maken we als afwisseling gebruik van Landsat 9 beelden (zie ook het stukje omtrent de Earth Engine data catalog). De code om de Landsat 9 collectie te importeren kan gekopieerd worden uit de data catalog en ziet er als volgt uit:

var L9 = ee.ImageCollection("LANDSAT/LC09/C02/T1_L2")
print('Grootte van de L9-collectie :', L9.size())

Hiermee verwijst de variabele 'L9' naar de volledige Landsat-9 collectie (surface reflectance). De '.size()'-functie berekent het aantal beelden dat in deze collectie zijn begrepen. Een hele hoop, sinds de collectie alle L9-beelden van de volledige aarde omvat. Om hier verder mee te werken dient de verzameling bijgevolg gefilterd te worden tot ons interessegebied en tijdstip. Filteren kan op basis van de metadata:

//Filteren o.b.v. datum, locatie:
var L9 = L9.filterDate('2024-01-01', '2024-10-08') //Op basis van datum
           .filterBounds(Oostende) //op basis van locatie (de AOI);

//Printen van de nieuwe grootte
print('L9 size na filtering',L9.size())

// Printen van de collectie voor inspectie
print('Filtered collection: ', L9)

Herschaling van Landsat- 8/9 data

De Landsat Surface Reflectance dataset van Landsat 8/9 OLI is al atmosferisch gecorrigeerd, maar de data is nog niet geschaald naar een bereik van 0-1. Dit is bewust gedaan om de efficiëntie van data-opslag te optimaliseren. Om de data naar een 0-1-bereik te schalen, moet je eerst een herschalingsfunctie definiëren en toepassen. Uiteindelijk krijg je dan spectrale reflectiewaarden tussen 0 en 1 (100% reflectie) voor elke beschikbare band.

// Toepassen van schalingswaarden
function applyScaleFactors(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}

var L9 = L9.map(applyScaleFactors)

Deze functie applyScaleFactors selecteert de optische en thermische banden en past een schaalverhouding toe. Voor de optische banden wordt de waarde vermenigvuldigd met 0.0000275 en verlaagd met 0.2. Voor de thermische banden wordt een schaal van 0.00341802 toegepast en er wordt 149.0 bij opgeteld. Deze aangepaste banden worden vervolgens terug toegevoegd aan de oorspronkelijke afbeelding.

Sorteren van een ImageCollection

De beelden in de collectie zijn standaard gesorteerd op datum. Als we dus het eerste beeld uit de collectie halen, is dit het eerste Landsat-9 beeld uit 2024 van Oostende. Met de functie .first() halen we het oudste beeld uit de collectie. Print dit beeld naar de console en bekijk het verschil met de volledige ImageCollection.

// Krijg het eerste (standaard oudste) beeld uit de collectie:
var L9_first = L9.first()
print('Eerste Beeld:', L9_first)

Met javascript Map.addLayer() kunnen we dit beeld opnieuw als een kleurencomposiet visualiseren. Visualiseer als een ware kleurencomposiet (voor Landsat 9 betekent dit dus B2 (blauw), B3 (groen) en B4 (rood)). De bandnamen voor Landsat 9 Surface Reflectance (SR) beelden in google earth engine worden genoemd als SR_B*.

// Landsat 9 visualisatieparameters instellen (als dictionary) en Beeld visualiseren.
var trueColor = {
  bands: ['SR_B4', 'SR_B3', 'SR_B2'],  // Band4, Band 3 en Band2 selecteren
  min: 0,               // minimale reflectie
  max: 0.3,             // maximale visualisatiereflectie
};
Map.addLayer(L9_first, trueColor, 'L9_TrueColorComposite')


Eerste Landsat 9 beeld binnen de gefilterde collectie

Mogelijk is dit eerste beeld niet het meest ideale wat betreft de wolkbedekking, waardoor er weinig te zien valt. Laten we nu op zoek gaan naar het beeld met de laagste wolkenbedekking binnen de collectie. Dit doen we in eerste instantie door de collectie te sorteren volgens het percentage wolkbedekking,wat standaard is opgenomen in de metadata van elk Landsatbeeld.

//Sorteren van de collectie obv cloud cover
var L9_sortedCC = L9.sort('CLOUD_COVER',true);
Map.addLayer(L9_sortedCC.first(), trueColor, 'Least Cloud cover 2024')


Landsat 9 satellietbeeld met laagste wolkbedekking binnen de gefilterde collectie

Bekijk op welke dag de sensor dit beeld heeft genomen. Gebruik hiervoor de ‘inspector’ om de beeldeigenschappen verder te bekijken.


De inspector

Opdracht 2.1 - Valse kleurencomposiet voor Gent

Visualiseer in een nieuw script een valse kleurencomposiet (RGB = NIR - Rood - Groen) van een Sentinel-2 beeld (Tier 1, Harmonized Level-2A, Surface Reflectance). Gebruik Gent als ROI, en selecteer een beeld uit 2024 met de laagste wolkbedekking.

Voor het sorteren op wolkbedekking, zoek je de geschikte eigenschap op om te sorteren. Deze kun je hier vinden.

Bewaar je script.

Oplossing

GEE script: https://code.earthengine.google.com/3854f31a76d15f284f61b5aba7df54bb