EO application API Workflow
The EOAP API Workflow chains together three main steps — discovery
, prepare-execute-request
, and processes
— to query a STAC API, prepare an OGC API Processes execution request, and finally run the requested process.
It takes the following input parameters:
- a STAC API endpoint
- a STAC search request (query parameters)
- a Processes API endpoint
- an execution request template for OGC API Processes
And produces as outputs:
- the results of the STAC search (search results as a JSON file)
- the process execution result (OGC API Process output as a JSON file)
graph TB
A[STAC API Endpoint] --> B(("Discovery Step"))
P[Search Request] --> B
B --> C1[Search Results]
C1 --> C2["<font size=2% color='blue'>discovery-output.json</font>"]
C2 --> D(("Prepare Execute Request"))
D --> D2["<pre style='text-align:left; color:black;'>
execute_request.json:
{
inputs:
- stac_items
- aoi
- bands
- epsg
}
</pre>"]
D --> D3[process_id.json]
D2 --> E(("Processes Step"))
D3 --> E
R[Processes API Endpoint] --> E
E --> F[Workflow Output]
C2 -->F
F --> I["<font size=2% color='green'>feature-collection.json</font>"]
F --> G["<font size=2% color='gray'>discovery-output.json</font>"]
subgraph EOAP Workflow
B
C1
C2
D
D2
D3
E
end
Workflow Steps
-
Discovery Step
Uses the provided stac_api_endpoint
and search_request
to query a STAC API. The result is saved as search_output
.
- Output:
discovery-output.json
— This JSON file contains the results from discovering the STAC endpoint. It is generated using stac-api-client.0.1.0.cwl
.
-
Prepare Execute Request Step
Combines the initial execute_request
template with the search_output
from the discovery step.
-
Extracts STAC item URLs from the search results.
- Inserts them into the
.inputs.stac_items
field of the execution request.
- Removes the
process_id
from the request and stores it separately.
-
Outputs:
execute_request.json
— the updated request ready to be sent.
process_id.json
— the process identifier.
-
Processes Step
Executes the OGC API Process using the processes_api_endpoint
, the prepared execute_request.json
, and the process_id
. The result is stored in feature-collection.json
.
The CWL Workflow is shown below and the lines highlighted chain the steps:
eoap-api-cli.cwl |
---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193 | #!/usr/bin/env cwl-runner
$graph:
- class: Workflow
id: eoap-api
label: EOAP API Workflow
requirements:
- class: InlineJavascriptRequirement
- class: SchemaDefRequirement
types:
- $import: https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml
- $import: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml
- $import: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml
- $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml
- $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml
- class: NetworkAccess
networkAccess: true
inputs:
- id: stac_api_endpoint
type: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
- id: search_request
type: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings
- id: processes_api_endpoint
type: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
- id: execute_request
type: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml#OGCExecuteProcessSettings
outputs:
- id: search_output
outputSource:
- discovery/search_output
type: File
- id: process_output
outputSource:
- processes/process_output
type: File
steps:
discovery:
label: Discovery Step
in:
api_endpoint: stac_api_endpoint
search_request: search_request
run: https://github.com/eoap/schemas/releases/download/0.1.0/stac-api-client.0.1.0.cwl
out:
- search_output
prepare-execute-request:
label: Prepare Execute Request
in:
in_execute_request: execute_request
search_results:
source: discovery/search_output
run: '#prepare-execute-request'
out:
- execute_request
- process_id
processes:
label: Processes Step
in:
api_endpoint: processes_api_endpoint
execute_request:
source: prepare-execute-request/execute_request
process_id:
source: prepare-execute-request/process_id
run: '#ogc-api-processes-client'
out:
- process_output
- class: CommandLineTool
id: prepare-execute-request
label: Prepare Execute Request
doc: Prepare the execute request for OGC API Processes based on search results
baseCommand: ["/bin/bash", "run.sh"]
arguments: []
requirements:
- class: InlineJavascriptRequirement
- class: SchemaDefRequirement
types:
- $import: https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml
- $import: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml
- $import: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml
- $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml
- class: NetworkAccess
networkAccess: true
- class: InitialWorkDirRequirement
listing:
- entryname: input_execute_request.json
entry: |-
${ return JSON.stringify(inputs.in_execute_request, null, 2); }
- entryname: process_id.json
entry: |-
${ return JSON.stringify(inputs.in_execute_request.process_id, null, 2); }
- entryname: run.sh
entry: |-
#!/usr/bin/env bash
set -x
set -euo pipefail
jq '[.features[].links[] | select(.rel=="self") | .href]' "$(inputs.search_results.path)" > stac_items.json
jq --argjson stac_items "`cat stac_items.json`" \
'del(.process_id) | .inputs.stac_items = $stac_items' \
input_execute_request.json > execute_request.json
cat execute_request.json | jq .
inputs:
in_execute_request:
label: OGC API Processes settings
doc: OGC API Processes settings for Landsat-9 data
type: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml#OGCExecuteProcessSettings
search_results:
label: Search Results
doc: Search results from the discovery step
type: File
outputs:
execute_request:
type: File
outputBinding:
glob: execute_request.json
process_id:
type: Any
outputBinding:
glob: process_id.json
loadContents: true
outputEval: ${ return JSON.parse(self[0].contents); }
- class: CommandLineTool
id: ogc-api-processes-client
label: geo API - Processes
requirements:
- class: InlineJavascriptRequirement
- class: DockerRequirement
dockerPull: localhost/ogc
- class: SchemaDefRequirement
types:
- $import: https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml
- $import: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml
- $import: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml
- $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml
inputs:
api_endpoint:
label: OGC API endpoint
doc: OGC API endpoint for Landsat-9 data
type: |-
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
execute_request:
label: OGC API Processes settings
doc: OGC API Processes settings for Landsat-9 data
type: File
process_id:
label: Process ID
doc: Process ID for the OGC API Processes
type: Any
outputs:
process_output:
type: File
outputBinding:
glob: feature-collection.json
baseCommand: ["ogc-api-processes-client"]
arguments:
- --api-endpoint
- $(inputs.api_endpoint.url.value)
- --process-id
- $(inputs.process_id)
- --execute-request
- $(inputs.execute_request.path)
- --output
- feature-collection.json
cwlVersion: v1.2
|