Skip to content

Sentinel-2 asset resolution

This CWL document takes an URL to a Sentinel-2 STAC Item and resolves the asset key provided as input parameter.

It relies on curl and jq to get the STAC Item and parse its JSON content.

CWL CommandLineTool

The CWL document contains a CommandLineTool element that invoques the command:

curl -s 'https://earth-search.aws.element84.com/v0/collections/sentinel-s2-l2a-cogs/items/S2B_53HPA_20210723_0_L2A' | jq '.assets.B8A.href' | tr -d '"'

The CWL document content is:

class: CommandLineTool

requirements:
  DockerRequirement: 
    dockerPull: terradue/jq
  ShellCommandRequirement: {}
  InlineJavascriptRequirement: {}

baseCommand: curl
arguments:
- -s
- valueFrom: ${ return inputs.stac_item; }
- "|"
- jq
- valueFrom: ${ return ".assets." + inputs.asset + ".href"; }
- "|"
- tr 
- -d
- '\"' #\""

stdout: message

inputs:
  stac_item:
    type: string
  asset:
    type: string

outputs:

  asset_href: 
    type: string
    outputBinding:
      glob: message
      loadContents: true
      outputEval: $( self[0].contents.split("\n").join("") )

cwlVersion: v1.0

CWL Workflow

The CommandLineTool above is now included in a single step Workflow:

$graph:
- class: Workflow
  label: Resolve STAC asset href
  doc: This workflow resolves a STAC asset href using its key 
  id: main

  inputs:
    stac_item:
      type: string
    asset:
      type: string

  outputs:
    asset_href:
      outputSource:
      - node_stac/asset_href
      type: string

  steps:

    node_stac:

      run: "#asset"

      in:
        stac_item: stac_item
        asset: asset

      out:
        - asset_href

- class: CommandLineTool
  id: asset

  requirements:
    DockerRequirement: 
      dockerPull: terradue/jq
    ShellCommandRequirement: {}
    InlineJavascriptRequirement: {}

  baseCommand: curl
  arguments:
  - -s
  - valueFrom: ${ return inputs.stac_item; }
  - "|"
  - jq
  - valueFrom: ${ return ".assets." + inputs.asset + ".href"; }
  - "|"
  - tr 
  - -d
  - '\"' #\""

  stdout: message

  inputs:
    stac_item:
      type: string
    asset:
      type: string

  outputs:

    asset_href: 
      type: string
      outputBinding:
        glob: message
        loadContents: true
        outputEval: $( self[0].contents.split("\n").join("") )

cwlVersion: v1.0

Execution

It may be run with the parameters:

stac_item: "https://earth-search.aws.element84.com/v0/collections/sentinel-s2-l2a-cogs/items/S2B_53HPA_20210723_0_L2A"
asset: "B8A"

And:

cwltool asset.cwl asset.yml

The execution will generate:

INFO /srv/conda/bin/cwltool 3.0.20210319143721
INFO Resolved 'asset.cwl' to 'file:///home/fbrito/work/stac/sentinel-2-asset-resolution/asset.cwl'
INFO [workflow ] start
INFO [workflow ] starting step node_stac
INFO [step node_stac] start
INFO [job node_stac] /tmp/baqarwll$ docker \
    run \
    -i \
    --mount=type=bind,source=/tmp/baqarwll,target=/mvOEKM \
    --mount=type=bind,source=/tmp/hc2s_c5k,target=/tmp \
    --workdir=/mvOEKM \
    --read-only=true \
    --log-driver=none \
    --user=1000:1000 \
    --rm \
    --env=TMPDIR=/tmp \
    --env=HOME=/mvOEKM \
    --cidfile=/tmp/quxi1nlw/20210803134014-592685.cid \
    terradue/jq \
    /bin/sh \
    -c \
    'curl' '-s' 'https://earth-search.aws.element84.com/v0/collections/sentinel-s2-l2a-cogs/items/S2B_53HPA_20210723_0_L2A' | 'jq' '.assets.B8A.href' | 'tr' '-d' \" > /tmp/baqarwll/message
INFO [job node_stac] Max memory used: 0MiB
INFO [job node_stac] completed success
INFO [step node_stac] completed success
INFO [workflow ] completed success
{
    "asset_href": "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/53/H/PA/2021/7/S2B_53HPA_20210723_0_L2A/B8A.tif"
}
INFO Final process status is success