TransWikia.com

Sentinel-1 missing data gap in adjacent acquisitions

Geographic Information Systems Asked by ThrushJacket on April 16, 2021

Some months ago I posted Export each image from a collection in Google Earth Engine about exporting Sentinel 1 scenes from a collection and was successful with help from Rodrigo Principe.

I now have a new region of interest, which sits on the overlap between 2 scene footprints (sequential images in descending orbit). When I make a mosaic of the 2 scenes I get a small no data gap and lack of alignment between the 2 images:

// Create a geometry representing an export region.
var roi = ee.Geometry.Rectangle([-62.67, -8.31, -63.25, -8.85]);
var zoomPoint = ee.Geometry.Point([-62.35, -8.06])

// Load the Sentinel-1 ImageCollection.
var sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterBounds(roi);


// Filter by metadata properties.
var IW_H = sentinel1

// Filter to get images with VV and VH dual polarization.
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))

// Filter to get images collected in interferometric wide swath mode.
.filter(ee.Filter.eq('instrumentMode', 'IW'))

// Filter IWs to get High res.
.filter(ee.Filter.eq('resolution', 'H'))

// Filter IW-Highs to get 10m res
.filter(ee.Filter.eq('resolution_meters', 10));

// Filter to get images from different look angles
var col_desc = IW_H.filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));

// Spatially mosaic the images in the collection and display
var col = col_desc.mosaic();
var colVV = col.select(0)
Map.addLayer(colVV, {min:-17, max:-3}, "VV");
Map.centerObject(zoomPoint, 20);

What am I missing? Are these scenes not acquired sequentially?
https://code.earthengine.google.com/ca7a4b585f1600b771a2de07c8e75792

3 Answers

A more recent version of this question has been answered here: Sentinel-1 missing data gaps between two images GEE

To quote that answer:

Guido Lemoine gave a clear answer on your developer forum thread:

Yes, this is due to the terrain correction step. Original GRD scenes are contiguous, and broken up at the 25 second slices (for IW), see the image timestamps. The last line of slice N is exactly adjacent to the first of N+1.

Terrain correction is a bit tight on sampling at scene boundaries, which often causes a 1 pixel gap.

This would be solvable if you would first do slice assembly in s1tbx and then TC the assembled orbit strips. This takes loads of memory, however, esp. since s1tbx is not very efficient in memory management. SAR is just a series of time samples in range arranged in azimuth, the "scene" concept is actually somewhat old fashioned, inherited from "GIS" concepts.

But given that 80% of the GEE crowd seems to be still concerned with downloading "scenes", it's probably not a good idea to create mega-size assembled orbit strips.

https://groups.google.com/d/msg/google-earth-engine-developers/9qdJ9IUFdWE/vmof4jB4AAAJ

Correct answer by ThrushJacket on April 16, 2021

If I understood correctly, you don't need ExportCol function because you want to download just 1 image (the mosaic). Try this:

// Create a geometry representing an export region.
var roi = ee.Geometry.Rectangle([-62.67, -8.31, -63.25, -8.85]);

// Load the Sentinel-1 ImageCollection.
var sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterBounds(roi);

// Filter by metadata properties.
var IW_H = sentinel1

// Filter to get images with VV and VH dual polarization.
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))

// Filter to get images collected in interferometric wide swath mode.
.filter(ee.Filter.eq('instrumentMode', 'IW'))

// Filter IWs to get High res.
.filter(ee.Filter.eq('resolution', 'H'))

// Filter IW-Highs to get 10m res
.filter(ee.Filter.eq('resolution_meters', 10));

// Filter to get images from different look angles
var col_desc = IW_H.filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));

// Sort in descending order (latest first)
var desc = col_desc.sort("system:time_start", false)

// Mosaic
var mosaic = ee.Image(desc.mosaic())

// Check if it is what you need..
Map.addLayer(mosaic,{}, "mosaic")

// Export
var task = Export.image.toDrive({
  image: mosaic,
  region: roi.getInfo()["coordinates"],
  scale: 10,
  description:'COMPLETE', 
  folder: 'COMPLETE', 
  fileNamePrefix: 'COMPLETE',
  maxPixels: 1e13
})

Answered by Rodrigo E. Principe on April 16, 2021

How about trying the blend() function. It seems to work in case the mosaic doesn't do the job. As GEE docs say:

blend(top) overlays one image on top of another. The images are blended together using the masks as opacity. If either of images has only 1 band, it is replicated to match the number of bands in the other image.

Hope that helps

Answered by shahryar on April 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP