Processing units per minute are insufficient

  • 26 April 2024
  • 2 replies
  • 0 views

In our application, we use Sentinel-Hub to fetch historical satellite data (since 2018) for the purpose of analyzing agricultural fields. We fetch the data gradually (month by month instead of a few years at once) for the purpose of handling errors and better user experience (users can observe the ongoing process). Unfortunately, this approach sends too many requests – even the most expensive plan, which offers 1200 requests per minute could potentially be insufficient if we needed to download data about dozens/hundreds fields simultaneously.

Is there any way in which we could reduce the number of requests in our specific case? Alternatively, is there a possibility to increase the request limit?

Below, you’ll find code snippets, which aim to offer a clearer insight into our strategies.

In our app we are using library sentinelhub-js (GitHub - sentinel-hub/sentinelhub-js: Download and process satellite imagery in JavaScript or TypeScript using Sentinel Hub services.) to fetch data from Sentinel Hub. Basically we have 2 fetches per month of satellite data. The goal of the first one is to get available dates and then the second one download - tiff buffer containing data for every day in the month. After that we are processing the data.

Fetch getting dates for the whole month:

let layer = new S2L2ALayer({
            instanceId: process.env.INSTANCE_ID,
            layerId: "CLOUDINESS",
        });

const datesLayer = await layer.findDatesUTC(
            bbox,
            new Date(Date.UTC(time.getUTCFullYear(), time.getUTCMonth(), 1, 0, 0, 0)),
            new Date(Date.UTC(time.getUTCFullYear(), time.getUTCMonth(), time.getUTCDate(), 23, 59,59))
        );

“CLOUDINESS” evalscript:

//VERSION=3

function evaluatePixel(samples) {
    switch (samples.SCL) {
      // Cloud high probability
      case 7:
      case 8:
      case 9:
      case 10:
      case 11:
        return {
          default: [1], 
          dataMask: [samples.dataMask]
        };  
      default:
        return {
          default: [0], 
          dataMask: [samples.dataMask]
        };  
    } 
}

function setup() {
  return {
    input: [{
      bands: [
        "SCL",
        "dataMask"
      ]
    }],
    output: [
      {
      	id: "default",
        bands: 1,
      },
      {
      	id: "dataMask",
        bands: 1
      }
    ]
  }
}

Fetch downloading tiff buffer(with data for every day in the months)

const rawDataLayer = new S2L2ALayer({
        instanceId: process.env.INSTANCE_ID,
        layerId: "TRUE-COLOR-S2L2A",
        evalscript: rawDataEvalscript(dates),
        mosaickingOrder: MosaickingOrder.LEAST_RECENT,
    });

const getMapParams = createGetMapParams(dates, fieldData);
let imageBlob = await rawDataLayer.getMap(getMapParams, ApiType.WMS);

rawDataEvalscript(dates)

const BANDS_COUNT = 7;

export const rawDataEvalscript = (dates: Date[]) => {
    const datesCount = dates.length;
    const bandsCount = BANDS_COUNT * datesCount;

    return `
    //VERSION=3

    function setup() {
        return {
            input: ["B08", "B04", "B03", "B02", "dataMask", "SCL", "CLM"],
            output: [
                {
                    id: "default",
                    bands: ${bandsCount},
                    sampleType: "UINT8"
                },
            ],
            mosaicking: "ORBIT"
        };
    }
    
    const dates = [${dates.map((date) => `"${date.toISOString().split("T")[0]}"`).join(", ")}];
    
    function evaluatePixel(samples, scenes) {
        let data = []
        let x = 14;
        let length = samples.length
        for (let i = 0; i < samples.length; i++) {
            const date = scenes.orbits[i].dateFrom.split("T")[0]
            if (!dates.includes(date)) continue;
            data.push(samples[i].B08 * 255)
            data.push(samples[i].B04 * 255)
            data.push(samples[i].B03 * 255)
            data.push(samples[i].B02 * 255)
            data.push(samples[i].dataMask * 255)
            data.push(samples[i].SCL)
            data.push(samples[i].CLM)
            
        }
        
        return data
    }
`;
};

2 replies

Dear @nirby-solutions,
we can prepare a custom offer with higher througput.
Do please send us an e-mail to info AT sentinel-hub.com, describing your needs (i.e. requests per minute, requests per month, processing units volume, etc.) and we will prepare a custom quote.

As a side note, be aware that Exploration plan does not allow for commercial use. Therefore, if you are using our services commercially, one should have at least Basic option.

Best,
Grega

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.

Reply