Interpolation von Vektordaten in Rasterdaten

Bei der Interpolation von Vektor- zu Rasterdaten in Earth Engine wird ein Image aus einem FeatureCollection erstellt. Insbesondere verwendet Earth Engine numerische Daten, die in einem Attribut der Features gespeichert sind, um Werte an neuen Orten außerhalb der Features zu interpolieren. Die Interpolation führt zu einem kontinuierlichen Image aus interpolierten Werten bis zur angegebenen Entfernung.

gewichtete Interpolation inverser Entfernung

Die Funktion „Inverse Distanzgewichtung“ (IDW) in Earth Engine basiert auf der von Basso et al. (1999) beschriebenen Methode. Ein zusätzlicher Steuerparameter wird in Form eines Abnahmefaktors (gamma) auf die inverse Entfernung angewendet. Weitere Parameter sind der Mittelwert und die Standardabweichung der zu interpolierenden Property sowie die maximale Entfernung, über die interpoliert werden soll. Im folgenden Beispiel wird eine interpolierte Oberfläche der Methankonzentration erstellt, um räumliche Lücken im ursprünglichen Rasterdatensatz zu schließen. Die FeatureCollection wird durch die Stichprobenerhebung eines zweiwöchigen Methan-Mittelwerts generiert.

// Import two weeks of S5P methane and composite by mean.
var ch4 = ee.ImageCollection('COPERNICUS/S5P/OFFL/L3_CH4')
  .select('CH4_column_volume_mixing_ratio_dry_air')
  .filterDate('2019-08-01', '2019-08-15')
  .mean()
  .rename('ch4');

// Define an area to perform interpolation over.
var aoi =
  ee.Geometry.Polygon(
    [[[-95.68487605978851, 43.09844605027055],
       [-95.68487605978851, 37.39358590079781],
       [-87.96148738791351, 37.39358590079781],
       [-87.96148738791351, 43.09844605027055]]], null, false);

// Sample the methane composite to generate a FeatureCollection.
var samples = ch4.addBands(ee.Image.pixelLonLat())
  .sample({region: aoi, numPixels: 1500,
    scale:1000, projection: 'EPSG:4326'})
  .map(function(sample) {
    var lat = sample.get('latitude');
    var lon = sample.get('longitude');
    var ch4 = sample.get('ch4');
    return ee.Feature(ee.Geometry.Point([lon, lat]), {ch4: ch4});
  });

// Combine mean and standard deviation reducers for efficiency.
var combinedReducer = ee.Reducer.mean().combine({
  reducer2: ee.Reducer.stdDev(),
  sharedInputs: true});

// Estimate global mean and standard deviation from the points.
var stats = samples.reduceColumns({
  reducer: combinedReducer,
  selectors: ['ch4']});

// Do the interpolation, valid to 70 kilometers.
var interpolated = samples.inverseDistance({
  range: 7e4,
  propertyName: 'ch4',
  mean: stats.get('mean'),
  stdDev: stats.get('stdDev'),
  gamma: 0.3});

// Define visualization arguments.
var band_viz = {
  min: 1800,
  max: 1900,
  palette: ['0D0887', '5B02A3', '9A179B', 'CB4678',
            'EB7852', 'FBB32F', 'F0F921']};

// Display to map.
Map.centerObject(aoi, 7);
Map.addLayer(ch4, band_viz, 'CH4');
Map.addLayer(interpolated, band_viz, 'CH4 Interpolated');

Wie durch den Parameter range angegeben, erfolgt die Interpolation nur bis zu 70 Kilometer von der nächsten Messstation entfernt.

Kriging

Kriging ist eine Interpolationsmethode, bei der eine modellierte Schätzung der Semivarianz verwendet wird, um ein Bild mit interpolierten Werten zu erstellen, das eine optimale Kombination der Werte an bekannten Orten darstellt. Für die Kriging-Schätzung sind Parameter erforderlich, die die Form eines Semivariogramms beschreiben, das an die bekannten Datenpunkte angepasst ist. Diese Parameter sind in Abbildung 1 dargestellt.

Variogramm
Abbildung 1. Die Parameter nugget, sill und range in einer idealisierten Variogrammfunktion.

Im folgenden Beispiel wird ein Bild der Meeresoberflächentemperatur (SST) an zufälligen Stellen abgetastet und dann die SST aus dem Sample mithilfe von Kriging interpoliert:

// Load an image of sea surface temperature (SST).
var sst = ee.Image('NOAA/AVHRR_Pathfinder_V52_L3/20120802025048')
  .select('sea_surface_temperature')
  .rename('sst')
  .divide(100);

// Define a geometry in which to sample points
var geometry = ee.Geometry.Rectangle([-65.60, 31.75, -52.18, 43.12]);

// Sample the SST image at 1000 random locations.
var samples = sst.addBands(ee.Image.pixelLonLat())
  .sample({region: geometry, numPixels: 1000})
  .map(function(sample) {
    var lat = sample.get('latitude');
    var lon = sample.get('longitude');
    var sst = sample.get('sst');
    return ee.Feature(ee.Geometry.Point([lon, lat]), {sst: sst});
  });

// Interpolate SST from the sampled points.
var interpolated = samples.kriging({
  propertyName: 'sst',
  shape: 'exponential',
  range: 100 * 1000,
  sill: 1.0,
  nugget: 0.1,
  maxDistance: 100 * 1000,
  reducer: 'mean',
});

var colors = ['00007F', '0000FF', '0074FF',
              '0DFFEA', '8CFF41', 'FFDD00',
              'FF3700', 'C30000', '790000'];
var vis = {min:-3, max:40, palette: colors};

Map.setCenter(-60.029, 36.457, 5);
Map.addLayer(interpolated, vis, 'Interpolated');
Map.addLayer(sst, vis, 'Raw SST');
Map.addLayer(samples, {}, 'Samples', false);

Die Größe des Radius, in dem die Interpolation durchgeführt werden soll, wird durch den Parameter maxDistance angegeben. Größere Größen führen zu einer flüssigeren Ausgabe, aber zu langsameren Berechnungen.