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

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)

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.

1 Like

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