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
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP