Filter by Cloud

I am trying in my evalscript to filter scenes with higher than 20% cloud coverage

function preProcessScenes(collections) {
  collections.scenes.tiles = collections.scenes.tiles.filter(
      //(tile) => parseFloat(tile.cloudCoverage) < 20 ); //ALSO NOT WORKIGN
      (tile) => tile.cloudCoverage.search(20) <20);
  return collections;
}

No error for the code, but the result is not as expected.
I am aware of the slider for cloud coverage of a single date requested, but it seams that in more complex scripts, which require timespan the scenes are loaded all, no matter this percentage, that I can only specify for a single imagery).

Hi there,

There are 2 options for you to filter for cloud coverage by scenes:

  • either you specify the limit (e.g. 20% in your payload). Here is an example:
curl -X POST https://services.sentinel-hub.com/api/v1/process \
 -H 'Content-Type: application/json' \
 -H 'Authorization: Bearer <token>' \
 -d '{
  "input": {
    "bounds": {
      "bbox": [
        12.44693,
        41.870072,
        12.541001,
        41.917096
      ]
    },
    "data": [
      {
        "dataFilter": {
          "timeRange": {
            "from": "2024-05-12T00:00:00Z",
            "to": "2024-06-12T23:59:59Z"
          },
          "maxCloudCoverage": 20
        },
        "type": "sentinel-2-l2a"
      }
    ]
  },
  "output": {
    "width": 779.8034286939699,
    "height": 523.4687735062655,
    "responses": [
      {
        "identifier": "default",
        "format": {
          "type": "image/jpeg"
        }
      }
    ]
  },
  "evalscript": "//VERSION=3..."}"
}'
  • you filter in the Evalscript (but for this you need to set mosaicking to TILE)
function preProcessScenes(collections) {
  collections.scenes.tiles = collections.scenes.tiles.filter(function (tile) {
        return tile.cloudCoverage <= 20
    });
    return collections
}

See the content here: Evalscript V3

If you are not doing a pixel-based cloud filtering, I would push the cloud filtering to the payload for simplicity.

Thank you, Maxim,
The evalscript code works now! :smiling_face:

When I change the cloud threshold the result changes, which is good.

However, when I played with the numbers to verify that the threshold corresponds to the CLOUDY_PIXEL_PERCENTAGE from the metadata, I discovered they do not match. I tried with several images and it is the same - the numbers are not the same and I couldn’t figure out why.

So how can I be sure that my collection constitutes only scenes with cloud coverage less than particular percentage? I was thinking somehow to adjust this number (but it is not constant unfortunately from image to image)…