Error retrieving statistics api!

Hello my friend! I am trying to retrieve data from statistical api since last week with no success. The error is 400, bad request. I am using firebase cloud functions with javascript. My code is below:

exports.getClearDates = functions.https.onRequest(async (req, res) => {
const client_id = ‘xxx’;
const client_secret = ‘xxx’;
const time_range = ‘2023-01-01/2023-01-30’;

const geometry = {
  "type": "Polygon",
  "coordinates": [
    [
      [-105.021443, 39.578057],
      [-105.021443, 39.618057],
      [-105.041443, 39.618057],
      [-105.041443, 39.578057]
    ]
  ]
};

const tokenConfig = {
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
  }
};

const tokenBody = qs.stringify({
  client_id,
  client_secret,
  grant_type: "client_credentials"
});

let access_token;
try {
  const tokenResponse = await axios.post("https://services.sentinel-hub.com/oauth/token", tokenBody, tokenConfig);
  access_token = tokenResponse.data.access_token;
} catch (error) {
  console.error('Erro ao obter token de acesso:', error);
  return res.status(500).send('Erro ao obter token de acesso');
}

const evalscript = `
  //VERSION=3
  function setup() {
    return {
      input: ["CLM"],
      output: { bands: 1 }
    };
  }
  function evaluatePixel(sample) {
    return [sample.CLM * 255];
  }
`;

const statsRequest = {
  input: {
    bounds: {
      geometry: geometry
    },
    properties: {
        "crs": "http://www.opengis.net/def/crs/EPSG/0/32633"
        },
    data: [{
      type: "sentinel-2-l2a",
    }]
  },
  aggregation: {
    timeRange: {
        from: time_range.split('/')[0] + "T00:00:00Z",
        to: time_range.split('/')[1] + "T23:59:59Z"
      },
    evalscript: evalscript,
    aggregationInterval: {
      of: "P1D"
    }
  }
};

try {
  const response = await axios.post(
    `https://services.sentinel-hub.com/api/v1/statistics`,
    statsRequest,
    {
      headers: {
        'Authorization': `Bearer ${access_token}`,
        'Content-Type': 'application/json', // Corrigido para application/json
        'Accept': 'application/json'
      }
    }
  );

  const clearDates = response.data.data
    .filter(item => item.outputs.default.bands.B0.stats.mean === 0)
    .map(item => item.interval.from);

  res.status(200).send({ clear_dates: clearDates });
} catch (error) {
  console.error('Erro ao buscar dados estatísticos:', error);
  res.status(500).send('Erro ao buscar dados estatísticos');
}

});

Can you take a look and see if there is a mistake?

Thanks so much!

Oswaldo.

Now I get 500 Internal Server Error no matter what I do…

Hi @ofgnxx ,

At the first glance I noticed that your geometry was in lon/lat, but in the same request you specified the crs as UTM. The geometry, on the other hand, was not valid as it was missing the last point to create a polygon. Please see the example below:

{
  "type": "Polygon",
  "coordinates": [
    [
      [
        -105.021443,
        39.578057
      ],
      [
        -105.021443,
        39.618057
      ],
      [
        -105.041443,
        39.618057
      ],
      [
        -105.041443,
        39.578057
      ],
      [
        -105.021443,
        39.578057
      ]
    ]
  ]
}

Note that there are some special rules for building Evalscripts with Statistics API. You always need to include dataMask as one of the output. Please see the example requests of Statistical APIs.

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