Skip to main content

Trying to get data from multiple tiles in process API as bands of an output file

  • April 17, 2024
  • 2 replies
  • 0 views

Hi there,

Im trying to download all scenes ( only one band) from all tiles in a given time range using Process API’s updateOutput function.

But getting 400 error with text: {“error”:{“status”:400,“reason”:“Bad Request”,“message”:“Script must return an array.”,“code”:“RENDERER_EXCEPTION”}}

This is my code and eval script. I have used proper credentials.

################
## Process API Sentinel Hub Eval Script
################

import tarfile, json

headers_request = {
    "Authorization" : "Bearer %s" %token['access_token']
}

url = 'https://services.sentinel-hub.com'


evalscript1 = """
//VERSION=3
function setup() {
    return {
        input: [{
                bands: ["B02"],
            }
        ],
        output: [{
                id: "my_output",
                bands: 1,
                sampleType: SampleType.UINT16
            }
        ],
        mosaicking: Mosaicking.TILES
    }
}

function updateOutput(output, collection) {
    output.my_output.bands = collection.scenes.length
}

function evaluatePixel(samples) {
    var n_scenes = samples.length
    let band_b02 = new Array(n_scenes)

    // Arrange values of band B02 in an array
    for (var i = 0; i < n_scenes; i++){
        band_b02[i] = samples[i].B02
    }

    return {
        my_output: band_b02
    }
}
"""

request = {
  "input": {
    "bounds": {
      "bbox": [-120.75466522455825, 36.90698113780987, -119.47746085616488, 37.925581320606206]
    },
    "data": [{
      "type": "sentinel-2-l2a",
      "dataFilter": {
        "timeRange": {
          "from": "2023-03-07T18:00:02Z",
          "to": "2023-04-07T20:54:02Z"
        }
      }
    }]
  },
  "output": {
    "responses": [{
        "identifier": "my_output",
        "format": {
          "type": "image/tiff"
        }
      }
    ]
  },
  "evalscript": evalscript1
}

headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/x-tar'
}

response = oauth.post(f"{url}/api/v1/process", headers=headers, json = request)
print(f"status code is:{response.status_code}, context: {response.text}")
tar = tarfile.open(fileobj=io.BytesIO(response.content))
# userdata = json.load(tar.extractfile(tar.getmember('userdata.json')))
# userdata

output_dir = 'content/testdata'

# Extract the contents of the tar file to the output directory
tar.extractall(output_dir)

2 replies

Hi,

The error message is indeed confusing: the reason you are getting an error is because you wrote mosaicking: Mosaicking.TILES instead of mosaicking: Mosaicking.TILE. If you correct that line, your code will work.

In addition, be careful with the sampleType: you have set it to UINT16 but are returning float values. The returned arrays will contain 0, 1 or 2 values. You can either multiply your output values by 65535 (see my blog post) or switch the output to FLOAT32.


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