adugnag / gee_s1_ard

Creates an analysis ready sentinel-1 SAR image collection in Google Earth Engine by applying additional border noise correction, speckle filtering and radiometric terrain normalization.
MIT License
233 stars 83 forks source link

Exclusion of Scenes only containing VV polarization #23

Closed sberndtJPL closed 1 month ago

sberndtJPL commented 1 month ago

Greetings,

I am utilizing your python API to create a S1 ARD over the US West Coast.

As a test case, I will limit the study period to be 01/01/2015 - 02/01/2015 with the Polarization configuration set to "VV"

Using ASF Vertex&zoom=5.467&center=-119.433,35.204&start=2015-01-01T08:00:00Z&end=2015-02-02T07:59:59Z&productTypes=GRD_HD,GRD_HS&beamModes=IW&polarizations=VV%2BVH,VV,Dual%20VH,Dual%20VV&resultsLoaded=true&granule=S1A_IW_GRDH_1SSV_20150131T020211_20150131T020236_004409_005638_DF41-GRD_HS), I can see that there exists 75 files over the study area for this study period.

However, when I run your API with the same constraints it comes back with the following message, indicating 0 results:

Number of images in collection:  0
Additional border noise correction is completed
Multi-temporal speckle filtering is completed
Radiometric terrain normalization is completed

I noticed the wrapper.py script automatically filters the dataset based on the VH polarization, regardless of the provided configuration input for POLARIZATION. What I'm not sure about is why (e.g. is this a requirement to do the processing?).

See below:

https://github.com/adugnag/gee_s1_ard/blob/42814d95ace58e50640e4b0a4139c3373e43de18/python-api/wrapper.py#L136

Note, this is similarly an issue for the javascript version as well: https://github.com/adugnag/gee_s1_ard/blob/42814d95ace58e50640e4b0a4139c3373e43de18/javascript/wrapper.js#L79

If I update this filter option in L136 of wrapper.py to rather be: .filter(ee.Filter.listContains('transmitterReceiverPolarisation', POLARIZATION))\

and keep the polarization configuration set to "VV"

I get a more appropriate response of Number of images in collection: 79 Additional border noise correction is completed Multi-temporal speckle filtering is completed Radiometric terrain normalization is completed

Note that the results differ by 4 when compared to ASF. Without digging, I would attribute this to the datasets not being the same, or one of the bounds are inclusive/exclusive. That's outside the scope of this issue.

That said, I believe this to be a bug given the following quote from your manuscript:

Data can be selected in single polarization i.e., ′𝑉𝐻′ or ′𝑉𝑉′ or dual polarization mode i.e., ′𝑉𝑉′ and ′𝑉𝐻′

This bug is solvable as described above. PR incoming...

sberndtJPL commented 1 month ago

Unable to push a commit; please see fix therein.

adugnag commented 1 month ago

Hello, thank you for bringing this to my attention. The code was initially written to consider only dual-pol configurations (hence the filter .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH')), as the 'VH' polarization doesn't exist as a standalone single-pol data. So users were able to select 'VV', 'VH', and 'VV+VH' polarizations from the available dual-pol datasets.

To accommodate users who use single-pol, i.e. 'VV' data, I have modified the wrapper script in both the JavaScript and Python codes to separate these cases.


var s1 = ee.ImageCollection('COPERNICUS/S1_GRD_FLOAT')
      .filter(ee.Filter.eq('instrumentMode', 'IW'))
      .filter(ee.Filter.eq('resolution_meters', 10))
      .filterDate(params.START_DATE, params.STOP_DATE)
      .filterBounds(params.GEOMETRY);

if (params.POLARIZATION == 'VV') {
    s1 = s1.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'));
} else {
    s1 = s1.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'));
}